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$Jespecíficamente —$Maxsolo 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:
- Salta la región sparse-zero inicial hasta el primer byte no nulo (inicio del primer registro).
- Avanza, leyendo el
RecordLengthde 4 bytes en cada offset para pasar al siguiente registro. - Para al primer grupo de 4 bytes nulos (fin de registros válidos).
- Para cada registro, valida que la versión major/minor sea
2.0y 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 journaltimestampMs(i64): FILETIME de Windows convertido a milisegundos Unix, UTCfilename(UTF-16 decodificado)fullPath(string o null): solo cuando se proporcionó$MFTy coincidióreasons(string[]): bitmaskReasonexpandido a nombres legiblesattributes(string[]): atributos NTFS marcados en el ficheromftEntry,mftSequence,parentMftEntry,parentMftSequence
La salida permanece en memoria del navegador hasta que cierras la pestaña.
Limitaciones
- Sin soporte de
USN_RECORD_V3aú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
$LogFiley 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.