← Torna al blog

Come estrarre $UsnJrnl:$J da un'immagine disco (o da un sistema attivo)

Guida pratica per estrarre il journal USN di NTFS da un'immagine forense, da un volume montato o da un host Windows attivo — con FTK Imager, X-Ways, The Sleuth Kit, fsutil e PowerShell.

4 min di lettura

La parte più difficile, lavorando col journal USN, spesso non è il parsing — è metterci sopra le mani. $UsnJrnl:$J è un flusso di dati alternativo, non un file normale: non compare in Esplora risorse e non sopravvive a un copy ingenuo. Questo articolo passa in rassegna i modi realistici di estrarlo nei tre contesti in cui lo si incontra: un'immagine forense, un volume montato e una macchina attiva.

Cosa stai cercando

Il journal vive al percorso:

\$Extend\$UsnJrnl:$J

$Extend è una directory di metadati NTFS nascosta, e $J è uno dei due flussi alternativi del file di metadati $UsnJrnl (l'altro, $Max, contiene solo metadati di dimensione). Microsoft documenta il layout nella reference interna NTFS e nella struttura USN_RECORD_V2.

Un $J reale è tipicamente da 30 MB a diversi GB, a seconda di come è stato configurato fsutil usn.

Da un'immagine forense (E01, dd, AFF4)

È il caso più frequente in DFIR.

FTK Imager (gratuito, GUI)

  1. Aprire l'immagine (File → Add Evidence Item).
  2. Navigare in [root]/$Extend/$UsnJrnl.
  3. Tasto destro sul flusso $JExport Files.

FTK Imager tratta i flussi alternativi come voci di prima classe — appaiono come righe fratello accanto al file. Assicurarsi di selezionare specificamente la riga $J (non $Max).

X-Ways Forensics (commerciale)

X-Ways espone lo stesso percorso. Nell'albero delle directory, espandere Root directory → $Extend → $UsnJrnl, selezionare il flusso $J e fare Recover/Copy.

The Sleuth Kit (gratuito, CLI, multipiattaforma)

È quello a cui ricorrono molti analisti su Mac/Linux. Lo strumento rilevante è icat da TSK:

# Trovare la entry MFT di $UsnJrnl
fls -r -p image.dd | grep '\$UsnJrnl'
# Supponiamo inode 81 e flusso $J in attributo 128-2:
icat image.dd 81-128-2 > UsnJrnl-J.bin

La tripla <inode>-<type>-<id> è il modo in cui TSK indirizza i flussi alternativi. Il type/id richiesto è quello il cui nome attributo finisce in :$Jfls lo mostra nell'output lungo.

Velociraptor / KAPE

Per raccolte di triage ampie, l'artefatto Windows.NTFS.MFT di Velociraptor e KAPE sanno tirare giù il journal automaticamente. KAPE usa target (!ALL o USNJournal); Velociraptor usa il plugin parse_ntfs.

Da un volume montato

Se l'immagine è montata (in sola lettura, via mount -t ntfs-3g o Arsenal Image Mounter su Windows), il percorso appare come un file ordinario, ma la maggior parte degli strumenti rifiuta di leggere i flussi alternativi in modo trasparente.

Su Linux con ntfs-3g, si può leggere il flusso direttamente:

sudo cat '/mnt/image/$Extend/$UsnJrnl:$J' > UsnJrnl-J.bin

A seconda dell'opzione di mount streams_interface, :$J può apparire come componente di percorso separato anziché come suffisso — verificare con ls -la /mnt/image/\$Extend/.

Da un host Windows attivo

Servono privilegi amministrativi e un lettore NTFS-aware, perché Windows blocca l'accesso ordinario ai file di metadati.

PowerShell con lettura raw del volume

Gli strumenti di Eric Zimmerman includono RawCopy.exe (o RawCopy64.exe), che bypassa l'API file standard:

RawCopy.exe /FileNamePath:"C:\$Extend\$UsnJrnl:$J" /OutputPath:"D:\Out"

Se non puoi depositare binari, PowerForensics fa lo stesso in puro PowerShell:

Import-Module PowerForensics
Get-ForensicFileRecord -Path 'C:\$Extend\$UsnJrnl' |
  ForEach-Object { $_.GetContent() } |
  Set-Content -Path 'C:\Out\UsnJrnl-J.bin' -Encoding Byte

fsutil nativo

fsutil usn è la superficie di controllo supportata per il journal ma non è uno strumento di estrazione — sa leggere, interrogare e cancellare record, non stremare l'intero blob $J. È utile per verificare che il journal sia abilitato e dimensionato correttamente prima dell'estrazione:

fsutil usn queryjournal C:

Un Status: 0x00000000 con una Maximum Size non nulla indica un journal attivo. Uno 0x80000005 o equivalente significa che il journal è disabilitato e non c'è nulla da estrarre — vedere la reference di fsutil usn per i comandi di ciclo di vita.

Dopo l'estrazione

Una volta in possesso del file $J, lo rilasci su questo sito o lo passi allo strumento di tua scelta. I byte carvati sono esattamente l'input atteso da parser come usnrs, PoorBillionaire/USN-Journal-Parser o MFTECmd di Eric Zimmerman.

Se prendi anche il $MFT (stesso vicinato $Extend, entry MFT 0), potrai risolvere percorsi completi invece dei soli nomi — vedi il meccanismo di risoluzione percorso in usnrs e l'input $MFT del nostro parser.

Trappole frequenti

  • Copiare con Esplora risorse: il drag-and-drop di $UsnJrnl copia silenziosamente il flusso senza nome di default (vuoto) e non $J. Usare sempre uno strumento forense.
  • Journal disabilitato: macchine in workgroup hanno talvolta il journal disabilitato. fsutil usn queryjournal è il controllo più economico.
  • $J ha zeri sparsi all'inizio: il journal è un flusso sparse — i primi centinaia di MB possono essere tutti zeri prima del primo record vero. usnrs, il nostro parser e la maggior parte degli altri li saltano automaticamente. Per scrivere un proprio parser, Skip::find_first_record in usnrs è l'implementazione di riferimento più corta.
  • Wrapping del flusso: a seconda dell'attività del volume, il ring buffer del journal può essersi avvolto — le entry più vecchie sono andate. Il più piccolo USN che trovi indica quanto indietro arriva lo storico disponibile.