← Volver al blog

Master File Table (MFT): la $MFT NTFS explicada

· 13 min de lectura

La Master File Table, escrita $MFT en disco, es el índice que NTFS utiliza para llevar la cuenta de cada archivo y carpeta de un volumen. Es el primer archivo visible para el usuario en cualquier partición NTFS, y todos los demás archivos del volumen — incluida la propia tabla — tienen al menos una entrada dentro de ella. Leer $MFT es la forma en que las herramientas forenses responden a preguntas sobre archivos cuya existencia Windows ya no reconoce: cuándo se crearon, cómo se llamaban, qué contenían y quién los tocó por última vez.

Esta guía es una referencia completa. Cubre qué es la tabla, cómo se disponen los registros, qué atributos puede llevar un registro, el pequeño conjunto de archivos de sistema reservados al inicio de la tabla, qué significa realmente «Windows no puede recuperar la master file table» y cómo leer $MFT tú mismo con el parser de este sitio.

Qué es la Master File Table

La Master File Table es un único archivo llamado $MFT situado en una ubicación fija cerca del inicio de cada volumen NTFS. NTFS — New Technology File System — se introdujo con Windows NT 3.1 en 1993 y reemplazó a FAT como sistema de archivos por defecto de Windows. A diferencia de FAT, que mantiene una pequeña tabla de asignación y guarda los nombres de archivo dentro de las entradas de directorio, NTFS coloca casi cada pieza de metadatos de cada archivo en una sola tabla estructurada: $MFT.

Cada fila de esa tabla es un registro de exactamente 1024 bytes. Cada registro describe un archivo o una carpeta. El registro contiene el nombre del archivo, sus marcas de tiempo, sus banderas de tipo DOS, la lista de clústeres de disco donde residen sus datos, los descriptores de seguridad y un puñado de otros atributos — todo codificado como un pequeño conjunto de campos tipados.

Este diseño tiene dos grandes consecuencias:

  1. Todos los metadatos están en un mismo sitio. Una sola búsqueda en $MFT basta para enumerar cada archivo del volumen. Las herramientas forenses y de recuperación dependen de esto; los antivirus y los servicios de indexación también.
  2. Los archivos eliminados dejan metadatos intactos. Cuando NTFS elimina un archivo, borra un bit en la cabecera del registro y marca los clústeres del archivo como libres. El resto del registro — el nombre, las marcas de tiempo, a menudo los data runs — permanece en su sitio hasta que se reutiliza esa posición.

La sigla MFT significa Master File Table. Lo verás escrito MFT, $MFT o la MFT. Todos se refieren a la misma estructura en disco.

Cómo se dispone $MFT en disco

Cuando NTFS formatea un volumen reserva una región llamada MFT zone cerca del inicio de la partición. El sector de arranque, en el desplazamiento 0 del volumen, contiene un puntero (el campo MftStartLcn) al primer clúster de $MFT. Los 16 primeros registros de la tabla están reservados para los archivos de metadatos de NTFS (descritos más abajo); el registro 0 es la entrada de la propia tabla, que apunta a sus propios clústeres.

$MFT crece extendiéndose hacia su zona reservada cuando necesita más registros. Si el volumen se llena antes de que se agote la zona, Windows reduce la zona para hacer sitio a los datos de usuario, motivo por el cual una $MFT muy fragmentada es un síntoma habitual en sistemas de archivos envejecidos.

Una copia de seguridad de los primeros registros vive en un segundo archivo, $MFTMirr, normalmente situado en mitad del volumen. Si la propia $MFT se corrompe, NTFS usa $MFTMirr para arrancar la recuperación — este es el mecanismo detrás del error «Windows no puede recuperar la master file table» descrito más adelante.

Anatomía de un registro FILE

Cada registro MFT comienza con la firma ASCII FILE de cuatro bytes. (Los registros corruptos usan en su lugar BAAD — una lápida deliberada escrita por chkdsk.) Tras la firma viene una cabecera fija, seguida de un flujo de atributos de longitud variable.

La cabecera del registro lleva:

  • FirmaFILE para un registro válido, BAAD para un registro que chkdsk no pudo reparar.
  • Número de secuencia de actualización (USN) y array fixup — un pequeño truco de checksum que permite a NTFS detectar escrituras interrumpidas. Los dos últimos bytes de cada bloque de 512 bytes del registro se reemplazan por el USN; los originales se guardan en el array fixup. En la lectura, NTFS verifica el USN y restaura los bytes originales.
  • Número de secuencia del log — puntero a $LogFile para la recuperación tras un fallo.
  • Número de secuencia — incrementado cada vez que se reutiliza el registro. Combinado con el número de registro forma una referencia de archivo de 64 bits que identifica de forma única una encarnación concreta de un archivo.
  • Contador de enlaces físicos — número de atributos $FILE_NAME que apuntan al registro.
  • Banderas — la más importante es el bit 0, IN_USE. A cero significa eliminado.
  • Referencia al registro base — distinta de cero en los registros de extensión que pertenecen a un registro base situado en otro lugar de la tabla.

Tras la cabecera vienen los atributos. Cada atributo tiene su propia cabecera corta (tipo, longitud, bandera residente/no residente, nombre si lo tiene) seguida de los datos. No hay un orden fijo, pero $STANDARD_INFORMATION suele ir el primero y $DATA el último.

Un registro que se queda sin espacio — demasiados fragmentos, demasiados ADS, un nombre inusualmente largo — desarrolla un atributo $ATTRIBUTE_LIST que apunta a uno o más registros de extensión en otro lugar de la tabla. Los parsers deben seguir la cadena para reconstruir el archivo completo.

Atributos de archivo almacenados en $MFT

Esta es la búsqueda más común tras la palabra clave «qué atributos de archivo se almacenan en la master file table». La lista completa de tipos de atributos NTFS, con sus códigos hexadecimales:

| Tipo | Hex | Propósito | |------|-----|-----------| | $STANDARD_INFORMATION | 0x10 | Cuatro marcas de tiempo (creación, modificación, acceso, modificación MFT), banderas DOS, ID de propietario, ID de seguridad, USN. | | $ATTRIBUTE_LIST | 0x20 | Puntero a registros de extensión cuando los atributos de un archivo desbordan un único registro. | | $FILE_NAME | 0x30 | Un nombre de archivo, una referencia a la carpeta padre, el tamaño asignado y real, y un segundo conjunto de cuatro marcas de tiempo. Un archivo puede tener varios — uno por enlace físico, uno para el nombre corto 8.3. | | $OBJECT_ID | 0x40 | Identificador de objeto de 128 bits usado por el servicio Distributed Link Tracking. | | $SECURITY_DESCRIPTOR | 0x50 | ACL por archivo (heredado). El NTFS moderno almacena las ACL de forma centralizada en $Secure y las referencia por ID desde $STANDARD_INFORMATION. | | $VOLUME_NAME | 0x60 | Solo en el registro 3 ($Volume). Contiene la etiqueta del volumen. | | $VOLUME_INFORMATION | 0x70 | Versión de NTFS, bandera dirty. | | $DATA | 0x80 | El contenido del archivo. Residente para archivos muy pequeños; no residente (una lista de cluster runs) en otro caso. Un archivo puede llevar varios $DATA — el que no tiene nombre es el flujo principal, los nombrados son flujos de datos alternativos. | | $INDEX_ROOT | 0x90 | Raíz de un árbol B+. Lo usan los directorios ($I30), los índices de puntos de reparse y otras estructuras indexadas. | | $INDEX_ALLOCATION | 0xA0 | Continuación no residente de un índice grande. | | $BITMAP | 0xB0 | Bitmap de asignación de la propia $MFT o de directorios grandes. | | $REPARSE_POINT | 0xC0 | Enlaces simbólicos, junctions, puntos de montaje, marcadores de OneDrive. | | $EA_INFORMATION / $EA | 0xD0 / 0xE0 | Atributos extendidos heredados de la era OS/2. Raros en el Windows moderno. | | $LOGGED_UTILITY_STREAM | 0x100 | Metadatos de cifrado EFS ($EFS), datos transaccionales TxF. |

Un registro siempre lleva como mínimo $STANDARD_INFORMATION, un $FILE_NAME y un $DATA. Todo lo demás es opcional y depende de funcionalidades específicas.

Datos residentes frente a no residentes

La mayoría de atributos $DATA en un volumen real son no residentes: la cabecera del atributo lleva una lista compacta de cluster runs (un LCN inicial más una longitud, repetidos) y los bytes del archivo viven en otro lugar del disco. La propia cabecera del atributo es pequeña.

Si el archivo es suficientemente pequeño — típicamente menos de ~700 bytes una vez contabilizados los demás atributos — NTFS almacena los bytes en línea dentro del registro. Eso son datos residentes, y es uno de los artefactos más útiles en el trabajo forense: el contenido de un pequeño archivo de texto eliminado hace semanas puede seguir, byte a byte, dentro de un registro $MFT desasignado. Véase resident-data para una mirada más profunda.

Archivos de metadatos NTFS en los primeros dieciséis registros

Los 16 primeros registros de $MFT están reservados para los archivos internos de NTFS. Empiezan por $ para no colisionar con los nombres de archivo de usuario. Los que conviene conocer:

| Reg. n.º | Archivo | Qué es | |----------|---------|--------| | 0 | $MFT | La propia tabla. | | 1 | $MFTMirr | Copia de seguridad de los primeros registros de $MFT. | | 2 | $LogFile | Registro de transacciones usado para deshacer o rehacer operaciones incompletas tras un fallo. | | 3 | $Volume | Etiqueta del volumen y bandera dirty. | | 4 | $AttrDef | Esquema de los tipos de atributo válidos. | | 5 | . | El directorio raíz. | | 6 | $Bitmap | Un bit por clúster del volumen; rastrea la asignación. | | 7 | $Boot | Copia del sector de arranque. | | 8 | $BadClus | Archivo sparse cuyos runs apuntan a cada clúster que el sistema de archivos ha marcado como defectuoso. | | 9 | $Secure | Almacén central de descriptores de seguridad. | | 10 | $UpCase | Tabla de mapeo Unicode a mayúsculas usada para la comparación de nombres insensible a mayúsculas. | | 11 | $Extend | Directorio que contiene los archivos de sistema más recientes: $ObjId, $Quota, $Reparse, $UsnJrnl, $RmMetadata. |

El diario de cambios $UsnJrnl (bajo $Extend) es especialmente útil en forense — registra cada cambio de metadatos del volumen y complementa a $MFT para la reconstrucción de líneas de tiempo. Véase usn-journal.

Cuando $MFT falla: corrupción y «Windows no puede recuperar la master file table»

El mensaje de error «Windows no puede recuperar la master file table. CHKDSK abortado» aparece cuando chkdsk no puede leer $MFT ni recurrir a $MFTMirr. Cuando ves este mensaje, NTFS ya lo ha intentado y ha fracasado en su autorreparación interna.

Causas raíz habituales:

  • Medio físico fallando. Sectores defectuosos en la MFT zone hacen que la lectura devuelva datos basura. Los datos SMART suelen corroborarlo.
  • Corte de corriente súbito durante una operación con muchos metadatos. El registro de transacciones normalmente hace rollback, pero un $LogFile corrupto frustra el mecanismo.
  • Corrupción a nivel de driver o filtro. Pilas de cifrado de disco mal hechas, minifiltros de sistema de archivos o drivers de almacenamiento con bugs pueden escribir registros inconsistentes.
  • Sobrescrituras maliciosas. Wipers y algunas familias de ransomware garabatean deliberadamente sobre $MFT para dificultar la recuperación del volumen.

La respuesta forense correcta es:

  1. Deja de escribir en el volumen de inmediato. Cada escritura adicional reduce las posibilidades de recuperación.
  2. Crea una imagen del disco con FTK Imager, dd o ddrescue hacia un destino sano. Verifica el hash.
  3. Trabaja sobre la imagen, no sobre el original. Prueba testdisk, R-Studio o un análisis manual que encuentre registros FILE escaneando el volumen por firma — incluso si el puntero en disco a $MFT ha desaparecido, los propios registros normalmente siguen siendo reconocibles.
  4. Si el objetivo es volver a poner el volumen en línea en lugar de recuperar datos, solo entonces ejecuta chkdsk /f sobre la imagen.

chkdsk /b sobre un volumen escribible puede borrar los marcadores de clústeres defectuosos, pero también puede descartar registros que no comprende. Ejecútalo sobre el original solo después de tener una imagen y haber decidido que la disponibilidad pesa más que la fidelidad forense.

Cómo leer $MFT

Tienes tres opciones realistas:

  • MFTECmd (Eric Zimmerman) — una CLI de Windows que produce CSV en la disposición compatible con bodyfile que esperan la mayoría de herramientas de línea de tiempo. El estándar de facto para los equipos de respuesta a incidentes.
  • omerbenamram/mft — un crate de Rust y una CLI. El mismo parser que usa este sitio, útil cuando quieres scriptar un análisis o integrarlo en una tubería más amplia.
  • El parser en el navegador de este sitio — suelta $MFT en la página de inicio y ejecuta el mismo parser Rust, compilado a WebAssembly, íntegramente en tu navegador. Nada se sube. Útil cuando quieres una lectura rápida sin instalar nada o cuando la política prohíbe enviar evidencias a un servicio en la nube.

Si necesitas una comparativa de los tres con pros y contras concretos, véase mft-parser-tools. Para flujos de trabajo prácticos sobre una $MFT ya analizada, véase build-mft-timeline, deleted-files y extracting-mft.

Preguntas frecuentes

¿Qué significa MFT?

MFT significa Master File Table. En disco también se escribe $MFT porque, en NTFS, el signo dólar prefija los nombres de los archivos de metadatos.

¿Para qué sirve la master file table?

Es el índice que NTFS utiliza para encontrar cada archivo y carpeta de un volumen. Cada entrada almacena el nombre del archivo, sus marcas de tiempo, su información de seguridad, sus atributos y la ubicación de sus datos en disco.

¿Qué atributos de archivo se almacenan en la master file table?

Como mínimo, cada registro lleva $STANDARD_INFORMATION (marcas de tiempo, banderas DOS), $FILE_NAME (nombre y un segundo conjunto de marcas de tiempo) y $DATA (el contenido del archivo o un puntero a él). Los registros también pueden llevar $ATTRIBUTE_LIST, $OBJECT_ID, $SECURITY_DESCRIPTOR, $INDEX_ROOT, $INDEX_ALLOCATION, $BITMAP, $REPARSE_POINT, $EA y $LOGGED_UTILITY_STREAM según el archivo. La referencia completa está en la tabla de atributos más arriba.

¿Qué tamaño tiene la master file table?

Cada registro ocupa 1024 bytes. La tabla reserva aproximadamente el 12,5 % del volumen por defecto (la MFT zone) pero solo consume el espacio que realmente necesita. Un volumen con un millón de archivos tiene una $MFT de aproximadamente 1 GB.

¿Es lo mismo $MFT que $MFTMirr?

No. $MFTMirr es una copia parcial de los primeros registros de $MFT, colocada en otro lugar del disco para que NTFS pueda arrancar la recuperación si la cabecera de la tabla principal está corrupta.

¿Cómo reparo una master file table corrupta?

Crea primero una imagen del disco. Después, o bien ejecuta chkdsk /f sobre la imagen (rápido, puede descartar registros), o usa una herramienta de recuperación capaz de escanear firmas FILE y reconstruir la tabla a partir de clústeres en bruto (lento, preserva más evidencia). Nunca ejecutes chkdsk sobre el volumen original antes de la imagen.

¿Puedo leer $MFT en Linux o macOS?

Sí. $MFT es solo un archivo. Cualquier parser que acepte un volcado crudo de $MFT funciona en cualquier OS — omerbenamram/mft, analyzeMFT, la herramienta en el navegador de este sitio. Solo necesitas Windows para extraer el archivo de un volumen montado en vivo.

Recursos externos