Sistemas de archivos · Lección 5 de 8
FAT32 y exFAT en medios extraíbles
13 min de lectura
Las memorias USB, las tarjetas SD, las cámaras, las cámaras de tablero y los drones casi siempre utilizan FAT32 o exFAT, porque todos los principales sistemas operativos pueden leerlos y escribir en ellos. Estos sistemas de archivos no tienen permisos, SID de propietario ni diario, por lo que registran poca información y es necesario interpretar con exactitud lo que sí registran. Los medios extraíbles que examine a menudo serán FAT32 o exFAT, por lo que debe saber localizar manualmente los datos de los archivos, interpretar correctamente las marcas de tiempo y reconocer los rastros que deja la eliminación.
Por qué importan estos sistemas de archivos
Los medios extraíbles transportan documentos exfiltrados y herramientas transferidas, pero ninguno de estos sistemas de archivos registra quién escribió un archivo. La atribución se establece correlacionando el medio con el equipo: historial de dispositivos USB, archivos LNK y listas de accesos directos (módulo 2). Los medios flash de más de 2 GB y hasta 32 GB (tarjetas SDHC y la mayoría de las memorias USB pequeñas) suelen venir formateados en FAT32; las tarjetas SD de 2 GB o menos utilizan FAT12 o FAT16. La especificación de las tarjetas SDXC (más de 32 GB) exige el uso de exFAT, y las memorias USB de gran capacidad normalmente también vienen formateadas en exFAT.
Estructura de FAT32
Un volumen FAT32 tiene tres regiones: la región reservada, la región de la FAT y la región de datos.
Sector de arranque y BPB
El sector 0 del volumen contiene el sector de arranque, que incluye el bloque de parámetros del BIOS (BPB). Todos los desplazamientos son relativos al inicio del volumen, y los valores de varios bytes están en formato little-endian.
| Desplazamiento | Tamaño | Campo | Valor típico |
|---|---|---|---|
| 0x03 | 8 | Nombre OEM | MSDOS5.0 |
| 0x0B | 2 | Bytes por sector | 512 |
| 0x0D | 1 | Sectores por clúster | 8 (clústeres de 4 KiB) |
| 0x0E | 2 | Cantidad de sectores reservados | 32 |
| 0x10 | 1 | Número de FAT | 2 |
| 0x24 | 4 | Tamaño de la FAT en sectores (FATSz32) | depende del volumen |
| 0x2C | 4 | Primer clúster del directorio raíz | 2 |
| 0x30 | 2 | Sector FSInfo | 1 |
| 0x32 | 2 | Sector de arranque de respaldo | 6 |
| 0x43 | 4 | Número de serie del volumen | se establece al formatear |
| 0x47 | 11 | Etiqueta del volumen | NO NAME |
| 0x52 | 8 | Cadena de tipo de sistema de archivos | FAT32 |
| 0x1FE | 2 | Firma | 0x55 0xAA |
Los campos de cantidad de entradas raíz de FAT12/16 y de tamaño de FAT de 16 bits (0x11 y 0x16) son cero en FAT32, donde el directorio raíz es una cadena de clústeres normal. La cadena de tipo en 0x52 es meramente informativa. Las implementaciones determinan el tipo de FAT a partir de la cantidad de clústeres.
El sector FSInfo contiene las firmas RRaA en el desplazamiento 0 y rrAa en 0x1E4. Su cantidad de clústeres libres (0x1E8) y su indicación del siguiente clúster libre (0x1EC) pueden estar desactualizadas, por lo que no constituyen evidencia.
Las dos FAT y la región de datos
A continuación de la región reservada se encuentran dos copias de la tabla de asignación de archivos. Normalmente, FAT2 es una réplica de FAT1. Si difieren, anótelo, porque la diferencia puede deberse a una escritura interrumpida. La región de datos comienza justo después de FAT2, y su primer clúster lleva el número 2. Los clústeres 0 y 1 no existen en disco. Las entradas FAT[0] y FAT[1] contienen el byte del medio y los indicadores de estado.
Entradas de la FAT y cadenas de clústeres
Cada entrada de FAT32 ocupa 4 bytes, pero solo se utilizan los 28 bits inferiores y los 4 bits superiores están reservados. La entrada N describe el clúster N:
| Valor (28 bits inferiores) | Significado |
|---|---|
| 0x0000000 | Libre |
| 0x0000002–0xFFFFFEF | Siguiente clúster de la cadena |
| 0xFFFFFF7 | Clúster defectuoso |
| 0xFFFFFF8–0xFFFFFFF | Fin de cadena (EOC) |
Expresado como valores completos de 32 bits, el intervalo de fin de cadena es 0x0FFFFFF8–0x0FFFFFFF y el marcador de clúster defectuoso es 0x0FFFFFF7. En la figura, la entrada de directorio apunta al clúster 5, FAT[5] = 6, FAT[6] = 9 y FAT[9] = EOC. Por tanto, el archivo ocupa los clústeres 5, 6 y 9 y está fragmentado.
Entradas de directorio
Cada directorio es una secuencia de entradas de 32 bytes.
| Desplazamiento | Tamaño | Campo |
|---|---|---|
| 0x00 | 11 | Nombre corto en formato 8.3, rellenado con espacios (REPORT PDF) |
| 0x0B | 1 | Atributos: 0x01 solo lectura, 0x02 oculto, 0x04 sistema, 0x08 etiqueta del volumen, 0x10 directorio, 0x20 archivo |
| 0x0D | 1 | Resolución fina de la hora de creación: unidades de 10 ms, 0–199 |
| 0x0E | 2 | Hora de creación |
| 0x10 | 2 | Fecha de creación |
| 0x12 | 2 | Fecha del último acceso (sin hora) |
| 0x14 | 2 | Primer clúster, palabra alta |
| 0x16 | 2 | Hora de la última modificación |
| 0x18 | 2 | Fecha de la última modificación |
| 0x1A | 2 | Primer clúster, palabra baja |
| 0x1C | 4 | Tamaño del archivo en bytes |
El primer clúster es (palabra alta × 65.536) + palabra baja. El campo de tamaño tiene 32 bits, por lo que un archivo FAT32 no puede superar los 4 GiB menos 1 byte (4.294.967.295 bytes).
Marcas de tiempo
Las fechas codifican el año menos 1980 en los bits 15–9, el mes en los bits 8–5 y el día en los bits 4–0. Las horas codifican la hora en los bits 15–11, los minutos en los bits 10–5 y los segundos divididos entre 2 en los bits 4–0. Como resultado, las horas de modificación tienen una resolución de 2 segundos. Las horas de creación alcanzan una resolución de 10 ms gracias al byte adicional en 0x0D. El acceso se registra únicamente como fecha. Por ejemplo, la fecha 0x5B61 se decodifica como 2025-11-01 y la hora 0x7A2F como 15:17:30. En disco aparecen como 61 5B y 2F 7A.
Es fundamental tener en cuenta que las marcas de tiempo de FAT se almacenan en hora local sin información de zona horaria. El valor corresponde a lo que indicaba el reloj del dispositivo que realizó la escritura. Podría tratarse de una cámara que aún conserve la configuración de fábrica o de un equipo con horario de verano. Antes de informar un valor UTC, determine la zona horaria del dispositivo que realizó la escritura, por ejemplo, a partir de la configuración de zona horaria del registro del equipo, e indique ese supuesto. Recuerde también que, cuando Windows copia un archivo a la unidad, el archivo de destino suele recibir una nueva hora de creación, pero conserva la hora de modificación del original. Una hora de modificación anterior a la hora de creación suele indicar una copia.
Nombres de archivo largos
Los nombres que no caben en el formato 8.3 reciben entradas de nombre de archivo largo (LFN). Son entradas de 32 bytes con el atributo 0x0F. Cada una contiene 13 caracteres UTF-16, distribuidos entre los desplazamientos 0x01, 0x0E y 0x1C. Se almacenan inmediatamente antes de la entrada corta y en orden inverso. El byte 0 es el número de secuencia, y a la entrada LFN que lógicamente es la última se le aplica una operación OR con 0x40. Por ejemplo, Budget-2025-v2.xlsx (19 caracteres) necesita dos entradas LFN. En disco aparecen como 0x42 (caracteres 14–19), después 0x01 (caracteres 1–13) y, por último, la entrada corta BUDGET~1XLS. El byte 0x0D de cada entrada LFN contiene una suma de comprobación del nombre corto de 11 bytes. Esto permite a las herramientas descartar las entradas LFN que ya no pertenecen a la entrada corta que las sigue.
Eliminación y recuperación en FAT32
Cuando Windows elimina un archivo, sobrescribe el primer byte de la entrada corta con 0xE5 y también marca cada una de las entradas LFN del archivo con 0xE5. Después pone a cero la cadena del archivo en ambas FAT. El resto de la entrada de directorio se conserva: los caracteres restantes del nombre, los atributos, las marcas de tiempo, el primer clúster y el tamaño. (Un primer byte de 0x00 significa algo distinto: no hay más entradas en este directorio).
El procedimiento de recuperación se deriva de este comportamiento. Se dispone del clúster inicial y del tamaño, pero la cadena ha desaparecido. Si el archivo era contiguo, puede leer ceil(tamaño ÷ tamaño del clúster) clústeres desde el clúster inicial y recortar el resultado al tamaño del archivo. Primero confirme que esos clústeres siguen libres (valor 0 en la FAT) y que el contenido es válido. Si el archivo estaba fragmentado, como el de la figura, la FAT puesta a cero no ofrece ninguna pista sobre dónde se encontraban los fragmentos posteriores, por lo que tendrá que recuperarlos mediante carving (lección 1.8). Algunas implementaciones también borran la palabra alta del primer clúster durante la eliminación, por lo que, en un volumen grande, debe probar posibles valores de la palabra alta contrastándolos con el contenido. Herramientas como icat de The Sleuth Kit aplican este supuesto de contigüidad.
Número de serie del volumen
El número de serie de 4 bytes en 0x43 se escribe cuando se formatea el volumen. Los archivos LNK y las listas de accesos directos de Windows registran el número de serie del volumen que contenía el destino (módulo 2). Léalo en formato little-endian: los bytes 4D 3C 2B 1A corresponden al número de serie 0x1A2B3C4D, que Windows muestra como 1A2B-3C4D. Volver a formatear cambia el número de serie, por lo que una coincidencia vincula el archivo LNK con este formateo del medio, no con el dispositivo físico.
exFAT
exFAT está orientado a medios flash de gran capacidad, con tamaños de 64 bits, nombres de hasta 255 caracteres y sin nombres 8.3.
Región de arranque y metadatos
La región de arranque principal ocupa los sectores 0–11, y una copia de respaldo ocupa los sectores 12–23. El sector 0 comienza con EB 76 90, seguido de EXFAT en el desplazamiento 3. Los bytes 0x0B–0x3F deben ser cero, para que los analizadores de FAT no interpreten erróneamente el volumen. Los campos clave son FatOffset (0x50), FatLength (0x54), ClusterHeapOffset (0x58), ClusterCount (0x5C), FirstClusterOfRootDirectory (0x60) y VolumeSerialNumber (0x64). Los tamaños de sector y clúster se almacenan como potencias de dos: BytesPerSectorShift en 0x6C y SectorsPerClusterShift en 0x6D. La firma 0x55AA se encuentra en el desplazamiento 510. Normalmente hay una sola FAT.
El directorio raíz contiene entradas especiales: el mapa de bits de asignación (tipo 0x81), que es el registro autoritativo de qué clústeres están en uso (un bit por clúster), la tabla de conversión a mayúsculas (0x82), que se utiliza para comparar nombres sin distinguir entre mayúsculas y minúsculas, y la etiqueta del volumen (0x83).
Conjuntos de entradas de directorio
Cada archivo se describe mediante un conjunto de entradas consecutivas de 32 bytes:
| Entrada | Tipo | Contenido principal |
|---|---|---|
| Archivo | 0x85 | Cantidad de entradas secundarias, suma de comprobación del conjunto, atributos, marcas de tiempo, campos de 10 ms, desfases UTC |
| Extensión de flujo | 0xC0 | Indicadores (bit 1 = NoFatChain), longitud del nombre, ValidDataLength, primer clúster (0x14), DataLength (0x18) |
| Nombre de archivo | 0xC1 | Hasta 15 caracteres UTF-16 cada una |
Cuando NoFatChain está activado, el archivo es contiguo y no se consulta la FAT en absoluto. El primer clúster y DataLength definen toda la extensión.
Marcas de tiempo de exFAT
Cada marca de tiempo es un valor de 32 bits que utiliza la misma distribución de bits de fecha y hora que FAT. Las marcas de creación y última modificación reciben cada una un byte adicional de incrementos de 10 ms (0–199), lo que proporciona una resolución de 10 ms. La de último acceso no tiene byte de incrementos, por lo que su resolución es de 2 segundos. Cada una de las tres marcas de tiempo también tiene su propio byte de desfase UTC, en los desplazamientos 0x16, 0x17 y 0x18 de la entrada de archivo. El bit 7 es OffsetValid. Los bits 0–6 son un recuento con signo en complemento a dos de intervalos de 15 minutos respecto a UTC, que abarca de −16:00 a +15:45. La marca de tiempo en sí sigue siendo hora local, por lo que UTC = hora local − desfase. Por ejemplo, 0xF4 es válido y tiene un valor de −12, lo que significa UTC−03:00, de modo que la hora local 15:17:30 se convierte en 18:17:30Z. Si el bit 7 es 0, el desfase es desconocido y la marca de tiempo es tan ambigua como una de FAT32.
Eliminación en exFAT
El bit 7 de cada tipo de entrada es el indicador InUse. La eliminación lo desactiva, por lo que 0x85 pasa a ser 0x05, 0xC0 pasa a ser 0x40 y 0xC1 pasa a ser 0x41, y los clústeres del archivo se marcan como libres en el mapa de bits de asignación. El nombre, las marcas de tiempo, el primer clúster, DataLength y el indicador NoFatChain permanecen en el conjunto de entradas. Por tanto, un archivo NoFatChain eliminado es muy recuperable hasta que sus clústeres se reutilicen, porque su extensión nunca se almacenó en la FAT. En el caso de un archivo exFAT fragmentado, verifique cualquier cadena de la FAT que se conserve contrastándola con el contenido antes de confiar en ella.
Ejemplo resuelto: localizar un clúster en disco
Un sector de arranque FAT32 muestra 00 02 en 0x0B (512), 08 en 0x0D, 20 00 en 0x0E (32), 02 en 0x10 y CD 1D 00 00 en 0x24 (FATSz32 = 7.629). Una entrada de directorio tiene una palabra alta de 0x0001 y una palabra baja de 0x2A3C, por lo que N = 65.536 + 10.812 = 76.348.
- Primer sector de datos = reservados + numFATs × FATSz32 = 32 + 2 × 7.629 = 15.290
- Sector del clúster N = primer sector de datos + (N − 2) × sectores por clúster = 15.290 + 76.346 × 8 = 626.058
- Desplazamiento en bytes dentro del volumen = 626.058 × 512 = 320.541.696
- Si la partición comienza en el sector 2.048 de la imagen: 320.541.696 + 2.048 × 512 = 321.590.272
La entrada del archivo en la FAT se encuentra en el byte 76.348 × 4 = 305.392 de FAT1. Esto corresponde al sector 32 + 596 = 628 del volumen, en el desplazamiento 240 dentro del sector. En exFAT, ClusterHeapOffset ya proporciona el primer sector de datos: sector de N = ClusterHeapOffset + (N − 2) × 2^SectorsPerClusterShift.
Enfoque del examen: Deberá calcular el desplazamiento en bytes de un clúster a partir de los valores del BPB y seguir o reconstruir una cadena. También puede necesitar convertir una marca de tiempo de FAT32 o exFAT a UTC e indicar la zona horaria utilizada como referencia. Prepárese para leer un número de serie de volumen en formato little-endian y vincularlo con un archivo LNK, así como para reconocer entradas eliminadas (0xE5, o un tipo de exFAT con el bit 7 desactivado) y lo que aún puede recuperarse de ellas.
Puntos clave
- Estructura de FAT32: región reservada (sector de arranque con BPB, FSInfo, sector de arranque de respaldo en el sector 6), FAT1, FAT2 y, después, la región de datos que comienza en el clúster 2. El primer sector de datos es reservados + numFATs × FATSz32.
- Las entradas de FAT32 utilizan 28 bits: 0 significa libre, 0x0FFFFFF7 significa defectuoso y 0x0FFFFFF8–0x0FFFFFFF significa fin de cadena. El tamaño de los archivos está limitado a 4 GiB − 1 byte.
- Las marcas de tiempo de FAT32 están en hora local sin zona horaria. Las horas de modificación tienen una resolución de 2 s, las de creación alcanzan 10 ms y el acceso es solo una fecha. exFAT añade incrementos de 10 ms y un desfase UTC por marca de tiempo que solo es válido cuando el bit 7 está activado.
- La eliminación conserva el nombre (menos su primer byte), las marcas de tiempo, el primer clúster y el tamaño. FAT32 pone a cero la cadena, por lo que solo los archivos contiguos se recuperan de forma fiable. Los archivos NoFatChain eliminados de exFAT se recuperan bien.
- El número de serie del volumen (FAT32 0x43, exFAT 0x64) vincula los archivos LNK de un equipo con un volumen formateado específico.