Esta página documenta o que o USN Parser faz com sua entrada, por que confiamos na saída e onde estão os limites. Serve para apoiar uma cadeia de custódia forense — se você citar o USN Parser num relatório, esta é a página de referência.
Entradas
$UsnJrnl:$J: obrigatório. Um fluxo de dados alternativo esparso extraído da raiz do volume\$Extend\$UsnJrnl. Precisa ser especificamente o fluxo$J—$Maxcarrega apenas o dimensionamento do journal.$MFT: opcional. A Master File Table do mesmo volume. Usada exclusivamente para resolver as referências dos diretórios pais em caminhos completos.
Ambos os arquivos são lidos em memória e passados para o parser WebAssembly. O navegador entrega o buffer de bytes ao worker via postMessage com uma lista de transferência explícita — mais rápido e sem cópias acidentais ficando em memória.
Algoritmo de parsing
Compilamos usnrs (Airbus CERT, Apache-2.0) para wasm32-unknown-unknown. Implementa a estrutura USN_RECORD_V2 documentada na referência NTFS da Microsoft.
O leitor:
- Pula a região esparsa de zeros inicial até o primeiro byte não nulo (início do primeiro registro).
- Avança, lendo o
RecordLengthde 4 bytes em cada offset para pular ao próximo registro. - Para no primeiro grupo de 4 bytes nulos (fim dos registros válidos).
- Para cada registro, valida que a versão major/minor é
2.0e decodifica o cabeçalho fixo mais o nome de arquivo de tamanho variável.
Quando um $MFT é fornecido, resolvemos caminhos completos percorrendo a cadeia de referências dos pais. Só consolidamos um caminho completo quando o nome folha resolvido bate com o filename do journal — evitando que uma entry MFT obsoleta produza um caminho com falsa confiança.
Saída
Cada registro expõe:
usn(u64): posição no journaltimestampMs(i64): FILETIME do Windows convertido em milissegundos Unix, UTCfilename(UTF-16 decodificado)fullPath(string ou null): apenas quando$MFTfoi fornecido e bateureasons(string[]): bitmaskReasonexpandido em nomes legíveisattributes(string[]): atributos NTFS marcados no arquivomftEntry,mftSequence,parentMftEntry,parentMftSequence
A saída permanece na memória do navegador até que você feche a aba.
Limites
- Sem suporte a
USN_RECORD_V3ainda. V3 (referências de arquivo de tamanho variável, introduzidas com ReFS) não é produzido em volumes NTFS padrão, então raramente importa na prática. - O wrap do ring buffer é invisível: não sabemos o que foi sobrescrito antes do registro mais antigo. Cruze com
$LogFilee Volume Shadow Copies se precisar de histórico mais antigo. - Sem validação de timestamps: confiamos no FILETIME do registro. Para detectar timestomping, o post SI vs FN descreve o cross-check padrão contra o
$MFT.
Cadeia de custódia
Se você precisa de uma referência para um relatório: a versão do USN Parser é identificável pelo commit hash exposto no rodapé do repositório GitHub. O artefato wasm é reprodutível a partir do código via wasm-pack build --release; o hash do .wasm é estável por revisão de código.