Methodik

Wie USN Parser ein $J-Blob in strukturierte Einträge verwandelt — Algorithmen, Validierungsschritte, bekannte Grenzen.

Diese Seite dokumentiert, was USN Parser mit deiner Eingabe macht, warum wir der Ausgabe vertrauen und wo die Grenzen liegen. Sie ist als Stütze für eine forensische Chain of Custody gedacht — wenn du USN Parser in einem Bericht zitierst, ist dies die Seite, auf die du verweist.

Eingaben

  • $UsnJrnl:$J: erforderlich. Ein Sparse Alternate Data Stream aus dem Volume-Root \$Extend\$UsnJrnl. Muss spezifisch der $J-Stream sein — $Max trägt nur die Journal-Größe.
  • $MFT: optional. Die Master File Table desselben Volumes. Wird ausschließlich zur Auflösung der Eltern-Verzeichnisreferenzen in vollständige Pfade verwendet.

Beide Dateien werden in den Speicher gelesen und an den WebAssembly-Parser übergeben. Der Browser reicht den Byte-Puffer per postMessage mit einer expliziten Transfer-Liste an den Worker — schneller und ohne im Speicher liegende Zufallskopien.

Parsing-Algorithmus

Wir kompilieren usnrs (Airbus CERT, Apache-2.0) nach wasm32-unknown-unknown. Es implementiert die dokumentierte USN_RECORD_V2-Struktur aus der Microsoft-NTFS-Referenz.

Der Reader:

  1. Überspringt die führende Sparse-Null-Region bis zum ersten Nicht-Null-Byte (Beginn des ersten Eintrags).
  2. Geht voran, liest an jedem Offset die 4-Byte RecordLength, um zum nächsten Eintrag zu springen.
  3. Stoppt bei den ersten 4 Nullbytes (Ende gültiger Einträge).
  4. Validiert pro Eintrag, dass die Major-/Minor-Version 2.0 ist, und dekodiert den fixen Header plus den variabel langen Dateinamen.

Bei vorhandenem $MFT lösen wir vollständige Pfade durch Verfolgen der Eltern-Referenzkette auf. Ein vollständiger Pfad wird nur dann übernommen, wenn der aufgelöste Blattname mit dem Dateinamen des Journals übereinstimmt — so vermeiden wir, dass ein veralteter MFT-Eintrag einen Pfad mit falscher Sicherheit liefert.

Ausgabe

Jeder Eintrag exponiert:

  • usn (u64): Position im Journal
  • timestampMs (i64): Windows-FILETIME, umgerechnet in Unix-Millisekunden, UTC
  • filename (UTF-16-dekodiert)
  • fullPath (string oder null): nur wenn $MFT geliefert und übereingestimmt
  • reasons (string[]): die Reason-Bitmaske, in lesbare Namen aufgefächert
  • attributes (string[]): markierte NTFS-Attribute der Datei
  • mftEntry, mftSequence, parentMftEntry, parentMftSequence

Die Ausgabe bleibt im Browser-Speicher, bis du den Tab schließt.

Grenzen

  • Noch keine USN_RECORD_V3-Unterstützung. V3 (variabel lange Dateireferenzen, mit ReFS eingeführt) wird auf gewöhnlichen NTFS-Volumes nicht erzeugt — in der Praxis selten relevant.
  • Ringpuffer-Wrap ist unsichtbar: Wir wissen nicht, was vor dem ältesten Eintrag überschrieben wurde. Querchecke mit $LogFile und Volume Shadow Copies, wenn du ältere Historie brauchst.
  • Keine Zeitstempel-Validierung: Wir vertrauen dem FILETIME im Eintrag. Zur Erkennung von Timestomping beschreibt der SI-vs-FN-Beitrag den Standard-Cross-Check gegen $MFT.

Chain of Custody

Wenn du eine Referenz für einen Bericht brauchst: Die USN-Parser-Version ist über den im Footer des GitHub-Repos angezeigten Commit-Hash identifizierbar. Das wasm-Artefakt ist aus dem Quellcode reproduzierbar via wasm-pack build --release; der Hash der .wasm ist pro Quell-Revision stabil.