Metodologia

Como o USN Parser transforma um blob $J em registros estruturados — algoritmos, etapas de validação, limites conhecidos.

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$Max carrega 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:

  1. Pula a região esparsa de zeros inicial até o primeiro byte não nulo (início do primeiro registro).
  2. Avança, lendo o RecordLength de 4 bytes em cada offset para pular ao próximo registro.
  3. Para no primeiro grupo de 4 bytes nulos (fim dos registros válidos).
  4. Para cada registro, valida que a versão major/minor é 2.0 e 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 journal
  • timestampMs (i64): FILETIME do Windows convertido em milissegundos Unix, UTC
  • filename (UTF-16 decodificado)
  • fullPath (string ou null): apenas quando $MFT foi fornecido e bateu
  • reasons (string[]): bitmask Reason expandido em nomes legíveis
  • attributes (string[]): atributos NTFS marcados no arquivo
  • mftEntry, mftSequence, parentMftEntry, parentMftSequence

A saída permanece na memória do navegador até que você feche a aba.

Limites

  • Sem suporte a USN_RECORD_V3 ainda. 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 $LogFile e 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.