Metodología

Cómo USN Parser convierte un blob $J en registros estructurados — algoritmos, pasos de validación, limitaciones conocidas.

Esta página documenta lo que USN Parser hace a tu entrada, por qué se puede confiar en la salida y dónde están los límites. Sirve para una cadena de custodia forense — si citas USN Parser en un informe, esta es la página a referenciar.

Entradas

  • $UsnJrnl:$J: obligatorio. Flujo de datos alternativo sparse extraído de la raíz del volumen \$Extend\$UsnJrnl. Debe ser el flujo $J específicamente — $Max solo lleva el dimensionado del journal.
  • $MFT: opcional. La Master File Table del mismo volumen. Se usa únicamente para resolver referencias de directorio padre a rutas completas.

Ambos ficheros se leen en memoria y se pasan al parser WebAssembly. El navegador entrega el buffer de bytes al worker vía postMessage con una lista de transferencia explícita, lo que es más rápido y evita copias accidentales en memoria.

Algoritmo de parseo

Compilamos usnrs (Airbus CERT, Apache-2.0) a wasm32-unknown-unknown. Implementa la estructura USN_RECORD_V2 documentada en la referencia NTFS de Microsoft.

El lector:

  1. Salta la región sparse-zero inicial hasta el primer byte no nulo (inicio del primer registro).
  2. Avanza, leyendo el RecordLength de 4 bytes en cada offset para pasar al siguiente registro.
  3. Para al primer grupo de 4 bytes nulos (fin de registros válidos).
  4. Para cada registro, valida que la versión major/minor sea 2.0 y decodifica la cabecera de tamaño fijo más el nombre de fichero de longitud variable.

Cuando se proporciona un $MFT, resolvemos rutas completas recorriendo la cadena de referencias parentales. Solo confirmamos una ruta completa cuando el nombre hoja resuelto coincide con el filename del journal — evitando que una entrada MFT obsoleta produzca una ruta con falsa confianza.

Salida

Cada registro expone:

  • usn (u64): posición en el journal
  • timestampMs (i64): FILETIME de Windows convertido a milisegundos Unix, UTC
  • filename (UTF-16 decodificado)
  • fullPath (string o null): solo cuando se proporcionó $MFT y coincidió
  • reasons (string[]): bitmask Reason expandido a nombres legibles
  • attributes (string[]): atributos NTFS marcados en el fichero
  • mftEntry, mftSequence, parentMftEntry, parentMftSequence

La salida permanece en memoria del navegador hasta que cierras la pestaña.

Limitaciones

  • Sin soporte de USN_RECORD_V3 aún. V3 (referencias de fichero de longitud variable, introducidas con ReFS) no se produce en volúmenes NTFS estándar, así que rara vez importa en la práctica.
  • El wrap del ring buffer es invisible: no sabemos qué se sobrescribió antes del registro más antiguo. Crúzalo con $LogFile y Volume Shadow Copies si necesitas historia más antigua.
  • Sin validación de timestamps: confiamos en el FILETIME del registro. Para detectar timestomping, el post SI vs FN describe la verificación cruzada estándar contra $MFT.

Cadena de custodia

Si necesitas una referencia para un informe: la versión de USN Parser es identificable desde el hash de commit desplegado al pie del repositorio GitHub. El artefacto wasm es reproducible desde el fuente vía wasm-pack build --release; el hash del .wasm es estable por revisión de código.