Introdução
Um despejo hexadecimal é uma exibição hexadecimal de dados. Você pode querer usar hexadecimal ao depurar um programa ou fazer engenharia reversa de um programa.
Por exemplo, muitos formatos de arquivo têm caracteres hexadecimais específicos para indicar seu tipo. Se você estiver tentando ler um arquivo usando um programa e, por algum motivo, ele não estiver sendo carregado corretamente, pode ser que o arquivo não esteja no formato esperado.
Se você quiser ver como um programa funciona e você não tem o código-fonte ou parte do software que reverte os engenheiros do código, você pode olhar para o despejo hexadecimal para tentar descobrir o que está acontecendo.
O que é hexadecimal?
Computadores pensam em binário. Cada caractere, número e símbolo é referenciado por um valor binário ou vários valores binários.
Os seres humanos, no entanto, tendem a pensar em decimal.
Milhares | Centenas | Dezenas | Unidades |
1 | 0 | 1 | 1 |
Como seres humanos, nossos números mais baixos são chamados de unidades e representam os números de 0 a 9. Quando chegamos a 10, redefinimos a coluna de unidades de volta para 0 e adicionamos 1 à coluna de dezenas (10).
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
Em binário, o menor número representa apenas 0 e 1. Quando passamos 1, colocamos 1 na coluna 2 e 0 na 1 coluna. Quando você quiser representar 4, coloque 1 na coluna 4 e redefina as colunas 2 e 1.
Portanto, para representar 15, você teria 1111, que representa 1 oito, 1 quatro, 1 dois e 1 um. (8 + 4 + 2 + 1 = 15).
Se visualizássemos um arquivo de dados em formato binário, seria absolutamente imenso e virtualmente impossível fazer sentido.
A próxima etapa do binário é a octal, que usa 8 como o número base.
24 | 16 | 8 | 1 |
0 | 1 | 1 | 0 |
Em um sistema octal a primeira coluna vai de 0 a 7, a segunda coluna é 8 a 15, a terceira coluna 16 a 23 e a quarta coluna 24 a 31 e assim por diante. Embora geralmente mais fácil de ler do que o binário, a maioria das pessoas prefere usar hexadecimal.
O hexadecimal usa 16 como o número base. Agora é aí que fica confuso porque, como humanos, pensamos em números de 0 a 9.
Então, o que é usado para 10, 11, 12, 13, 14, 15? A resposta é letras.
- 0 = 0
- 1 = 1
- 2 = 2
- 3 = 3
- 4 = 4
- 5 = 5
- 6 = 6
- 7 = 7
- 8 = 8
- 9 = 9
- 10 = A
- 11 = B
- 12 = C
- 13 = D
- 14 = E
- 15 = F
O valor 100 é, portanto, representado por 64. Você precisará de 6 da coluna 16s, que traz 96 e, em seguida, 4 na coluna de unidades, totalizando 100.
Todos os caracteres em um arquivo serão denotados por um valor hexadecimal. O que esses valores significam depende do formato do arquivo em si. O formato do arquivo é denotado por valores hexadecimais que geralmente são armazenados no início do arquivo.
Com o conhecimento da seqüência de valores hexadecimais que aparecem no início dos arquivos, você pode descobrir manualmente em que formato o arquivo se encontra. Exibir um arquivo em um despejo hexadecimal pode ajudá-lo a localizar caracteres ocultos que não são exibidos quando o arquivo é carregado em um editor de texto normal.
Como criar um despejo hexadecimal usando o Linux
Para criar um dump hexadecimal usando o Linux, use o comando hexdump.
Para exibir um arquivo como hexadecimal no terminal (saída padrão), execute o seguinte comando:
nome do arquivo hexdump
Por exemplo
hexdump image.png
A saída padrão exibirá o número da linha (no formato hexadecimal) e, em seguida, 8 conjuntos de 4 valores hexadecimais por linha.
Por exemplo:
00000000 5089 474e 0a0d 0a1a 0000 0d00 4849 5244
Você pode fornecer diferentes opções para alterar a saída padrão. Por exemplo, especificar a opção menos b produzirá um deslocamento de 8 dígitos seguido por 16 bytes de entrada de três colunas, preenchidos com zero, no formato octal.
hexdump -b image.png
Portanto, o exemplo acima será agora representado da seguinte forma:
00000000 211 120 116 107 015 012 032 012 000 000 000 015 111 110 104 122
O formato acima é conhecido como exibição octal de um byte.
Outra maneira de visualizar o arquivo é na exibição de caracteres de um byte usando a opção menos c.
hexdump -c image.png
Isso exibe novamente o deslocamento, mas esse tempo é seguido por dezesseis caracteres espaçados, três colunas, preenchidos com espaço de dados de entrada por linha.
Outras opções incluem o display hexagonal + ascii da Canonical, que pode ser exibido usando o interruptor C negativo e a exibição decimal de dois bytes, que pode ser exibida usando a opção menos d. O interruptor menos o pode ser usado para exibir a exibição octal de dois bytes. Finalmente, o interruptor minux x pode ser usado para exibir o display hexadecimal de dois bytes.
hexdump -C image.png
hexdump -d image.png
hexdump -o image.png
hexdump -x image.png
Se nenhum dos formatos acima atender às suas necessidades, use a opção menos e para especificar o formato.
Se você sabe que um arquivo de dados é muito longo e deseja apenas ver os primeiros caracteres para determinar seu tipo, você pode usar a opção -n para especificar quanto do arquivo exibir em hexadecimal.
hexdump -n100 image.png
O comando acima exibe os primeiros cem bytes.
Se você deseja pular uma parte do arquivo, você pode usar a opção menos s para definir um deslocamento para começar.
hexdump -s10 image.png
Se você não fornecer um nome de arquivo, o texto será lido a partir da entrada padrão.
Basta digitar o seguinte comando:
hexdump
Em seguida, insira o texto na entrada padrão e finalize digitando quit. O hex será exibido para a saída padrão.
Resumo
O utilitário hexdump é obviamente uma ferramenta bastante poderosa e você deve definitivamente ler a página de manual para se familiarizar completamente com todos os recursos.
Você também precisa ter uma boa compreensão do que está procurando ao ler a saída.
Para visualizar a página de manual, execute o seguinte comando:
homem hexdump