← Voltar ao blog

Como extrair $UsnJrnl:$J de uma imagem de disco (ou um sistema ativo)

Guia prático para retirar o journal USN do NTFS de uma imagem forense, de um volume montado ou de um host Windows ativo — com FTK Imager, X-Ways, The Sleuth Kit, fsutil e PowerShell.

4 min de leitura

A parte mais difícil de trabalhar com o journal USN muitas vezes não é fazer o parsing — é pôr a mão no arquivo. $UsnJrnl:$J é um fluxo de dados alternativo, não um arquivo comum: ele não aparece no Explorador e não sobrevive a um copy ingênuo. Este artigo percorre os caminhos realistas para extraí-lo nos três contextos em que ele é encontrado: uma imagem forense, um volume montado e uma máquina viva.

O que você está procurando

O journal vive no caminho:

\$Extend\$UsnJrnl:$J

$Extend é um diretório de metadados NTFS oculto, e $J é um dos dois fluxos alternativos do arquivo de metadados $UsnJrnl (o outro, $Max, só guarda metadados de tamanho). A Microsoft documenta o layout na referência interna do NTFS e na estrutura USN_RECORD_V2.

Um $J real costuma ter de 30 MB a vários GB, dependendo de como o fsutil usn foi configurado.

A partir de uma imagem forense (E01, dd, AFF4)

É o caso mais comum em DFIR.

FTK Imager (gratuito, GUI)

  1. Abrir a imagem (File → Add Evidence Item).
  2. Navegar até [root]/$Extend/$UsnJrnl.
  3. Botão direito no fluxo $JExport Files.

O FTK Imager trata fluxos alternativos como entradas de primeira classe — aparecem como linhas irmãs ao lado do arquivo. Selecione especificamente a linha $J (não $Max).

X-Ways Forensics (comercial)

O X-Ways expõe o mesmo caminho. Na árvore de diretórios, expandir Root directory → $Extend → $UsnJrnl, selecionar o fluxo $J e fazer Recover/Copy.

The Sleuth Kit (gratuito, CLI, multiplataforma)

É a escolha da maioria dos analistas em Mac/Linux. A ferramenta relevante é icat do TSK:

# Encontrar a entrada MFT de $UsnJrnl
fls -r -p image.dd | grep '\$UsnJrnl'
# Suponha inode 81 e fluxo $J no atributo 128-2:
icat image.dd 81-128-2 > UsnJrnl-J.bin

O trio <inode>-<type>-<id> é o modo como o TSK endereça fluxos alternativos. O type/id que você quer é o do atributo cujo nome termina em :$Jfls mostra isso na saída longa.

Velociraptor / KAPE

Para coletas amplas de triagem, o artefato Windows.NTFS.MFT do Velociraptor e o KAPE sabem puxar o journal automaticamente. KAPE usa targets (!ALL ou USNJournal); Velociraptor usa o plugin parse_ntfs.

A partir de um volume montado

Se a imagem estiver montada (somente leitura, via mount -t ntfs-3g ou Arsenal Image Mounter no Windows), o caminho aparece como arquivo comum, mas a maioria das ferramentas se recusa a ler fluxos alternativos de forma transparente.

No Linux com ntfs-3g, dá para ler o fluxo diretamente:

sudo cat '/mnt/image/$Extend/$UsnJrnl:$J' > UsnJrnl-J.bin

Dependendo da opção de mount streams_interface, :$J pode aparecer como componente de caminho separado em vez de sufixo — verificar com ls -la /mnt/image/\$Extend/.

A partir de um host Windows ativo

Você precisa de privilégios administrativos e de um leitor consciente de NTFS, porque o Windows bloqueia o acesso comum a arquivos de metadados.

PowerShell com leitura raw do volume

As ferramentas de Eric Zimmerman incluem RawCopy.exe (ou RawCopy64.exe), que contorna a API de arquivos padrão:

RawCopy.exe /FileNamePath:"C:\$Extend\$UsnJrnl:$J" /OutputPath:"D:\Out"

Se você não pode deixar binário, PowerForensics faz o mesmo em PowerShell puro:

Import-Module PowerForensics
Get-ForensicFileRecord -Path 'C:\$Extend\$UsnJrnl' |
  ForEach-Object { $_.GetContent() } |
  Set-Content -Path 'C:\Out\UsnJrnl-J.bin' -Encoding Byte

fsutil nativo

fsutil usn é a superfície de controle suportada para o journal, mas não é ferramenta de extração — sabe ler, consultar e apagar registros, não streamar o blob completo $J. É útil para verificar se o journal está ativado e dimensionado corretamente antes da extração:

fsutil usn queryjournal C:

Status: 0x00000000 com Maximum Size diferente de zero indica journal ativo. Um 0x80000005 ou similar significa que o journal está desativado e não há nada para extrair — ver a referência de fsutil usn para os comandos de ciclo de vida.

Após a extração

Com o arquivo $J em mãos, você o solta neste site ou o passa para a ferramenta de sua escolha. Os bytes esculpidos são exatamente a entrada esperada por parsers como usnrs, PoorBillionaire/USN-Journal-Parser ou MFTECmd do Eric Zimmerman.

Se você pegar também o $MFT (mesma vizinhança $Extend, entrada MFT 0), poderá resolver caminhos completos em vez de apenas nomes — ver o mecanismo de resolução de caminho em usnrs e a entrada $MFT do nosso parser.

Armadilhas comuns

  • Copiar com o Explorador: o arrastar-e-soltar de $UsnJrnl copia silenciosamente o fluxo sem nome (vazio) e não $J. Use sempre uma ferramenta forense.
  • Journal desativado: máquinas em workgroup às vezes têm o journal desativado. fsutil usn queryjournal é a verificação mais barata.
  • $J começa com zeros esparsos: o journal é um fluxo sparse — os primeiros centenas de MB podem ser só zeros antes do primeiro registro real. usnrs, nosso parser e a maioria dos outros pulam automaticamente. Para escrever seu próprio parser, Skip::find_first_record em usnrs é a implementação de referência mais curta.
  • Wrapping do fluxo: dependendo da atividade do volume, o ring buffer do journal pode ter virado — entradas mais antigas foram embora. O menor USN encontrado indica até onde vai o histórico disponível.