Por motivos principalmente acadêmicos, tenho aprendido a interpretar a execução da cadeia de clusters do bloco de atributos de dados de um registro MFT de um volume NTFS.
Assisti a um vídeo que mostra um exemplo. Aqui está o exemplo:
Bandeiras | Contagem de clusters | Primeiro cluster
41
02
f8 38 c7 01
21
02
c5 07
31
04
83 43 01
21
08
c0 fc
31
10
44 0b 00
31
01
f7 ef f9
21
1f
c6 e7
21
10
6b 28
31
01
00 52 e4
Agora, o vídeo mostra algum software de edição de disco que está interpretando a saída hexadecimal. Isso é útil, porque o autor do vídeo pula completamente pelo menos 3 conceitos fundamentais:
- O campo "Primeiro cluster" é cumulativo. Fácil o suficiente para descobrir se você usar uma calculadora.
- O campo "First cluster" é um inteiro com sinal, para que possa navegar para trás no disco. Isso foi mais complicado de descobrir, mas eu entendi.
- O terceiro conceito completamente ignorado é quando o byte menos significativo do campo "First cluster" é zero. Como esses campos são interpretados como little-endian e como esse é um campo de comprimento flexível (os sinalizadores dizem quantos bytes), então por que você teria zeros à esquerda?
Então, aqui está como eu calculo.
Bandeiras | Contagem de clusters | Primeiro cluster
41
02
f8 38 c7 01
2 clusters começando no cluster # 29.833.464
21
02
c5 07
2 mais clusters começando em 1.989 de 29.833.464, que é o cluster # 29.835.453
31
04
83 43 01
Mais 4 clusters começando em 82.819 de 29.835.453, que é o cluster # 29.918.272
21
08
c0 fc
8 mais clusters começando em 832 antes de 29.918, 272, que é o cluster nº 29.917.440
31
10
44 0b 00
16 mais clusters começando em 2.884 de 29.917.440, que é o cluster # 29.920.324
É aqui que minha matemática se desvia da matemática deles. Eles dizem cluster # 29.840.452. Preciso de ajuda aqui.
31
01
f7 ef f9
21
1f
c6 e7
21
10
6b 28
31
01
00 52 e4
Como funciona a matemática quando você tem zeros à esquerda em um dos campos? Também tenho um exemplo separado em que os zeros à esquerda estão no campo "Contagem de clusters", não no campo "Primeiro cluster"; isso é tratado de forma diferente?"
Não é sua matemática que está errada, o cara demonstrando no vídeo está errado ou pelo menos ignora uma questão importante:
Ele trapaceia um pouco e apenas lê os valores dos valores interpretados da coluna à esquerda como se estivesse convertendo os valores que destaca na hora.
Mas seus valores convertidos práticos levam em consideração a matriz de sequência de atualização que ele não menciona.
Atualizar matriz de sequência e valor de correção
A execução com a qual você está tendo problemas não
31 10 44 0b 00
é . Se observarmos atentamente sua sequência de bytes no vídeo, veremos que os dois últimos bytes da execução são os dois últimos bytes em um setor de 512 bytes:Portanto 0b 00 não são os dois bytes que pertencem a esta execução, é o 'conserto'. Para obter os valores reais, você precisa lê-los no chamado 'Array de seqüência de atualização' para o qual o deslocamento é armazenado no deslocamento de byte 4 na entrada MFT (geralmente 0x30).
No deslocamento 0x30, você verá os bytes 0b 00 (o valor de correção), os próximos dois bytes serão os valores originais dos últimos dois bytes do primeiro setor da entrada da MFT, os próximos 2 os do próximo setor.
Vou ilustrar usando uma entrada MFT da minha unidade:
Então
31 10 44 0b 00
, na verdade, é31 10 44 xx xx
onde você substitui xx pelos bytes da matriz de sequência de atualização e, em seguida, faz suas contas.O objetivo dos valores de correção é detectar corrupção. Portanto, assim que lemos a entrada da MFT, verificamos o valor da correção e comparamos com os últimos 2 bytes de cada setor, eles devem corresponder, caso contrário, o setor está corrompido. Para realmente trabalhar com a entrada, precisamos primeiro corrigir o valor de correção com valores da matriz de sequência de atualização.
TBH, não tenho a menor ideia. Na época em que estava estudando isso, fiz isso para escrever um programa de recuperação de arquivos NTFS (além disso, redescobri seu código-fonte muito recentemente e recompilei para ver se ainda funcionaria. Funcionou ! )
De qualquer forma, o que quero dizer é que, quando descobri as execuções de dados, nunca mais as observei com muita atenção porque escrevi o código para lidar com elas.
Mas sim, você está certo. Mais uma vez, voltei-me para o meu próprio disco rígido e obtive esta entrada:
Assim obtemos:
E, de fato, os << zeros não fazem nenhuma diferença, tanto quanto eu posso ver. De fato, se pedirmos ao DMDE para interpretar a lista de execução, ele simplesmente ignora os zeros também:
Referência: https://flatcap.github.io/linux-ntfs/ntfs/concepts/file_record.html