← Retour au blog

Anatomie d'un enregistrement MFT : en-tête, attributs

· Lecture 5 min

Chaque entrée de la Master File Table fait 1 024 octets agencés de la même manière : un en-tête fixe, une petite structure de réparation, puis un flux d'attributs typés. Cet article détaille cette disposition — le genre de précision dont vous avez besoin pour lire $MFT à l'octet près dans un éditeur hexadécimal ou pour écrire votre propre parseur.

La signature FILE

Les quatre premiers octets de chaque enregistrement contiennent la chaîne ASCII FILE (46 49 4C 45). Les parseurs s'en servent comme ancre lorsqu'ils scannent un volume brut à la recherche d'enregistrements orphelins : toute frontière de 1 024 octets qui commence par FILE est un enregistrement MFT, même si l'en-tête de la table elle-même est illisible.

Un enregistrement dont chkdsk n'a pas pu réparer le contenu porte la signature BAAD (42 41 41 44). NTFS conserve ces enregistrements plutôt que de les effacer — leur numéro de séquence reste préservé — mais le reste des octets n'est pas fiable.

L'en-tête de l'enregistrement

Les 56 octets qui suivent la signature décrivent la nature de l'enregistrement et comment le lire sans erreur :

  • Décalage du tableau de séquence de mise à jour (2 octets) et taille du tableau en mots de 16 bits (2 octets). Ensemble, ils décrivent les données de fixup ; voir plus bas.
  • Numéro de séquence $LogFile (8 octets). Pointe vers le journal de transactions pour la reprise après incident.
  • Numéro de séquence (2 octets). Incrémenté chaque fois que la place d'enregistrement est réutilisée.
  • Compteur de liens physiques (2 octets). Un par attribut $FILE_NAME.
  • Décalage du premier attribut (2 octets).
  • Drapeaux (2 octets). Le bit 0 est IN_USE ; le bit 1 marque un dossier.
  • Taille utilisée (4 octets) et taille allouée (4 octets) de l'enregistrement. La taille allouée vaut toujours 1 024 sur les volumes standards.
  • Référence de l'enregistrement de base (8 octets). Non nulle sur les enregistrements d'extension — des emplacements supplémentaires utilisés quand les attributs d'un fichier débordent d'un seul enregistrement.
  • Prochain ID d'attribut (2 octets). Sert à attribuer des ID uniques aux nouveaux attributs.
  • Numéro de l'enregistrement (4 octets, NTFS 3.1+). Auto-référence, utile pour vérifier l'intégrité de l'analyse.

Le numéro de séquence est ce qui rend l'analyse des fichiers supprimés fiable. Le numéro d'enregistrement seul est réutilisé ; la référence de fichier sur 64 bits (numéro d'enregistrement plus numéro de séquence) ne l'est pas. Une référence qui ne correspond pas au numéro de séquence courant à ce numéro d'enregistrement est un pointeur vers un occupant précédent — généralement un fichier supprimé.

Le tableau fixup

NTFS détecte les écritures interrompues grâce à une petite astuce appelée tableau de séquence de mise à jour (USA), ou tableau fixup. Chaque enregistrement de 1 024 octets est aussi découpé en deux secteurs de 512 octets. NTFS :

  1. Choisit un numéro de séquence de mise à jour (USN — sans rapport avec l'USN de $UsnJrnl malgré le sigle commun) de 16 bits.
  2. Remplace les deux derniers octets de chaque secteur de 512 octets par cet USN avant d'écrire.
  3. Stocke les octets de queue d'origine dans le tableau fixup, dans l'ordre, juste après l'USN lui-même.

À la lecture, NTFS vérifie que les deux derniers octets de chaque secteur correspondent à l'USN. Si oui, les secteurs ont été écrits ensemble ; les octets d'origine sont récupérés depuis le tableau fixup et remis en place. Si l'un des secteurs ne correspond pas, l'écriture a été interrompue et l'enregistrement est suspect.

Un parseur qui lit $MFT octet par octet sans appliquer les fixups récupérera donc des données aberrantes aux décalages 510 et 1022 de chaque enregistrement. Tout parseur MFT sérieux applique le fixup en premier après avoir localisé un enregistrement.

Le flux d'attributs

Après l'en-tête (et le tableau fixup) viennent les attributs du fichier. Chaque attribut commence par son propre petit en-tête — code de type, longueur, drapeau résident ou non, nom optionnel — suivi de ses données. Les attributs sont alignés sur 8 octets, écrits bout à bout, et terminés par une sentinelle 0xFFFFFFFF.

Un enregistrement minimal en porte trois :

  • $STANDARD_INFORMATION (0x10) — horodatages et drapeaux DOS.
  • $FILE_NAME (0x30) — nom, référence du dossier parent et un second jeu d'horodatages.
  • $DATA (0x80) — le contenu du fichier, résident en ligne pour les petits fichiers ou une liste de cluster runs sinon.

Un enregistrement peut en porter beaucoup d'autres, dont $ATTRIBUTE_LIST quand les attributs d'un fichier dépassent un seul emplacement de 1 024 octets. La liste complète figure dans la référence de la Master File Table.

Pourquoi c'est important en forensique

La combinaison d'une disposition stable de 1 024 octets et de la signature FILE est ce qui rend possible la récupération (carving) de fichiers NTFS supprimés. Même si $MFT lui-même a disparu, un scan du volume brut à la recherche des en-têtes FILE récupère la plupart des enregistrements — y compris les noms, les horodatages et (pour les petits fichiers) les données des entrées supprimées. Le mécanisme de fixup permet de faire confiance à ces enregistrements récupérés tant que l'USA est vérifiée.

Ressources externes