Como eu comparo os arquivos binários no Linux?

259

Eu preciso comparar dois arquivos binários e obter a saída na forma

< fileoffset-hex > < arquivo1-byte-hex > < arquivo2-byte-hex >

para cada byte diferente. Então, se file1.bin for

  00 90 00 11

em formato binário e file2.bin é

  00 91 00 10

Eu quero algo como

  00000001 90 91
  00000003 11 10

Qual é a maneira mais fácil de atingir o objetivo? Ferramenta padrão? Alguma ferramenta de terceiros?

(Nota: cmp -l deve ser eliminado com o fogo, ele usa um sistema decimal para deslocamentos e octal para bytes.)

    
por Peter Mortensen 29.03.2010 / 17:28

13 respostas

147

Isto irá imprimir o deslocamento e os bytes em hexadecimal:

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'

Ou use $1-1 para que o primeiro deslocamento impresso comece em 0.

cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'

Infelizmente, strtonum() é específico do GAWK, portanto, para outras versões do awk, por exemplo, mawk, você precisará usar uma função de conversão de octal para decimal. Por exemplo,

cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct,     dec) {for (i = 1; i <= length(oct); i++) {dec *= 8; dec += substr(oct, i, 1)}; return dec} {printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)}'

Separado por legibilidade:

cmp -l file1.bin file2.bin |
    mawk 'function oct2dec(oct,    dec) {
              for (i = 1; i <= length(oct); i++) {
                  dec *= 8;
                  dec += substr(oct, i, 1)
              };
              return dec
          }
          {
              printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)
          }'
    
por 29.03.2010 / 18:30
143

Como ~ quack apontou:

 % xxd b1 > b1.hex
 % xxd b2 > b2.hex

E então

 % diff b1.hex b2.hex

ou

 % vimdiff b1.hex b2.hex
    
por 29.03.2010 / 18:07
63

Teste diff na seguinte combinação de substituição de processo zsh / bash e colordiff na CLI:

diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff

Onde:

  • -y mostra suas diferenças lado-a-lado (opcional)
  • xxd é a ferramenta CLI para criar uma saída hexdump do arquivo binário
  • colordiff irá colorir diff output (instalar via: sudo apt-get install colordiff )
  • adicione -W200 a diff para resultados mais amplos

Dicas:

  • se os arquivos forem grandes, adicione limite (por exemplo, -l1000 ) para cada xxd

Exemplo de saída:

    
por 05.09.2015 / 23:14
48

Existe uma ferramenta chamada DHEX que pode fazer o trabalho, e há outra ferramenta chamada VBinDiff .

Para uma abordagem estritamente de linha de comando, tente JDIFF .

    
por 29.03.2010 / 17:41
25

Método que funciona para adição / exclusão de bytes

diff <(od -An -tx1 -w1 -v file1) \
     <(od -An -tx1 -w1 -v file2)

Gere um caso de teste com uma única remoção de byte 64:

for i in 'seq 128'; do printf "%02x" "$i"; done | xxd -r -p > file1
for i in 'seq 128'; do if [ "$i" -ne 64 ]; then printf "%02x" $i; fi; done | xxd -r -p > file2

Saída:

64d63
<  40

Se você também quiser ver a versão ASCII do caractere:

bdiff() (
  f() (
    od -An -tx1c -w1 -v "$1" | paste -d '' - -
  )
  diff <(f "$1") <(f "$2")
)

bdiff file1 file2

Saída:

64d63
<   40   @

Testado no Ubuntu 16.04.

Eu prefiro od over xxd porque:

  • é POSIX , xxd não é (vem com o Vim)
  • tem o -An para remover a coluna de endereço sem awk .

Explicação do comando:

  • -An remove a coluna de endereço. Isso é importante, caso contrário, todas as linhas seriam diferentes após uma adição / remoção de bytes.
  • -w1 coloca um byte por linha, para que diff possa consumi-lo. É crucial ter um byte por linha, ou então cada linha depois de uma exclusão se tornaria desfasada e diferente. Infelizmente, isso não é POSIX, mas presente no GNU.
  • -tx1 é a representação que você deseja, mude para qualquer valor possível, contanto que você mantenha 1 byte por linha.
  • -v previne a abreviação de repetição de asterisco * , o que pode interferir no diff
  • paste -d '' - - une-se a cada duas linhas. Precisamos disso porque o hex e o ASCII entram em linhas adjacentes separadas. Retirado de: link
  • usamos parêntese () para definir bdiff em vez de {} para limitar o escopo da função interna f , consulte também: link

Veja também:

por 04.04.2015 / 22:31
13

Resposta curta

vimdiff <(xxd -c1 -p first.bin) <(xxd -c1 -p second.bin)

Ao usar hexdumps e diff de texto para comparar arquivos binários, especialmente xxd , as adições e remoções de bytes tornam-se mudanças no endereçamento que podem dificultar a visualização. Esse método informa ao xxd para não gerar endereços e gerar apenas um byte por linha, o que, por sua vez, mostra exatamente quais bytes foram alterados, adicionados ou removidos. Você pode encontrar os endereços mais tarde procurando as sequências interessantes de bytes em um hexdump mais "normal" (saída de xxd first.bin ).

    
por 22.04.2015 / 14:10
11

Eu recomendaria o hexdump para despejar arquivos binários em formato textual e o kdiff3 para visualização em modo diff.

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex
    
por 12.06.2013 / 09:46
4

O hexdiff é um programa projetado para fazer exatamente o que você está procurando.

Uso:

hexdiff file1 file2

Exibe o hex (e ASCII de 7 bits) dos dois arquivos um acima do outro, com quaisquer diferenças destacadas. Veja man hexdiff para os comandos se movimentarem no arquivo, e um simples q será encerrado.

    
por 07.10.2015 / 06:11
3

Ele pode não responder estritamente à pergunta, mas eu uso isso para binários de diferenças:

gvim -d <(xxd -c 1 ~/file1.bin | awk '{print $2, $3}') <(xxd -c 1 ~/file2.bin | awk '{print $2, $3}')

Ele imprime os dois arquivos como valores hexadecimais e ASCII , um byte por linha e, em seguida, usa o recurso diff do Vim para renderizá-los visualmente.

    
por 07.09.2011 / 17:47
0

link

O BinDiff é uma excelente ferramenta de interface do usuário para comparar arquivos binários que foram abertos recentemente.

    
por 23.03.2016 / 21:18
0

dhex link

O DHEX é mais do que apenas outro editor hexadecimal: ele inclui um modo diff, que pode ser usado para comparar fácil e convenientemente dois arquivos binários. Como é baseado em ncurses e é personalizável, ele pode ser executado em qualquer número de sistemas e cenários. Com a utilização de registros de pesquisa, é possível rastrear alterações em diferentes iterações de arquivos com facilidade.

    
por 18.08.2017 / 13:25
0

Você pode usar a ferramenta gvimdiff incluída no pacote vim-gui-common

sudo apt-get update

sudo apt-get install vim-gui-common

Então você pode comparar 2 arquivos hexadecimais usando os seguintes comandos:

ubuntu> gvimdiff <hex-file1> <hex-file2>

Tha é tudo. Espero que ajude!

    
por 08.10.2018 / 15:52
-2

Eu recomendo IDA Pro para analisar os arquivos binários. A comparação pode ser feita usando um plug-in para a IDA, como o BinDiff .

    
por 30.12.2013 / 16:04