Systèmes de fichiers · Leçon 5 sur 8
FAT32 et exFAT sur les supports amovibles
13 min de lecture
Les clés USB, les cartes SD, les appareils photo, les caméras embarquées et les drones utilisent presque toujours FAT32 ou exFAT, car tous les principaux systèmes d'exploitation peuvent les lire et y écrire. Ces systèmes de fichiers ne comportent ni autorisations, ni SID de propriétaire, ni journal ; ils enregistrent donc peu d'informations, et vous devez interpréter avec précision celles qu'ils enregistrent. Les supports amovibles que vous examinez seront souvent en FAT32 ou en exFAT ; vous devez donc savoir localiser manuellement les données des fichiers, interpréter correctement les horodatages et reconnaître ce que laisse une suppression.
Pourquoi ces systèmes de fichiers sont importants
Les supports amovibles transportent des documents exfiltrés et des outils transférés, mais aucun de ces deux systèmes de fichiers n'enregistre qui a écrit un fichier. Vous établissez l'attribution en corrélant le support avec l'hôte : historique des périphériques USB, fichiers LNK et listes de raccourcis (module 2). Les supports flash de plus de 2 GB et jusqu'à 32 GB (cartes SDHC et la plupart des petites clés USB) sont généralement fournis en FAT32 ; les cartes SD de 2 GB ou moins utilisent FAT12 ou FAT16. La spécification des cartes SDXC (plus de 32 GB) impose exFAT, et les clés USB de grande capacité sont normalement fournies en exFAT également.
Organisation de FAT32
Un volume FAT32 comporte trois zones : la zone réservée, la zone FAT et la zone de données.
Secteur d'amorçage et BPB
Le secteur 0 du volume contient le secteur d'amorçage, qui renferme le bloc de paramètres du BIOS (BPB). Tous les décalages sont relatifs au début du volume, et les valeurs multioctets sont en petit-boutiste.
| Décalage | Taille | Champ | Valeur typique |
|---|---|---|---|
| 0x03 | 8 | Nom OEM | MSDOS5.0 |
| 0x0B | 2 | Octets par secteur | 512 |
| 0x0D | 1 | Secteurs par cluster | 8 (clusters de 4 KiB) |
| 0x0E | 2 | Nombre de secteurs réservés | 32 |
| 0x10 | 1 | Nombre de FAT | 2 |
| 0x24 | 4 | Taille de la FAT en secteurs (FATSz32) | dépend du volume |
| 0x2C | 4 | Premier cluster du répertoire racine | 2 |
| 0x30 | 2 | Secteur FSInfo | 1 |
| 0x32 | 2 | Secteur d'amorçage de secours | 6 |
| 0x43 | 4 | Numéro de série du volume | défini lors du formatage |
| 0x47 | 11 | Étiquette du volume | NO NAME |
| 0x52 | 8 | Chaîne indiquant le type de système de fichiers | FAT32 |
| 0x1FE | 2 | Signature | 0x55 0xAA |
Les champs FAT12/16 du nombre d'entrées du répertoire racine et de la taille de la FAT sur 16 bits (0x11 et 0x16) sont à zéro en FAT32, où le répertoire racine est une chaîne de clusters ordinaire. La chaîne de type à 0x52 est uniquement informative. Les implémentations déterminent le type de FAT à partir du nombre de clusters.
Le secteur FSInfo contient les signatures RRaA au décalage 0 et rrAa à 0x1E4. Son nombre de clusters libres (0x1E8) et son indication du prochain cluster libre (0x1EC) peuvent être obsolètes et ne constituent donc pas des éléments probants.
Les deux FAT et la zone de données
Deux copies de la table d'allocation des fichiers suivent la zone réservée. Normalement, FAT2 est le miroir de FAT1. Si elles diffèrent, consignez-le, car cette différence peut provenir d'une écriture interrompue. La zone de données commence immédiatement après FAT2, et son premier cluster porte le numéro 2. Les clusters 0 et 1 n'existent pas sur le disque. Les entrées FAT[0] et FAT[1] contiennent l'octet de support et les indicateurs d'état.
Entrées de la FAT et chaînes de clusters
Chaque entrée FAT32 occupe 4 octets, mais seuls les 28 bits de poids faible sont utilisés ; les 4 bits de poids fort sont réservés. L'entrée N décrit le cluster N :
| Valeur (28 bits de poids faible) | Signification |
|---|---|
| 0x0000000 | Libre |
| 0x0000002–0xFFFFFEF | Cluster suivant dans la chaîne |
| 0xFFFFFF7 | Cluster défectueux |
| 0xFFFFFF8–0xFFFFFFF | Fin de chaîne (EOC) |
Écrite sous forme de valeurs complètes sur 32 bits, la plage de fin de chaîne est 0x0FFFFFF8–0x0FFFFFFF et le marqueur de cluster défectueux est 0x0FFFFFF7. Dans la figure, l'entrée de répertoire pointe vers le cluster 5, FAT[5] = 6, FAT[6] = 9 et FAT[9] = EOC. Le fichier occupe donc les clusters 5, 6 et 9, et il est fragmenté.
Entrées de répertoire
Chaque répertoire est une suite d'entrées de 32 octets.
| Décalage | Taille | Champ |
|---|---|---|
| 0x00 | 11 | Nom court au format 8.3, complété par des espaces (REPORT PDF) |
| 0x0B | 1 | Attributs : 0x01 lecture seule, 0x02 caché, 0x04 système, 0x08 étiquette du volume, 0x10 répertoire, 0x20 archive |
| 0x0D | 1 | Résolution fine de l'heure de création : unités de 10 ms, 0–199 |
| 0x0E | 2 | Heure de création |
| 0x10 | 2 | Date de création |
| 0x12 | 2 | Date du dernier accès (sans heure) |
| 0x14 | 2 | Premier cluster, mot de poids fort |
| 0x16 | 2 | Heure de dernière modification |
| 0x18 | 2 | Date de dernière modification |
| 0x1A | 2 | Premier cluster, mot de poids faible |
| 0x1C | 4 | Taille du fichier en octets |
Le premier cluster est égal à (mot de poids fort × 65 536) + mot de poids faible. Le champ de taille occupe 32 bits ; un fichier FAT32 ne peut donc pas dépasser 4 GiB moins 1 octet (4 294 967 295 octets).
Horodatages
Les dates encodent l'année moins 1980 dans les bits 15–9, le mois dans les bits 8–5 et le jour dans les bits 4–0. Les heures encodent l'heure dans les bits 15–11, les minutes dans les bits 10–5 et les secondes divisées par 2 dans les bits 4–0. Les heures de modification ont donc une résolution de 2 secondes. Les heures de création atteignent une résolution de 10 ms grâce à l'octet supplémentaire à 0x0D. L'accès est enregistré uniquement sous forme de date. Par exemple, la date 0x5B61 se décode en 2025-11-01 et l'heure 0x7A2F se décode en 15:17:30. Sur le disque, elles apparaissent sous la forme 61 5B et 2F 7A.
Point essentiel : les horodatages FAT sont stockés en heure locale sans information de fuseau horaire. La valeur correspond à ce qu'indiquait l'horloge de l'appareil ayant effectué l'écriture. Il peut s'agir d'un appareil photo encore réglé sur sa valeur d'usine ou d'un hôte à l'heure d'été. Avant de rapporter une valeur UTC, établissez le fuseau horaire de l'appareil ayant effectué l'écriture, par exemple à partir des paramètres de fuseau horaire du registre de l'hôte, et précisez cette hypothèse. N'oubliez pas non plus que, lorsque Windows copie un fichier sur le support, la destination reçoit généralement une nouvelle heure de création, mais conserve l'heure de modification de la source. Une heure de modification antérieure à l'heure de création indique souvent une copie.
Noms de fichiers longs
Les noms qui ne tiennent pas au format 8.3 reçoivent des entrées de nom de fichier long (LFN). Il s'agit d'entrées de 32 octets portant l'attribut 0x0F. Chacune contient 13 caractères UTF-16, répartis entre les décalages 0x01, 0x0E et 0x1C. Elles sont stockées immédiatement avant l'entrée courte et dans l'ordre inverse. L'octet 0 est le numéro de séquence, et un OU binaire avec 0x40 est appliqué à l'entrée LFN logiquement finale. Par exemple, Budget-2025-v2.xlsx (19 caractères) nécessite deux entrées LFN. Sur le disque, elles apparaissent dans l'ordre suivant : 0x42 (caractères 14–19), puis 0x01 (caractères 1–13), puis l'entrée courte BUDGET~1XLS. L'octet 0x0D de chaque entrée LFN contient une somme de contrôle du nom court de 11 octets. Elle permet aux outils de rejeter les entrées LFN qui n'appartiennent plus à l'entrée courte qui les suit.
Suppression et récupération en FAT32
Lorsque Windows supprime un fichier, il remplace le premier octet de l'entrée courte par 0xE5 et marque également chacune des entrées LFN du fichier avec 0xE5. Il met ensuite à zéro la chaîne du fichier dans les deux FAT. Le reste de l'entrée de répertoire subsiste : les caractères restants du nom, les attributs, les horodatages, le premier cluster et la taille. (Un premier octet à 0x00 a une autre signification : il n'y a plus d'entrées dans ce répertoire.)
La méthode de récupération en découle. Vous disposez du cluster de départ et de la taille, mais la chaîne a disparu. Si le fichier était contigu, vous pouvez lire ceil(taille ÷ taille de cluster) clusters à partir du cluster de départ et tronquer le résultat à la taille du fichier. Vérifiez d'abord que ces clusters sont toujours libres (valeur FAT 0) et que leur contenu est valide. Si le fichier était fragmenté, comme celui de la figure, la FAT mise à zéro ne donne aucune indication sur l'emplacement des fragments suivants ; vous devez donc les récupérer par carving (leçon 1.8). Certaines implémentations effacent également le mot de poids fort du premier cluster lors de la suppression ; sur un volume de grande taille, testez donc les mots de poids fort possibles en les confrontant au contenu. Des outils tels que icat de The Sleuth Kit appliquent cette hypothèse de contiguïté.
Numéro de série du volume
Le numéro de série de 4 octets à 0x43 est écrit lors du formatage du volume. Les fichiers LNK et les listes de raccourcis Windows enregistrent le numéro de série du volume qui contenait la cible (module 2). Lisez-le en petit-boutiste : les octets 4D 3C 2B 1A correspondent au numéro de série 0x1A2B3C4D, que Windows affiche sous la forme 1A2B-3C4D. Le reformatage modifie ce numéro ; une correspondance relie donc le fichier LNK à ce formatage du support, et non au périphérique physique.
exFAT
exFAT vise les supports flash de grande capacité, avec des tailles sur 64 bits, des noms pouvant atteindre 255 caractères et aucun nom 8.3.
Zone d'amorçage et métadonnées
La zone d'amorçage principale occupe les secteurs 0–11, et une copie de secours occupe les secteurs 12–23. Le secteur 0 commence par EB 76 90, suivi de EXFAT au décalage 3. Les octets 0x0B–0x3F doivent être à zéro afin que les analyseurs FAT ne puissent pas interpréter le volume de manière erronée. Les champs clés sont FatOffset (0x50), FatLength (0x54), ClusterHeapOffset (0x58), ClusterCount (0x5C), FirstClusterOfRootDirectory (0x60) et VolumeSerialNumber (0x64). Les tailles des secteurs et des clusters sont stockées sous forme de puissances de deux : BytesPerSectorShift à 0x6C et SectorsPerClusterShift à 0x6D. La signature 0x55AA se trouve au décalage 510. Normalement, il n'y a qu'une seule FAT.
Le répertoire racine contient des entrées spéciales : le bitmap d'allocation (type 0x81), qui fait autorité pour déterminer quels clusters sont utilisés (un bit par cluster), la table de conversion en majuscules (0x82), utilisée pour la comparaison des noms sans distinction de casse, et l'étiquette du volume (0x83).
Ensembles d'entrées de répertoire
Chaque fichier est décrit par un ensemble d'entrées consécutives de 32 octets :
| Entrée | Type | Contenu principal |
|---|---|---|
| Fichier | 0x85 | Nombre d'entrées secondaires, somme de contrôle de l'ensemble, attributs, horodatages, champs de 10 ms, décalages UTC |
| Extension de flux | 0xC0 | Indicateurs (bit 1 = NoFatChain), longueur du nom, ValidDataLength, premier cluster (0x14), DataLength (0x18) |
| Nom de fichier | 0xC1 | Jusqu'à 15 caractères UTF-16 par entrée |
Lorsque NoFatChain est activé, le fichier est contigu et la FAT n'est pas consultée du tout. Le premier cluster et DataLength définissent l'intégralité de l'étendue.
Horodatages exFAT
Chaque horodatage est une valeur de 32 bits qui utilise la même disposition des bits de date et d'heure que FAT. La création et la dernière modification disposent chacune d'un octet supplémentaire d'incrément de 10 ms (0–199), offrant une résolution de 10 ms. Le dernier accès ne dispose pas d'octet d'incrément ; sa résolution est donc de 2 secondes. Chacun des trois horodatages possède également son propre octet de décalage UTC, aux décalages 0x16, 0x17 et 0x18 de l'entrée Fichier. Le bit 7 est OffsetValid. Les bits 0–6 représentent un nombre signé, en complément à deux, d'intervalles de 15 minutes par rapport à UTC, couvrant la plage de −16:00 à +15:45. L'horodatage lui-même reste en heure locale, donc UTC = heure locale − décalage. Par exemple, 0xF4 est valide avec une valeur de −12, ce qui signifie UTC−03:00 ; l'heure locale 15:17:30 devient donc 18:17:30Z. Si le bit 7 est à 0, le décalage est inconnu et l'horodatage est aussi ambigu qu'un horodatage FAT32.
Suppression en exFAT
Le bit 7 de chaque type d'entrée est l'indicateur InUse. La suppression le remet à zéro : 0x85 devient donc 0x05, 0xC0 devient 0x40 et 0xC1 devient 0x41, et les bits correspondant aux clusters du fichier sont remis à zéro dans le bitmap d'allocation. Le nom, les horodatages, le premier cluster, DataLength et l'indicateur NoFatChain restent tous dans l'ensemble d'entrées. Un fichier NoFatChain supprimé est donc très facilement récupérable tant que ses clusters ne sont pas réutilisés, car son étendue n'a jamais été stockée dans la FAT. Pour un fichier exFAT fragmenté, vérifiez toute chaîne FAT subsistante en la confrontant au contenu avant de vous y fier.
Exemple détaillé : localiser un cluster sur le disque
Un secteur d'amorçage FAT32 présente 00 02 à 0x0B (512), 08 à 0x0D, 20 00 à 0x0E (32), 02 à 0x10 et CD 1D 00 00 à 0x24 (FATSz32 = 7 629). Une entrée de répertoire possède un mot de poids fort de 0x0001 et un mot de poids faible de 0x2A3C, donc N = 65 536 + 10 812 = 76 348.
- Premier secteur de données = secteurs réservés + numFATs × FATSz32 = 32 + 2 × 7 629 = 15 290
- Secteur du cluster N = premier secteur de données + (N − 2) × secteurs par cluster = 15 290 + 76 346 × 8 = 626 058
- Décalage en octets dans le volume = 626 058 × 512 = 320 541 696
- Si la partition commence au secteur 2 048 de l'image : 320 541 696 + 2 048 × 512 = 321 590 272
L'entrée FAT du fichier se trouve à l'octet 76 348 × 4 = 305 392 de FAT1. Cela correspond au secteur du volume 32 + 596 = 628, au décalage 240 dans le secteur. Pour exFAT, ClusterHeapOffset donne déjà le premier secteur de données : secteur de N = ClusterHeapOffset + (N − 2) × 2^SectorsPerClusterShift.
Points clés pour l'examen : Attendez-vous à calculer le décalage en octets d'un cluster à partir des valeurs du BPB et à suivre ou reconstituer une chaîne. Vous devrez peut-être également convertir un horodatage FAT32 ou exFAT en UTC en précisant le fuseau horaire retenu. Préparez-vous à lire un numéro de série de volume en petit-boutiste et à le faire correspondre à un fichier LNK, ainsi qu'à reconnaître les entrées supprimées (0xE5, ou un type exFAT dont le bit 7 est à zéro) et ce qui peut encore être récupéré à partir de celles-ci.
Points essentiels
- Organisation de FAT32 : zone réservée (secteur d'amorçage avec BPB, FSInfo, secteur d'amorçage de secours à 6), FAT1, FAT2, puis la zone de données commençant au cluster 2. Le premier secteur de données est égal à secteurs réservés + numFATs × FATSz32.
- Les entrées FAT32 utilisent 28 bits : 0 signifie libre, 0x0FFFFFF7 signifie défectueux et 0x0FFFFFF8–0x0FFFFFFF signifie fin de chaîne. La taille des fichiers est limitée à 4 GiB − 1 octet.
- Les horodatages FAT32 sont en heure locale sans fuseau horaire. Les heures de modification ont une résolution de 2 s, les heures de création atteignent 10 ms et l'accès est uniquement une date. exFAT ajoute des incréments de 10 ms et un décalage UTC propre à chaque horodatage, qui n'est valide que lorsque le bit 7 est à 1.
- La suppression laisse le nom (sans son premier octet), les horodatages, le premier cluster et la taille. FAT32 met la chaîne à zéro ; seuls les fichiers contigus peuvent donc être récupérés de manière fiable. Les fichiers exFAT NoFatChain supprimés se récupèrent bien.
- Le numéro de série du volume (FAT32 0x43, exFAT 0x64) relie les fichiers LNK d'un hôte à un volume formaté précis.