Le plus dur, avec le journal USN, ce n'est souvent pas de le parser — c'est de mettre la main sur le fichier. $UsnJrnl:$J est un flux de données alternatif, pas un fichier ordinaire : il n'apparaît pas dans l'Explorateur et ne survit pas à un simple copy. Cet article passe en revue les façons réalistes de l'extraire dans les trois contextes où on le rencontre : image forensique, volume monté, machine en production.
Ce qu'on cherche
Le journal vit au chemin :
\$Extend\$UsnJrnl:$J
$Extend est un dossier de métadonnées NTFS caché, et $J est l'un des deux flux alternatifs du fichier de métadonnées $UsnJrnl (l'autre, $Max, ne contient que des métadonnées de taille). Microsoft décrit l'organisation dans la référence interne NTFS et la structure USN_RECORD_V2.
Un $J typique fait de 30 Mo à plusieurs Go selon la configuration de fsutil usn.
Depuis une image disque forensique (E01, dd, AFF4)
C'est le cas le plus fréquent en DFIR.
FTK Imager (gratuit, GUI)
- Ouvrir l'image (
File → Add Evidence Item). - Naviguer dans
[root]/$Extend/$UsnJrnl. - Clic droit sur le flux
$J→ Export Files.
FTK Imager traite les flux alternatifs comme des entrées de premier niveau — ils apparaissent en lignes sœurs à côté du fichier. Bien sélectionner la ligne $J (pas $Max).
X-Ways Forensics (commercial)
X-Ways expose le même chemin. Dans l'arbre, déplier Root directory → $Extend → $UsnJrnl, sélectionner le flux $J et faire Recover/Copy.
The Sleuth Kit (gratuit, CLI, multi-plateforme)
C'est l'outil de référence côté Mac/Linux. L'utilitaire pertinent est icat de TSK :
# Trouver l'entrée MFT de $UsnJrnl
fls -r -p image.dd | grep '\$UsnJrnl'
# Supposons inode 81 et flux $J en attribut 128-2 :
icat image.dd 81-128-2 > UsnJrnl-J.bin
Le triplet <inode>-<type>-<id> est la manière TSK d'adresser un flux alternatif. Le type/id requis est celui dont le nom d'attribut se termine par :$J — fls l'affiche dans sa sortie longue.
Velociraptor / KAPE
Pour des collectes de triage à grande échelle, l'artefact Windows.NTFS.MFT de Velociraptor et KAPE savent récupérer le journal automatiquement. KAPE utilise des targets (!ALL ou USNJournal), Velociraptor utilise le plugin parse_ntfs.
Depuis un volume monté
Si l'image est montée (en lecture seule, via mount -t ntfs-3g ou Arsenal Image Mounter sur Windows), le chemin apparaît comme un fichier ordinaire mais la plupart des outils refusent de lire les flux alternatifs de façon transparente.
Sous Linux avec ntfs-3g, on peut lire le flux directement :
sudo cat '/mnt/image/$Extend/$UsnJrnl:$J' > UsnJrnl-J.bin
Selon l'option de montage streams_interface, :$J peut apparaître comme un chemin distinct au lieu d'un suffixe — vérifier avec ls -la /mnt/image/\$Extend/.
Depuis un poste Windows en production
Il faut les droits administrateur et un lecteur NTFS-aware, parce que Windows bloque l'accès ordinaire aux fichiers de métadonnées.
PowerShell avec lecture brute du volume
Les outils d'Eric Zimmerman incluent RawCopy.exe (ou RawCopy64.exe), qui contourne l'API fichier standard :
RawCopy.exe /FileNamePath:"C:\$Extend\$UsnJrnl:$J" /OutputPath:"D:\Out"
Si on ne peut pas déposer de binaire, PowerForensics fait la même chose en pur PowerShell :
Import-Module PowerForensics
Get-ForensicFileRecord -Path 'C:\$Extend\$UsnJrnl' |
ForEach-Object { $_.GetContent() } |
Set-Content -Path 'C:\Out\UsnJrnl-J.bin' -Encoding Byte
fsutil natif
fsutil usn est la surface de contrôle supportée pour le journal, mais ce n'est pas un outil d'extraction — il sait lire, requêter et supprimer des enregistrements, pas streamer le blob complet $J. Il est en revanche utile pour vérifier que le journal est actif et bien dimensionné avant extraction :
fsutil usn queryjournal C:
Un Status: 0x00000000 avec une Maximum Size non nulle signale un journal actif. Un 0x80000005 ou équivalent signifie que le journal est désactivé et qu'il n'y a rien à extraire — voir la référence fsutil usn pour les commandes de cycle de vie.
Après l'extraction
Une fois le fichier $J en main, on le dépose sur ce site ou on le passe à l'outil de son choix. Les octets carvés sont exactement le format d'entrée attendu par usnrs, PoorBillionaire/USN-Journal-Parser, ou MFTECmd d'Eric Zimmerman.
Si on récupère aussi le $MFT (même voisinage $Extend, entrée MFT 0), on peut résoudre des chemins complets au lieu de simples noms de fichiers — voir la résolution de chemin dans usnrs et l'entrée $MFT de notre parseur.
Pièges classiques
- Copier avec l'Explorateur : le glisser-déposer de
$UsnJrnlcopie silencieusement le flux par défaut (vide) et pas$J. Toujours utiliser un outil forensique. - Journal désactivé : sur des machines de workgroup, le journal est parfois désactivé.
fsutil usn queryjournalest le check le moins coûteux. $Jcommence par des zéros épars : le journal est un flux sparse — les premières centaines de Mo peuvent n'être que des zéros avant le premier vrai enregistrement.usnrs, notre parseur et la plupart des autres les sautent automatiquement. Pour écrire son propre parseur,Skip::find_first_recorddans usnrs est la référence la plus courte.- Cycle du flux : selon l'activité du volume, le buffer circulaire du journal peut avoir tourné — les entrées les plus anciennes ont disparu. Le plus petit USN trouvé indique jusqu'où remonte l'historique disponible.