Skip to content

$LogFile: recuperar evidencias de archivos borrados

Qué conserva el $LogFile de NTFS tras un borrado: nombre, carpeta, entrada MFT, fechas, tamaños, data runs y a veces contenido. Cómo hallarlo y sus límites.

Publicado el 7 min de lectura

TL;DR. En $LogFile, un borrado suele verse como un DeleteIndexEntry* (el nombre desaparece de la carpeta padre) seguido de un DeallocateFileRecordSegment (se libera el registro FILE). Esos registros —más la creación del archivo, si sigue en el diario— te dan el nombre, la carpeta padre, la entrada de la MFT y el número de secuencia, las marcas de tiempo de $FILE_NAME y los tamaños, a menudo los últimos valores de $STANDARD_INFORMATION, a veces los data runs y, en archivos diminutos, el contenido. El diario no te da la hora del borrado; lo máximo que obtienes es «en ese momento o después de la última marca de tiempo conocida». Los archivos enviados a la Papelera de reciclaje son renombrados, no borrados.

Los archivos efímeros son los favoritos del atacante: descargar, descomprimir, ejecutar, borrar. Cuando llegas a adquirir el disco, el registro FILE ya se ha reutilizado, el slack de $I30 se ha sobrescrito y el diario USN dice FILE_DELETE con un nombre y nada más. $LogFile todavía puede conservar la estructura del archivo tal como NTFS la vio por última vez, durante los últimos minutos u horas.

Qué escribe un borrado en el diario

PasoOperaciónQué contienen los bytes
El nombre se elimina de la carpetaDeleteIndexEntryRoot o DeleteIndexEntryAllocationLa entrada de índice eliminada: referencia del archivo (entrada + secuencia) y un $FILE_NAME embebido con la referencia del padre, el nombre, las cuatro marcas de tiempo, el tamaño asignado y real, y los flags
Se libera el registro FILEDeallocateFileRecordSegmentEntrada afectada; la parte undo permite a NTFS restaurar el registro
Se borra el bit del bitmap de la MFTClearBitsInNonresidentBitMapQué entrada de la MFT quedó libre
Se liberan los clústeresClearBitsInNonresidentBitMap sobre $BitmapQué clústeres quedaron libres (archivos no residentes)

Cuál de las dos partes, redo o undo, contiene la entrada de índice eliminada es uno de los detalles que cada analizador resuelve a su manera; el analizador en el navegador prueba ambas. Las operaciones en sí se tratan en las operaciones redo/undo del $LogFile de NTFS.

Qué puedes reconstruir

Nombre y ubicación. A partir de la entrada de índice, aunque la creación ya no esté en el diario. El padre es una referencia MFT; resuélvela con el $MFT del mismo volumen o verás [MFT #n] para las carpetas desconocidas.

Identidad. Entrada de la MFT y número de secuencia. Cuando una entrada se reutiliza, NTFS incrementa su número de secuencia (como señala el readme de LogFileParser a propósito de su historial de nombres), así que entrada + secuencia distingue el archivo borrado de lo que ocupe hoy esa entrada.

Marcas de tiempo. Las de $FILE_NAME de la entrada de índice y, si el diario aún conserva registros anteriores de esa entrada, los últimos valores de $STANDARD_INFORMATION. Ninguna de ellas es la hora del borrado.

Tamaños. Tamaño asignado y real del $FILE_NAME de la entrada de índice. Tómalos con cautela: los tamaños de $FILE_NAME en las entradas de directorio no siempre están actualizados.

Data runs. Si la creación del archivo (InitializeFileRecordSegment, CreateAttribute) y los UpdateMappingPairs posteriores siguen en el diario, se pueden reconstruir sus runs de clústeres. LogFileParser lo implementa y documenta la recuperación de archivos borrados fragmentados cuyo registro FILE se había sobrescrito, siempre que los clústeres no se hayan reutilizado.

Contenido (solo archivos pequeños). Un archivo lo bastante pequeño para ser residente guarda su contenido dentro del registro FILE. Si la imagen del registro o el CreateAttribute de su $DATA sobreviven en el diario, el contenido también. Es cuestión de suerte: el autor de LogFileParser señala que en Windows moderno los cambios posteriores en datos residentes suelen registrar solo que hubo un cambio, no los bytes nuevos.

Hora del borrado: qué puedes afirmar y qué no

Los registros del diario no llevan reloj. Para un borrado, la mejor cota que da el diario por sí solo es «en el momento de la marca de tiempo más reciente conocida para ese archivo, o después», normalmente su último valor de modificación/cambio de $SI. El analizador en el navegador etiqueta esos eventos como «última hora conocida — borrado en ese momento o después».

Para obtener una hora real, correlaciona con:

  • el registro FILE_DELETE del diario USN para la misma referencia de archivo (analizador del diario USN);
  • un evento cercano del diario que sí lleve hora (ordenando por LSN);
  • eventos de Security o Sysmon sobre la actividad de procesos en ese intervalo (analizador EVTX).

Papelera de reciclaje: un movimiento, no un borrado

Borrar desde el Explorador sin Mayús mueve el archivo a $Recycle.Bin\<SID>\ con un nombre $R… y crea el archivo $I… correspondiente con la ruta original y la hora del borrado. En $LogFile esto aparece como un renombrado/movimiento hacia $Recycle.Bin más la creación del archivo $I, no como una liberación. La liberación real solo llega al vaciar la papelera. El archivo $I es pequeño y residente, así que su contenido también puede aparecer en el diario; analízalo como corresponde con el analizador de la Papelera de reciclaje.

Ejemplo práctico (muestra sintética)

En la muestra del analizador (sintética, equipo ficticio FIN-WKS-07):

LSNEventoDetalle
117494Creación\Users\svc_backup\Desktop\creds.txt, creación $FN 10:38:10.5119430
117577Datos residentes escritosPrimeros bytes del archivo (una nota de credenciales falsa marcada SYNTHETIC)
117610Cambio de $SIModificación / cambio / acceso → 10:38:27.7024018
117804BorradoMisma entrada; hora «última conocida — borrado en ese momento o después» 10:38:27.7024018

Entre la creación y el borrado, el diario muestra además un .lnk creado en Recent, una pista para el analizador LNK. En un caso real buscarías ahora el registro USN FILE_DELETE para fechar el borrado, y el contenido en cualquier otra copia (copias de seguridad, sincronización en la nube, memoria: analizador de RAM).

La misma muestra incluye también un borrado inocente: \Windows\Temp\~DF3A1B7C2E.TMP, creado y borrado en menos de un minuto. Los archivos temporales se crean y destruyen constantemente; la marca de borrado es una ayuda para el triaje, no un hallazgo.

Dónde falla

  • Retención. Un borrado de ayer en un volumen de sistema casi seguro que ya no está. Consulta hasta dónde llega el $LogFile.
  • Agrupación. Un borrado cuya creación quedó fuera del diario aporta menos datos; un analizador que agrupa por proximidad (como hace ahora el analizador en el navegador) puede asociar registros vecinos por error. Revisa los registros en bruto.
  • Entradas reutilizadas. Resolver rutas con un $MFT obtenido más tarde puede dar el nombre del nuevo ocupante de una entrada o de su padre. Compara los números de secuencia; el analizador en el navegador todavía no los comprueba al resolver rutas desde el $MFT.
  • Validación. El analizador en el navegador solo se ha validado con diarios sintéticos; confirma los borrados relevantes con LogFileParser o NTFS Log Tracker (comparativa).

Preguntas frecuentes

¿Puede el $LogFile mostrar archivos borrados?

Sí, si el borrado es lo bastante reciente como para seguir en el diario circular. La eliminación de la entrada de índice y la liberación del registro FILE contienen el nombre del archivo, la carpeta padre, la entrada de la MFT y el número de secuencia, las marcas de tiempo de $FILE_NAME y los tamaños.

¿Puedo recuperar el contenido de un archivo borrado desde el $LogFile?

Rara vez, y solo en archivos residentes pequeños cuyo contenido aparece en una imagen de registro FILE o en una creación de atributo que siga en el diario. En archivos más grandes, el diario puede conservar data runs que apuntan a clústeres, lo que ayuda al carving si esos clústeres no se reutilizaron.

Artículos relacionados

Artículos relacionados