Hex Dump Com O xxd

Introdução

O comando xxd é mais um comando do *nix para fazer hex dump em um arquivo. Esse comando lê um arquivo ou a entrada padrão e reproduz os seus bytes na base hexadecimal. Eu sei que o velho conhecido hexdump faz muito bem essa tarefa, mas a vantagem do xxd é que ele é fácil de usar e ainda mostra os caracteres imprimíveis em uma coluna a parte.

Onde, como e para quê usar hex dump

Vasculhar um arquivo binário em sua forma hexadecimal é útil para obtermos algumas informações até então escondidas na estrutura desse arquivo. Por exemplo, as informações de um arquivo mp3 como artista, nome da música, album, etc ficam localizadas no próprio arquivo. Uma forma de ver essas informações na unha é abrindo esse mp3 em um editor de texto, mas quando fazemos isso, dificilmente vemos as informações que queremos, pois elas estarão embaralhadas junto com caracteres estranhos.

Então, uma forma melhor de fazer essa tarefa é usar um hex dump, como o xxd. Observe abaixo a saída do xxd em cima de um arquivo mp3:

hexdump funkadelic

Como usei o formato ID3v1 nesse arquivo, as informações da música ficam nos últimos 128 bytes. Podemos ver acima o nome da banda, do album e da música.

Arquivos mp3 foram citados como exemplo. Vendo a estrutura de arquivos binários em hexadecimal podemos encontrar informações úteis e algumas até curiosas, como senhas ou o serial de programas pagos.

Usando o comando xxd através de exemplos

Agora vamos para a parte prática. Aqui irei explicar algumas opções desse programa. Para maiores informações, a man page do mesmo está recheado delas.

Uma coisa de se notar é que o xxd utiliza uma avaliação preguiçosa (= lazy parser) de seus parâmetros na linha de comando. Isso implica que determinadas opções só devem vir antes ou depois de outras. Então, caso você use várias opções e o programa não retorna o resultado desejado, troque as opções de lugar até dá certo. :|

1) hex dump de uma entrada

$ echo 'http://daemonio.wordpress.com' | xxd
0000000: 6874 7470 3a2f 2f64 6165 6d6f 6e69 6f2e  http://daemonio.
0000010: 776f 7264 7072 6573 732e 636f 6d0a       wordpress.com.

O comportamento padrão do programa é mostrar a entrada na forma hexadecimal.

O xxd também consegue fazer o processo inverso: dado uma entrada em hexadecimal, o programa consegue convertê-la em sua forma “normal”. Isso é útil para burlar protetores de links que “criptografam” a url no formato hex. Para isso, bastar usarmos a opção -r (reverse):

$ echo 'http://daemonio.wordpress.com' | xxd | xxd -r
http://daemonio.wordpress.com

$ echo '687474703a2f2f7777772e6d65676175706c6f61642e636f6d2f3f69643d58585858580a' | xxd -r -p
http://www.megaupload.com/?id=XXXXX
:)

2) Opção -p: formato mais simples

Usando a opção -p, a entrada não é colocada na tela, somente a saída em hexadecimal.

$ echo 'http://www.google.com.br' | xxd -p
687474703a2f2f7777772e676f6f676c652e636f6d2e62720a

3) Parar quando ler L bytes

Com a opção -l indicamos quantos bytes serão lidos da entrada e gerar o hex dump somente dessa quantidade.

$ echo 'slackware' | xxd -p -l 5 | xxd -r -p
slack

4) C-style array

Se você passar a opção -i para o programa, ele converterá cada byte em hexadecimal e utilizará esse byte como um elemento de um array em C.

$ echo linux | xxd -i
0x6c, 0x69, 0x6e, 0x75, 0x78, 0x0a

Depois disso é só pegar essa linha e incluir o tipo, nome do array e as chaves:

char string[] = {0x6c, 0x69, 0x6e, 0x75, 0x78, 0x0a} ;

5) Números de bytes por coluna

A opção -g indica a quantidade de bytes por coluna. O default é 2.

$ echo 'slackware' | xxd -g 4
0000000: 736c6163 6b776172 650a               slackware.

Nota sobre little e big endian: o xxd não se preocupa com a endianness da máquina, ele irá sempre gerar os agrupamentos de seus bytes em big endian. Isso é, os bytes ‘ab’ serão convertidos em 0x6162 (big endian) e não em 0x6261 (little endian). O hexdump, numa máquina little endian, converte os bytes em little endian.

$ echo '123456' | xxd
0000000: 3132 3334 3536 0a                        123456
$ echo '123456' | hexdump
0000000 3231 3433 3635 000a

Repare na saída do hexdump, a ordem dos bytes de cada coluna está invertida em relação ao xxd.

6) Seeking bytes

É possível indicar um offset para indicar o ínicio da leitura dos bytes.

$ echo 'slackware' | xxd -s +5
0000005: 7761 7265 0a                             ware.

xxd começou a ler a partir do 5 byte ou seja, a partir de “ware”.

O offset pode ser negativo também, mas aí a entrada deve ser um arquivo em disco e não stdin:

$ xxd -s -128 Funkadelic-Maggot_Brain-Maggot_Brain.mp3

hexdump funkadelic

Os últimos 128 bytes do arquivo foram lidos, e no caso de arquivos mp3 com ID3v1, as informações da música em questão.

Conclusão

O xxd é um comando útil quando queremos visualizar algumas informações de arquivos binários. Além de fornecer a usual saída em hex, ele também fornece uma coluna que nos mostra o byte em sua representação ASCII. Usando a opção -s podemos começar a leitura a partir de posições pré-definidas por nós e com a opção -l indicamos quantos bytes serão lidos. Com isso, temos acesso a partes estáticas de arquivos binários que respeitam algum padrão (PDF, jpg, mp3, etc)

Então é isso, não deixem de checar a man page do xxd para mais informações sobre o programa. Sem contar que ela foi escrita com muito bom humor pelo autor:

AUTHOR
       (c) 1990-1997 by Juergen Weigert
       <jnweiger@informatik.uni-erlangen.de>

       * Distribute freely and credit me,
       * make money and share with me,
       * lose money and don't ask me.

       Manual page started by Tony Nugent
       <tony@sctnugen.ppp.gu.edu.au> <T.Nugent@sct.gu.edu.au>
       Small changes by Bram Moolenaar.  Edited by Juergen Weigert.

A parte destacada agora é minha filosofia de vida. ;)

t+

7 pensamentos sobre “Hex Dump Com O xxd

  1. Pingback: Anexar E Enviar Executáveis Pelo Gmail | Daemonio Labs

  2. Pingback: Burlando Protetor de Link Com URL Codificada Em Hex | Daemonio Labs

  3. Pingback: Usando O Programa cid3v2 Para Inserir Tags ID3v2.3.x | Daemonio Labs

  4. Pingback: O Comando od (Octal Dump) | Daemonio Labs

  5. Pingback: Vi Como Editor Hexadecimal – Daemonio Labs

Deixe um comentário