Preciso comparar dois arquivos binários e obter a saída no formulário:
<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>
para cada byte diferente. Então, se file1.bin
é
00 90 00 11
em forma binária e file2.bin
é
00 91 00 10
Eu quero algo como
00000001 90 91
00000003 11 10
Existe uma maneira de fazer isso no Linux? Eu sei, cmp -l
mas ele usa um sistema decimal para compensações e octal para bytes que eu gostaria de evitar.
linux
diff
binary-files
bertieb
fonte
fonte
od
...Respostas:
Isso imprimirá o deslocamento e os bytes em hexadecimal:
Ou faça
$1-1
para que o primeiro deslocamento impresso comece em 0.Infelizmente,
strtonum()
é específico para o 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,Dividido para facilitar a leitura:
fonte
strtonum
é específico para o GAWK. Acredito que o Ubuntu anteriormente usou o GAWK como padrão, mas mudou em algum momento paramawk
. De qualquer forma, o GAWK pode ser instalado e definido como o padrão (consulte tambémman update-alternatives
). Veja minha resposta atualizada para uma solução que não requerstrtonum
.Como o charlatão apontou:
E depois
ou
fonte
diff <(xxd b1) <(xxd b2)
mas o formato de saída deste (ou seu) não está nem perto do que o OP solicitou.opendiff
OS X em vez devimdiff
) - a exibição padrãoxxd
mantém o mecanismo diff no caminho, comparando byte a byte. Com hexadecimal simples (bruto), simplesmente com ajuste de colunafold
,diff
tentaria dobrar / agrupar itens aleatórios nos arquivos que eu estava comparando.diff
. A solução é colocar 1 byte por linha e remover a coluna de endereço, conforme proposto por John Lawrence Aspden e eu .diff
+xxd
Tente
diff
a seguinte combinação de substituição do processo zsh / bash:Onde:
-y
mostra as diferenças lado a lado (opcional).xxd
é uma ferramenta CLI para criar uma saída hexdump do arquivo binário.-W200
adiff
para saída mais ampla (de 200 caracteres por linha).colordiff
como mostrado abaixo.colordiff
+xxd
Se você tiver
colordiff
, pode colorir adiff
saída, por exemplo:Caso contrário, instalar via:
sudo apt-get install colordiff
.Saída de amostra:
vimdiff
+xxd
Você também pode usar
vimdiff
, por exemploDicas:
-l1000
) para cadaxxd
fonte
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.diff -y <(xxd foo1.bin) <(xxd foo2.bin)
-q
ou--brief
, que só mostrará a saída quando os arquivos diferirem.xxddiff
para isso com:xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -
vai fazer um trabalho bom enougHá uma ferramenta chamada DHEX que pode fazer o trabalho, e há outra ferramenta chamada VBinDiff .
Para uma abordagem estritamente de linha de comando, tente jojodiff .
fonte
Método que funciona para adição / exclusão de bytes
Gere um caso de teste com uma única remoção do byte 64:
Resultado:
Se você também deseja ver a versão ASCII do personagem:
Resultado:
Testado no Ubuntu 16.04.
Eu prefiro
od
maisxxd
porque:xxd
não é (vem com Vim)-An
para remover a coluna de endereço semawk
.Explicação do comando:
-An
remove a coluna de endereço. Isso é importante, caso contrário, todas as linhas diferirão após a adição / remoção de bytes.-w1
coloca um byte por linha, para que o diff possa consumi-lo. É crucial ter um byte por linha, ou então todas as linhas após uma exclusão ficarão fora de fase e diferirão. Infelizmente, isso não é POSIX, mas está presente no GNU.-tx1
é a representação desejada, altere para qualquer valor possível, desde que você mantenha 1 byte por linha.-v
evita a abreviação de repetição de asterisco*
que pode interferir na diferençapaste -d '' - -
junta-se a cada duas linhas. Precisamos disso porque o hex e o ASCII entram em linhas adjacentes separadas. Retirado de: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next()
para definir, embdiff
vez de{}
limitar o escopo da função internaf
, consulte também: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bashVeja também:
fonte
Resposta curta
Ao usar hexdumps e diff de texto para comparar arquivos binários, especialmente
xxd
, as adições e remoções de bytes se tornam mudanças no endereçamento, o que pode dificultar a visualização. Esse método diz ao xxd para não enviar 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 posteriormente pesquisando as interessantes seqüências de bytes em um hexdump mais "normal" (saída dexxd first.bin
).fonte
diff
em vez devimdiff
.)Eu recomendaria o hexdump para descarregar arquivos binários para o formato textual e o kdiff3 para visualização de diferenças.
fonte
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
sem a necessidade de criar arquivosmyfile1.hex
emyfile2.hex
.O
hexdiff
é um programa projetado para fazer exatamente o que você está procurando.Uso:
Ele exibe o hex (e ASCII de 7 bits) dos dois arquivos, um acima do outro, com as diferenças destacadas. Veja
man hexdiff
os comandos para se movimentar no arquivo, e um simplesq
será encerrado.fonte
Pode não responder estritamente à pergunta, mas eu uso isso para diferentes binários:
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.
fonte
dhex http://www.dettus.net/dhex/
O DHEX é mais do que apenas outro editor hexadecimal: inclui um modo diff, que pode ser usado para comparar fácil e convenientemente dois arquivos binários. Como é baseado em ncurses e é utilizável, ele pode ser executado em qualquer número de sistemas e cenários. Com a utilização de logs de pesquisa, é possível rastrear alterações em diferentes iterações de arquivos facilmente.
fonte
Você pode usar a ferramenta gvimdiff incluída no pacote vim-gui-common
Em seguida, você pode comparar 2 arquivos hexadecimais usando os seguintes comandos:
Tha is all. Espero que ajude!
fonte
A ferramenta de análise de firmware
binwalk
também possui isso como um recurso na opção-W
/--hexdump
linha de comando, que oferece opções como mostrar apenas os bytes diferentes:No exemplo do OP ao fazer
binwalk -W file1.bin file2.bin
:fonte
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
O BinDiff é uma ótima ferramenta de interface do usuário para comparar arquivos binários que foram abertos recentemente.
fonte
O produto go to open source no Linux (e tudo mais) é o Radare, que fornece
radiff2
explicitamente para esse fim. Votei em encerrar isso porque eu e outros temos a mesma pergunta, na pergunta que você fazIsso é loucura. Como solicitado, se você inserir um byte no primeiro byte no arquivo, descobrirá que cada byte subsequente é diferente e, portanto, o diff repetirá o arquivo inteiro, com uma diferença real de um byte.
Um pouco mais prático é
radiff -O
. A-O
é para "" Faça código diffing com todos os bytes em vez de apenas os bytes opcode fixos ""Como o IDA Pro, o Radare é uma ferramenta primária para análise binária, você também pode mostrar diferenças de delta
-d
ou exibir os bytes desmontados em vez de hexadecimal com-D
.Se você está fazendo esse tipo de pergunta, confira
radiff2
para diffing bináriofonte