Como interpretar um dump octal ou hexadecimal de um arquivo binário?

11

O arquivo binário tem seqüências de caracteres e alguns números, se eu fizer od -c filename ou strings filename , posso ver as cadeias corretamente. Mas e os números? Eles estão em algum formato estranho.

O texto depois de fazer od -c filename é assim:

0000000 036  
00000000  1e 00 1a 04 53 44 00 00  00 00 73 65 71 31 20 20  |....SD....seq1  |
00000010  20 20 00 00 00 00 00 00  00 00 09 00 f3 02 33 01  |  ..........ó.3.|
00000020  26 00 1a 0c 4f 32 06 00  00 00 6f 73 66 75 73 31  |&...O2....osfus1|
00000030  20 20 f3 02 33 01 ff 0d  00 00 09 00 00 40 33 d7  |  ó.3.ÿ......@3×|
00000040  9b ba 04 00 e9 03 00 00  26 00 1a 0c 4f 32 37 00  |.º..é...&...O27.|
00000050  00 00 6f 73 66 65 75 31  20 20 f3 02 33 01 e9 9d  |..osfeu1  ó.3.é.|
00000060  00 00 1d 03 00 40 33 d7  9b ba 04 00 d1 07 00 00  |.....@3×.º..Ñ...|
00000070  e4 00 1a 0c 4f 72 45 00  00 00 6f 73 66 61 70 31  |ä...OrE...osfap1|
032 004 S D
0000000 036  
00000000  1e 00 1a 04 53 44 00 00  00 00 73 65 71 31 20 20  |....SD....seq1  |
00000010  20 20 00 00 00 00 00 00  00 00 09 00 f3 02 33 01  |  ..........ó.3.|
00000020  26 00 1a 0c 4f 32 06 00  00 00 6f 73 66 75 73 31  |&...O2....osfus1|
00000030  20 20 f3 02 33 01 ff 0d  00 00 09 00 00 40 33 d7  |  ó.3.ÿ......@3×|
00000040  9b ba 04 00 e9 03 00 00  26 00 1a 0c 4f 32 37 00  |.º..é...&...O27.|
00000050  00 00 6f 73 66 65 75 31  20 20 f3 02 33 01 e9 9d  |..osfeu1  ó.3.é.|
00000060  00 00 1d 03 00 40 33 d7  9b ba 04 00 d1 07 00 00  |.....@3×.º..Ñ...|
00000070  e4 00 1a 0c 4f 72 45 00  00 00 6f 73 66 61 70 31  |ä...OrE...osfap1|
032 004 S D %pre% %pre% %pre% %pre% s e q 1 0000020 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% \t %pre% ó 002 3 001 0000040 & %pre% 032 \f O 2 006 %pre% %pre% %pre% o s f u s 1 0000060 ó 002 3 001 ÿ \r %pre% %pre% \t %pre% %pre% @ 3 × 0000100 233 º 004 %pre% é 003 %pre% %pre% & %pre% 032 \f O 2 7 %pre% 0000120 %pre% %pre% o s f e u 1 ó 002 3 001 é 235 0000140 %pre% %pre% 035 003 %pre% @ 3 × 233 º 004 %pre% Ñ \a %pre% %pre% 0000160 ä %pre% 032 \f O r E %pre% %pre% %pre% o s f a p 1
%pre% %pre% %pre% s e q 1 0000020 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% \t %pre% ó 002 3 001 0000040 & %pre% 032 \f O 2 006 %pre% %pre% %pre% o s f u s 1 0000060 ó 002 3 001 ÿ \r %pre% %pre% \t %pre% %pre% @ 3 × 0000100 233 º 004 %pre% é 003 %pre% %pre% & %pre% 032 \f O 2 7 %pre% 0000120 %pre% %pre% o s f e u 1 ó 002 3 001 é 235 0000140 %pre% %pre% 035 003 %pre% @ 3 × 233 º 004 %pre% Ñ \a %pre% %pre% 0000160 ä %pre% 032 \f O r E %pre% %pre% %pre% o s f a p 1

Como decifrar isso?

Eu até tentei hexdump -C filename

A saída é assim:

%pre%

Para esclarecer, o arquivo principal que é um arquivo regular tinha um atributo que estava exibindo algum formato estranho, então estamos olhando para o arquivo bruto / binário.

Fazendo o despejo octal no arquivo regular, resolveu o problema de visualização.

Com grep 'id=123' regular_file | head -1 | od -c , pude ver qual número estava lá. Eu estava esperando 1, mostrou-nos como 001.

    
por Gilles 07.03.2012 / 16:18

2 respostas

4

Existem muitas maneiras de armazenar números - ASCII (que pode ter variantes específicas do local, como ',' para separar a parte fracionária OR como um agrupamento de milhares), inteiro binário (número variável de bits) / float / double (todos os quais podem variar dependendo da arquitetura endian e se o software que produz o arquivo formaliza a representação), BCD (não compactado, compactado, ponto fixo e outras variantes), decimal codificado Bi-quinário ...

Não há padrão.

    
por 07.03.2012 / 16:38
17

Uma das primeiras coisas que tive que memorizar para a ciência da computação foi Data + Interpretation = Informações Úteis . Um corolário disto é que se você está perdendo dados ou interpretação, você não tem nada. Os dados em si não podem dizer como interpretá-lo. (você pode ter metadados que lhe dizem isso, mas você também precisa saber como interpretar os metadados )

Nas circunstâncias, sugiro tentar isso:

file filename

Se surgir algo como:

filename: data

e você absolutamente não sabe qual é o formato, de que programa é, o que é seu uso ou qualquer coisa sobre o conteúdo de filename , então provavelmente você deve desistir.

Saída de descarte de octal

od (octal dump) produz um dump híbrido text-and-octal. Os números não são caracteres imprimíveis, como o , s , f , etc, ou caracteres não imprimíveis, como NUL (ASCII 0, \a ) ou BEL (ASCII 7, 0 ), ou números na base 8, com o prefixo padrão C 032 (por exemplo, hexdump = 26 em decimal). Seu arquivo é interpretado como um fluxo de bytes de 8 bits .

Saída de despejo hexadecimal

. produz um dump hexadecimal tradicional, com uma coluna listando bytes de 8 bits em hexadecimal, a outra mostrando quais caracteres ASCII esses bytes correspondem ot, se houver (se o valor de byte for um caractere ASCII não imprimível ou não é um caractere ASCII, %code% é mostrado nessa posição). Novamente, seu arquivo é interpretado como um fluxo de bytes de 8 bits .

Inteiros

Se o seu arquivo contiver 100% de inteiros binários (ou seja, uma matriz unidimensional sem cabeçalho, de tipo uniforme de representação inteira), então você terá que responder a si mesmo todas estas questões:

Provavelmente, estou esquecendo mais agora.

E isso é apenas para um array unidimensional uniforme de inteiros, vindo de uma arquitetura moderna e comum de computador. Se os seus dados tiverem algum tipo de complexidade, as coisas ficarão tão complicadas que rapidamente se tornará mais fácil ganhar na loteria do que adivinhar o formato. E você tem para adivinhar (um palpite, mas um palpite), a menos que você saiba o formato.

    
por 07.03.2012 / 17:27