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)
- Abrir a imagem (
File → Add Evidence Item). - Navegar até
[root]/$Extend/$UsnJrnl. - Botão direito no fluxo
$J→ Export 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 :$J — fls 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
$UsnJrnlcopia 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. $Jcomeç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_recordem 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.