← Volver al blog

Anatomía de un registro MFT: firma, cabecera y atributos

· 5 min de lectura

Cada entrada de la Master File Table ocupa 1024 bytes dispuestos siempre de la misma manera: una cabecera fija, una pequeña estructura de reparación, y luego un flujo de atributos tipados. Este artículo es una mirada de cerca a esa disposición — el nivel de detalle que necesitas cuando lees $MFT byte a byte en un editor hexadecimal o cuando escribes tu propio parser.

La firma FILE

Los cuatro primeros bytes de cada registro contienen la cadena ASCII FILE (46 49 4C 45). Los parsers la usan como ancla cuando escanean un volumen crudo en busca de registros huérfanos: cada frontera de 1024 bytes que comienza por FILE es un registro MFT, incluso si la cabecera de la propia tabla es ilegible.

Un registro cuyo contenido chkdsk no pudo reparar lleva en su lugar la firma BAAD (42 41 41 44). NTFS conserva estos registros en lugar de borrarlos — preservan el número de secuencia de la posición — pero el resto de los bytes no son de fiar.

La cabecera del registro

Los 56 bytes siguientes a la firma describen qué tipo de registro es y cómo leerlo con seguridad:

  • Desplazamiento del array de secuencia de actualización (2 bytes) y tamaño del array en palabras de 16 bits (2 bytes). Juntos describen los datos de fixup; véase más abajo.
  • Número de secuencia de $LogFile (8 bytes). Apunta al registro de transacciones para la recuperación tras fallo.
  • Número de secuencia (2 bytes). Se incrementa cada vez que se reutiliza la posición del registro.
  • Contador de enlaces físicos (2 bytes). Uno por cada atributo $FILE_NAME.
  • Desplazamiento al primer atributo (2 bytes).
  • Banderas (2 bytes). El bit 0 es IN_USE; el bit 1 marca un directorio.
  • Tamaño usado (4 bytes) y tamaño asignado (4 bytes) del registro. El tamaño asignado siempre vale 1024 en volúmenes estándar.
  • Referencia al registro base (8 bytes). Distinta de cero en los registros de extensión — posiciones extra usadas cuando los atributos de un archivo desbordan un único registro.
  • Próximo ID de atributo (2 bytes). Se usa para asignar ID únicos a los nuevos atributos.
  • Número de registro (4 bytes, NTFS 3.1+). Autorreferencia, útil para verificar la integridad del análisis.

El número de secuencia es lo que hace fiable el análisis de archivos eliminados. El número de registro por sí solo se reutiliza; la referencia de archivo de 64 bits (número de registro más número de secuencia) no. Una referencia que no coincide con la secuencia actual de ese número de registro es un puntero a un inquilino anterior — normalmente un archivo eliminado.

El array fixup

NTFS detecta las escrituras interrumpidas mediante un pequeño truco llamado array de secuencia de actualización (USA), o array fixup. Cada registro de 1024 bytes también se divide en dos sectores de 512 bytes. NTFS:

  1. Elige un número de secuencia de actualización (USN — sin relación con el USN de $UsnJrnl pese al acrónimo compartido) de 16 bits.
  2. Reemplaza los dos últimos bytes de cada sector de 512 bytes por ese USN antes de escribir.
  3. Almacena los dos últimos bytes originales de cada sector en el array fixup, en orden, justo después del propio USN.

En la lectura, NTFS comprueba que los dos últimos bytes de cada sector coincidan con el USN. Si coinciden, los sectores se escribieron juntos; los bytes originales se recuperan del array fixup y se vuelven a colocar en su sitio. Si la cola de algún sector no coincide, la escritura fue interrumpida y el registro es sospechoso.

Esto significa que un parser que lea $MFT byte a byte sin aplicar los fixups obtendrá datos basura en los desplazamientos 510 y 1022 de cada registro. Todo parser MFT serio aplica el fixup como primer paso tras localizar un registro.

El flujo de atributos

Tras la cabecera (y el array fixup) vienen los atributos del archivo. Cada atributo empieza por su propia cabecera corta — código de tipo, longitud, bandera residente o no residente, nombre opcional — seguida de los datos del atributo. Los atributos se alinean a 8 bytes, se escriben uno tras otro y se terminan con un centinela 0xFFFFFFFF.

Un registro mínimo lleva tres:

  • $STANDARD_INFORMATION (0x10) — marcas de tiempo y banderas DOS.
  • $FILE_NAME (0x30) — nombre, referencia a la carpeta padre y un segundo conjunto de marcas de tiempo.
  • $DATA (0x80) — el contenido del archivo, residente en línea para archivos pequeños o una lista de cluster runs en otro caso.

Los registros pueden llevar muchos más, incluido $ATTRIBUTE_LIST cuando los atributos del archivo desbordan una sola posición de 1024 bytes. La lista completa está en la referencia de la Master File Table.

Por qué esto importa en forense

La combinación de una disposición estable de 1024 bytes y la firma FILE es lo que hace posible el carving de archivos NTFS eliminados. Aunque la propia $MFT haya desaparecido, un escaneo del volumen crudo en busca de cabeceras FILE recupera la mayoría de los registros — incluidos los nombres, las marcas de tiempo y (para los archivos pequeños) los datos de las entradas eliminadas. El mecanismo de fixup permite confiar en los registros carved siempre que la USA verifique.

Recursos externos