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

Wie vergleiche ich Binärdateien unter Linux?

Ich muss zwei Binärdateien vergleichen und erhalte die Ausgabe in der Form:

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

für jedes unterschiedliche Byte. Wenn also file1.bin

00 90 00 11

in binärer Form ist und file2.bin

00 91 00 10

ist, möchte ich etwas wie

00000001 90 91
  00000003 11 10

erhalten. Gibt es eine Möglichkeit, dies unter Linux zu tun? Ich weiß von cmp -l, aber es verwendet ein Dezimalsystem für Offsets und Oktal für Bytes, was ich vermeiden möchte.

Antworten (14)

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

Dies druckt den Offset und die Bytes in Hex:

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

Oder machen Sie $1-1, damit der erste gedruckte Offset bei 0 beginnt.

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

Leider ist strtonum() spezifisch für GAWK, so dass Sie für andere Versionen von awk - z.B. mawk- eine Oktal-zu-Dezimal-Konvertierungsfunktion verwenden müssen. Zum Beispiel:

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

Ausgebrochen für die Lesbarkeit:

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)
          }'
174
174
174
2010-03-29 16:07:55 +0000

Wie ~quack hervorhob:

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

Und dann

% diff b1.hex b2.hex

oder

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

diff + xxd

Versuchen Sie diff in der folgenden Kombination von zsh/bash Prozessersetzung:

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

Wo:

  • -y Ihnen Unterschiede nebeneinander zeigt (optional).
  • xxd ist ein CLI-Tool zum Erstellen einer Hexdump-Ausgabe der Binärdatei.
  • Fügen Sie -W200 zu diff für eine breitere Ausgabe (von 200 Zeichen pro Zeile) hinzu.
  • Für Farben verwenden Sie colordiff wie unten gezeigt.

colordiff + xxd

Wenn Sie colordiff haben, kann die Ausgabe von diff eingefärbt werden, z.B.:

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

Andernfalls installieren Sie über: sudo apt-get install colordiff.

Beispielausgabe:

vimdiff + xxd

Sie können auch vimdiff verwenden, z.B.:

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

Hinweise:

  • wenn die Dateien zu groß sind, fügen Sie ein Limit (z.B. -l1000) für jede xxd
60
60
60
2010-03-29 15:41:30 +0000

Es gibt ein Tool namens DHEX , das die Arbeit erledigen kann, und es gibt ein weiteres Tool namens VBinDiff .

Für einen strikt kommandozeilenorientierten Ansatz versuchen Sie jojodiff .

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

Methode, die für Byte-Addition/Löschung funktioniert

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

Generieren Sie einen Testfall mit einer einzigen Entfernung von 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

Ausgabe:

Wenn Sie auch die ASCII-Version des Zeichens sehen wollen:

64d63
< 40

Ausgabe:

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

bdiff file1 file2

Getestet auf Ubuntu 16. 04.

Ich bevorzuge od gegenüber xxd, weil:

  • es ist POSIX , xxd ist nicht (kommt mit Vim)
  • hat die -An, um die Adressspalte ohne awk zu entfernen.

Befehlserklärung:

  • -An entfernt die Adressspalte. Dies ist wichtig, sonst würden sich alle Zeilen nach einer Byte-Addition/Entfernung unterscheiden.
  • -w1 setzt ein Byte pro Zeile, so dass diff es verbrauchen kann. Es ist wichtig, ein Byte pro Zeile zu haben, da sonst jede Zeile nach einer Löschung aus der Phase geraten und sich unterscheiden würde. Leider ist dies nicht POSIX, sondern in GNU vorhanden.
  • -tx1 ist die gewünschte Darstellung, ändern Sie auf jeden möglichen Wert, solange Sie 1 Byte pro Zeile beibehalten.
  • -v verhindert die Sternchen-Wiederholungsabkürzung *, die das diff stören könnte
  • paste -d '' - - verbindet alle zwei Zeilen. Wir brauchen es, weil Hex und ASCII in getrennte benachbarte Zeilen gehen. Entnommen aus: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next
  • wir verwenden Klammern () zur Definition von bdiff anstelle von {}, um den Umfang der inneren Funktion f zu begrenzen, siehe auch: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bash

Siehe auch:

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

Kurzantwort

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

Bei der Verwendung von Hexdumps und Textdiff zum Vergleich von Binärdateien, insbesondere von xxd, werden die Hinzufügungen und Entfernungen von Bytes zu Verschiebungen in der Adressierung, die es schwierig machen könnten, sie zu erkennen. Diese Methode weist xxd an, keine Adressen auszugeben und nur ein Byte pro Zeile auszugeben, was wiederum genau zeigt, welche Bytes geändert, hinzugefügt oder entfernt wurden. Sie können die Adressen später finden, indem Sie die interessanten Byte-Folgen in einem “normaleren” Hexdump (Ausgabe von xxd first.bin) suchen.

11
11
11
2013-06-12 07:46:34 +0000

Ich empfehle hexdump für das Dumping von Binärdateien in das Textformat und kdiff3 für die Diff-Anzeige.

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

Das Programm hexdiff ist so konzipiert, dass es genau das tut, was Sie suchen.

Verwendung:

hexdiff file1 file2

Es zeigt das Hex (und 7-Bit-ASCII) der beiden Dateien übereinander an, wobei Unterschiede hervorgehoben werden. Schauen Sie in man hexdiff nach den Befehlen, um sich in der Datei zu bewegen, und ein einfaches q wird beendet.

4
4
4
2011-09-07 15:47:54 +0000

I

1
1
1
2019-07-25 12:42:04 +0000

Das Firmware-Analyse-Tool binwalk hat dies auch durch seine -W/--hexdump Kommandozeilenoption , die Optionen bietet, wie z.B. nur die unterschiedlichen Bytes anzuzeigen:

-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

Im Beispiel von OP bei der Ausführung von binwalk -W file1.bin file2.bin:

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

Sie können das Werkzeug gvimdiff benutzen, das im Paket vim-gui-common enthalten ist

sudo apt-get update

sudo apt-get install vim-gui-common

Dann können Sie 2 Hex-Dateien mit den folgenden Befehlen vergleichen:

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

Das ist alles. Hoffen Sie auf diese Hilfe !

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

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

DHEX ist mehr als nur ein weiterer Hex-Editor: Er enthält einen Diff-Modus, mit dem sich zwei Binärdateien einfach und bequem vergleichen lassen. Da er auf Ncurses basiert und thematisierbar ist, kann er auf beliebig vielen Systemen und Szenarien laufen. Durch die Verwendung von Suchprotokollen ist es möglich, Änderungen in verschiedenen Iterationen von Dateien einfach zu verfolgen.

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

Der Einstieg in das Open-Source-Produkt unter Linux (und alles andere) ist Radare , das radiff2 explizit für diesen Zweck zur Verfügung stellt. Ich habe dafür gestimmt, dies zu schließen, weil ich selbst und andere die gleiche Frage haben, in der Frage, die Sie stellen

für jedes andere Byte

Das ist allerdings verrückt. Denn wenn Sie, wie gefragt, ein Byte an das erste Byte in der Datei einfügen, würden Sie feststellen, dass jedes nachfolgende Byte anders ist, und so würde das Diff die ganze Datei wiederholen, bei einem tatsächlichen Unterschied von einem Byte.

Etwas praktischer ist radiff -O. -O steht für “"Do code diffing with all bytes instead of just the fixed opcode bytes”“

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

Wie IDA Pro ist Radare ein primär für die Binäranalyse geeignetes Tool. Sie können auch Delta-Diff mit -d anzeigen oder die disassemblierten Bytes anstelle von Hex mit -D anzeigen.

Wenn Sie jedoch diese Art von Fragen stellen, sehen Sie sich

-1
-1
-1
2016-03-23 20:18:41 +0000

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

BinDiff ist ein großartiges UI-Tool zum Vergleichen von Binärdateien, das vor kurzem geöffnet wurde.