Jeder Eintrag der Master File Table ist 1.024 Byte lang und stets gleich aufgebaut: ein fester Header, eine kleine Reparaturstruktur, dann ein Strom typisierter Attribute. Dieser Artikel betrachtet diese Anordnung im Detail — genau die Art von Präzision, die Sie brauchen, wenn Sie $MFT byteweise in einem Hex-Editor lesen oder einen eigenen Parser schreiben.
Die FILE-Signatur
Die ersten vier Bytes jedes Eintrags sind die ASCII-Zeichenfolge FILE (46 49 4C 45). Parser nutzen sie als Anker, wenn sie ein rohes Volume nach verwaisten Einträgen durchsuchen: Jede 1.024-Byte-Grenze, die mit FILE beginnt, ist ein MFT-Eintrag, selbst wenn der Header der Tabelle selbst unlesbar ist.
Ein Eintrag, dessen Inhalt chkdsk nicht reparieren konnte, trägt stattdessen die Signatur BAAD (42 41 41 44). NTFS lässt diese Einträge an Ort und Stelle, statt sie zu löschen — die Sequenznummer des Slots bleibt damit erhalten —, aber dem Rest der Bytes ist nicht zu trauen.
Der Eintrags-Header
Die 56 Bytes nach der Signatur beschreiben, um welche Art von Eintrag es sich handelt und wie er sicher zu lesen ist:
- Offset des Update-Sequence-Arrays (2 Byte) und Größe des Arrays in 16-Bit-Wörtern (2 Byte). Zusammen beschreiben sie die Fixup-Daten; siehe unten.
$LogFile-Sequenznummer (8 Byte). Verweist zurück in das Transaktionsprotokoll für die Crash-Recovery.- Sequenznummer (2 Byte). Wird bei jeder Wiederverwendung des Eintragsslots inkrementiert.
- Hard-Link-Zähler (2 Byte). Einer pro
$FILE_NAME-Attribut. - Offset zum ersten Attribut (2 Byte).
- Flags (2 Byte). Bit 0 ist
IN_USE; Bit 1 markiert ein Verzeichnis. - Belegte Größe (4 Byte) und allozierte Größe (4 Byte) des Eintrags. Die allozierte Größe beträgt auf Standard-Volumes immer 1.024.
- Referenz auf den Basis-Eintrag (8 Byte). Ungleich null auf Extension-Records — zusätzliche Slots, die genutzt werden, wenn die Attribute einer Datei einen einzelnen Eintrag sprengen.
- Nächste Attribut-ID (2 Byte). Wird verwendet, um neuen Attributen eindeutige IDs zuzuweisen.
- Eintragsnummer (4 Byte, NTFS 3.1+). Selbstreferenz, nützlich zur Plausibilitätsprüfung der Analyse.
Die Sequenznummer ist das, was die Analyse gelöschter Dateien vertrauenswürdig macht. Die Eintragsnummer allein wird wiederverwendet; die 64-Bit-File Reference (Eintragsnummer plus Sequenznummer) nicht. Eine Referenz, die nicht zur aktuellen Sequenznummer dieser Eintragsnummer passt, ist ein Zeiger auf einen früheren Bewohner — meist eine gelöschte Datei.
Das Fixup-Array
NTFS erkennt abgerissene Schreibvorgänge mit einem kleinen Trick namens Update Sequence Array (USA) oder Fixup-Array. Jeder 1.024-Byte-Eintrag ist zugleich in zwei 512-Byte-Sektoren unterteilt. NTFS:
- Wählt eine 16 Bit lange Update Sequence Number (USN — trotz identischem Akronym ohne Bezug zur
$UsnJrnl-USN). - Ersetzt die letzten beiden Bytes jedes 512-Byte-Sektors vor dem Schreiben durch diese USN.
- Speichert die ursprünglichen letzten beiden Bytes jedes Sektors der Reihe nach im Fixup-Array, direkt nach der USN selbst.
Beim Lesen prüft NTFS, ob die letzten beiden Bytes jedes Sektors mit der USN übereinstimmen. Tun sie es, wurden die Sektoren gemeinsam geschrieben; die Originalbytes werden aus dem Fixup-Array geholt und zurückgesetzt. Stimmt das Sektorende nicht überein, wurde der Schreibvorgang abgerissen und der Eintrag ist verdächtig.
Ein Parser, der $MFT byteweise liest, ohne Fixups anzuwenden, erhält daher an den Offsets 510 und 1022 jedes Eintrags Müll. Jeder ernsthafte MFT-Parser wendet das Fixup als ersten Schritt nach dem Auffinden eines Eintrags an.
Der Attributstrom
Nach dem Header (und dem Fixup-Array) folgen die Attribute der Datei. Jedes Attribut beginnt mit einem eigenen kurzen Header — Typcode, Länge, Resident/Non-Resident-Flag, optionaler Name —, gefolgt von den Daten des Attributs. Attribute sind auf 8 Byte ausgerichtet, hintereinander geschrieben und werden durch eine 0xFFFFFFFF-Sentinel abgeschlossen.
Ein minimaler Eintrag trägt drei:
$STANDARD_INFORMATION(0x10) — Zeitstempel und DOS-Flags.$FILE_NAME(0x30) — Name, Referenz auf das übergeordnete Verzeichnis und ein zweiter Satz Zeitstempel.$DATA(0x80) — der Dateiinhalt, bei kleinen Dateien resident inline oder ansonsten eine Liste von Cluster Runs.
Einträge können viele weitere tragen, darunter $ATTRIBUTE_LIST, wenn die Attribute einer Datei einen einzelnen 1.024-Byte-Slot sprengen. Die vollständige Liste finden Sie in der Master-File-Table-Referenz.
Warum das für die Forensik wichtig ist
Die Kombination aus einer stabilen 1.024-Byte-Anordnung und der FILE-Signatur ist genau das, was das Carving gelöschter NTFS-Dateien überhaupt möglich macht. Selbst wenn $MFT selbst verloren ist, fördert ein Scan des rohen Volumes nach FILE-Headern die meisten Einträge zutage — einschließlich Namen, Zeitstempel und (bei kleinen Dateien) Daten gelöschter Einträge. Der Fixup-Mechanismus sorgt dafür, dass diesen geborgenen Einträgen vertraut werden kann, solange die USA stimmt.