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)
- Aprire l'immagine (
File → Add Evidence Item). - Navigare in
[root]/$Extend/$UsnJrnl. - Tasto destro sul flusso
$J→ Export 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 :$J — fls 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
$UsnJrnlcopia 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. $Jha 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_recordin 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.