2010-03-29 15:28:57 +0000 2010-03-29 15:28:57 +0000
324
324

Come si confrontano i file binari in Linux?

Ho bisogno di confrontare due file binari e ottenere l'output nella forma:

<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>

per ogni byte diverso. Quindi se file1.bin è

00 90 00 11
``` ```
00 91 00 10

in forma binaria e file2.bin è

00000001 90 91
  00000003 11 10
``` &001 


voglio ottenere qualcosa come 


&001 


C'è un modo per farlo in Linux? Conosco `cmp -l` ma utilizza un sistema decimale per gli offset e l'ottale per i byte che vorrei evitare.

Risposte (14)

182
182
182
2010-03-29 16:30:19 +0000

Questo stamperà l'offset e i byte in esadecimale:

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

O fare $1-1 per avere la prima stampa offset a partire da 0.

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)}'

Purtroppo, strtonum() è specifico per GAWK, quindi per altre versioni di awk-e.g., mawk-è necessario utilizzare una funzione di conversione da ottale a decimale. Per esempio,

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)
          }'
``` &001 


Breakout per la leggibilità: 


&001
174
174
174
2010-03-29 16:07:55 +0000

Come ~quack ha sottolineato:

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

e poi

% diff b1.hex b2.hex

o

% vimdiff b1.hex b2.hex
112
112
112
2015-09-05 21:14:55 +0000

diff + xxd

Try diff nella seguente combinazione di sostituzione del processo zsh/bash:

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

Dove:

  • -y mostra le differenze fianco a fianco (opzionale).
  • xxd è lo strumento CLI per creare un'uscita esadecimale del file binario.
  • Aggiungi -W200 a diff per un'uscita più ampia (di 200 caratteri per riga).
  • Per i colori, usare colordiff come mostrato sotto.

colordiff + xxd

Se avete colordiff, può colorare l'uscita diff, ad esempio:

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

Altrimenti installate tramite: sudo apt-get install colordiff.

Uscita campione:

vimdiff + xxd

È inoltre possibile utilizzare vimdiff, ad esempio

vimdiff <(xxd foo1.bin) <(xxd foo2.bin)

Suggerimenti:

  • se i file sono troppo grandi, aggiungere il limite (ad esempio -l1000) per ogni xxd
60
60
60
2010-03-29 15:41:30 +0000

C'è uno strumento chiamato DHEX che può fare il lavoro, e c'è un altro strumento chiamato VBinDiff .

Per un approccio strettamente da riga di comando, provare jojodiff .

28
28
28
2015-04-04 20:31:59 +0000

Metodo che funziona per l'aggiunta/eliminazione di byte

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

Generare un test case con una singola rimozione del 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
``` ```
64d63
< 40

Uscita:

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

bdiff file1 file2

Se si desidera vedere anche la versione ASCII del carattere:

64d63
< 40 @

Uscita:

&001

Tested su Ubuntu 16. 04.

Preferisco od a xxd perché:

Spiegazione dei comandi:

Vedi anche:

14
14
14
2015-04-22 12:10:51 +0000

Risposta breve

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


Quando si usano gli esadecimali e il testo diff per confrontare i file binari, specialmente `xxd`, le aggiunte e le rimozioni di byte diventano spostamenti di indirizzamento che potrebbero rendere difficile la visualizzazione. Questo metodo dice a xxd di non inviare indirizzi in output, e di inviare in output solo un byte per riga, che a sua volta mostra esattamente quali byte sono stati modificati, aggiunti o rimossi. Potete trovare gli indirizzi in seguito cercando le sequenze interessanti di byte in un esadecimale più "normale" (output di `xxd first.bin`).
11
11
11
2013-06-12 07:46:34 +0000

Consiglierei hexdump per il dumping di file binari in formato testuale e kdiff3 per la visualizzazione diff.

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex
6
6
6
2015-10-07 04:11:31 +0000

Il hexdiff è un programma progettato per fare esattamente quello che state cercando.

Utilizzo:

hexdiff file1 file2
``` &001 


Visualizza l'esagono (e l'ASCII a 7 bit) dei due file uno sopra l'altro, con le eventuali differenze evidenziate. Guardate `man hexdiff` per i comandi di spostamento nel file, e un semplice `q` si chiude.
4
4
4
2011-09-07 15:47:54 +0000

Potrebbe non rispondere strettamente alla domanda, ma lo uso per i binari diversi:

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


Stampa entrambi i file come valori esadecimali e [ ASCII ](http://en.wikipedia.org/wiki/ASCII), un byte per riga, e poi usa la funzione diff di Vim per renderli visivamente.
1
1
1
2019-07-25 12:42:04 +0000

Lo strumento di analisi del firmware binwalk ha anche questa caratteristica attraverso la sua opzione a riga di comando -W/--hexdump che offre opzioni tali da mostrare solo i diversi byte:

-W, --hexdump Perform a hexdump / diff of a file or files
    -G, --green Only show lines containing bytes that are the same among all files
    -i, --red Only show lines containing bytes that are different among all files
    -U, --blue Only show lines containing bytes that are different among some files
    -w, --terse Diff all files, but only display a hex dump of the first file

Nell'esempio di OP quando si fa binwalk -W file1.bin file2.bin:

1
1
1
2018-10-08 13:52:19 +0000

È possibile utilizzare lo strumento gvimdiff incluso nel pacchetto vim-gui-common

sudo apt-get update

sudo apt-get install vim-gui-common

Poi si possono confrontare 2 file esadecimali usando i seguenti comandi :

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

Tha’s all. Spero che vi sia d'aiuto!

0
0
0
2017-08-18 11:25:28 +0000

dhex http://www.dettus.net/dhex/

DHEX è molto più di un semplice editor di esadecimali: comprende una modalità diff, che può essere utilizzata per confrontare facilmente e comodamente due file binari. Poiché si basa su ncurses ed è tematizzabile, può funzionare su qualsiasi numero di sistemi e scenari. Grazie all'utilizzo di registri di ricerca, è possibile tenere traccia dei cambiamenti nelle diverse iterazioni dei file in modo semplice.

-1
-1
-1
2018-11-09 04:18:32 +0000

Il go to open source su Linux (e tutto il resto) è Radare che fornisce radiff2 esplicitamente a questo scopo. Ho votato per chiudere questo perché io e altri abbiamo la stessa domanda, nella domanda che si fa

per ogni diverso byte

. Perché, come chiesto, se si inserisce un byte al primo byte nel file, si scoprirebbe che ogni byte successivo è diverso e quindi la differenza ripeterebbe l'intero file, per una differenza effettiva di un byte.

Un po’ più pratico è radiff -O. L’-O sta per “"Do code diffing con tutti i byte invece che solo i byte opcode fissi”“

0x000000a4 0c01 => 3802 0x000000a4
0x000000a8 1401 => 3802 0x000000a8
0x000000ac 06 => 05 0x000000ac
0x000000b4 02 => 01 0x000000b4
0x000000b8 4c05 => 0020 0x000000b8
0x000000bc 4c95 => 00a0 0x000000bc
0x000000c0 4c95 => 00a0 0x000000c0
``` &001 


Come IDA Pro, Radare è uno strumento primario per l'analisi binaria, si può anche mostrare il delta diffing con `-d`, o visualizzare i byte smontati invece dell'esagono con `-D`. 


Se però si fanno questo tipo di domande, controllare 


- Stack Overflow per le domande sul software, 
- [ Reverse Engineering Stack Exchange ](https://reverseengineering.stackexchange.com/) 
- [ Radare `radiff2` per diffing binario ](https://r2wiki.readthedocs.io/en/latest/tools/radiff2/)
-1
-1
-1
2016-03-23 20:18:41 +0000

https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html

BinDiff è un grande strumento di interfaccia utente per il confronto di file binari che è stato aperto di recente.