Ich muss zwei Binärdateien vergleichen und die Ausgabe in der Form erhalten:
<fileoffset-hex> <file1-byte-hex> <file2-byte-hex>
für jedes andere Byte. Also wenn file1.bin
ja
00 90 00 11
in binärer Form und file2.bin
ist
00 91 00 10
Ich möchte so etwas bekommen
00000001 90 91
00000003 11 10
Gibt es eine Möglichkeit, dies unter Linux zu tun? Ich weiß, cmp -l
aber es verwendet ein Dezimalsystem für Offsets und Oktal für Bytes, die ich vermeiden möchte.
linux
diff
binary-files
bertieb
quelle
quelle
od
Antworten:
Dies gibt den Offset und die Bytes in hexadezimaler Form aus:
Oder lassen Sie
$1-1
den ersten gedruckten Versatz bei 0 beginnen.Leider
strtonum()
ist GAWK-spezifisch. Daher müssen Sie für andere Versionen von awk - z. B. mawk - eine Konvertierungsfunktion von Oktal zu Dezimal verwenden. Zum Beispiel,Aus Gründen der Lesbarkeit aufgeschlüsselt:
quelle
strtonum
ist GAWK-spezifisch. Ich glaube Ubuntu hat vorher GAWK als Standard verwendet, aber irgendwann auf umgestelltmawk
. In jedem Fall kann GAWK installiert und auf die Standardeinstellungen gesetzt werden (siehe auchman update-alternatives
). In meiner aktualisierten Antwort finden Sie eine Lösung, die nicht erforderlich iststrtonum
.Als ~ quack darauf hingewiesen:
Und dann
oder
quelle
diff <(xxd b1) <(xxd b2)
aber das Ausgabeformat von diesem (oder Ihrem) ist bei weitem nicht das, wonach das OP gefragt hat.opendiff
OS X stattvimdiff
) - die Standardansichtxxd
hält die Diff-Engine auf dem Laufenden, indem sie Byte für Byte vergleicht. Mit normalem (rohem) Hex, das einfach in eine Spalte passtfold
,diff
würde ich versuchen, zufälliges Material in den Dateien, die ich verglichen habe, zu falten / zu gruppieren.diff
. Die Lösung besteht darin, 1 Byte pro Zeile einzufügen und die von John Lawrence Aspden und mir vorgeschlagene Adressenspalte zu entfernen .diff
+xxd
Probieren Sie
diff
die folgende Kombination aus zsh / bash-Prozessersetzung aus:Wo:
-y
Zeigt die Unterschiede nebeneinander an (optional).xxd
ist ein CLI-Tool zum Erstellen einer Hexdump-Ausgabe der Binärdatei.-W200
todiff
für eine breitere Ausgabe (mit 200 Zeichen pro Zeile).colordiff
die folgenden Angaben.colordiff
+xxd
Wenn Sie haben
colordiff
, kann es diediff
Ausgabe einfärben , zB:Andernfalls installieren über:
sudo apt-get install colordiff
.Beispielausgabe:
vimdiff
+xxd
Sie können auch
vimdiff
zHinweise:
-l1000
)xxd
quelle
colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)
.diff -y <(xxd foo1.bin) <(xxd foo2.bin)
-q
oder verwenden--brief
, der die Ausgabe nur anzeigt, wenn sich die Dateien unterscheiden.xxddiff
mit:xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; )
diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -
wird gut enoug einen Job tunEs gibt ein Tool namens DHEX, das die Arbeit erledigen kann, und es gibt ein anderes Tool namens VBinDiff .
Versuchen Sie es mit jojodiff , um eine strikte Befehlszeilenmethode zu erhalten .
quelle
Methode, die für das Hinzufügen / Löschen von Bytes funktioniert
Generieren Sie einen Testfall mit einer einzelnen Entfernung von Byte 64:
Ausgabe:
Wenn Sie auch die ASCII-Version des Zeichens sehen möchten:
Ausgabe:
Getestet unter Ubuntu 16.04.
Ich ziehe es
od
über ,xxd
weil:xxd
ist nicht (kommt mit Vim)-An
adressenspalte ohne entfernenawk
.Befehlserklärung:
-An
Entfernt die Adressenspalte. Dies ist wichtig, da sich sonst alle Zeilen nach dem Hinzufügen / Entfernen eines Bytes unterscheiden würden.-w1
setzt ein Byte pro Zeile, so dass diff es verbrauchen kann. Es ist von entscheidender Bedeutung, ein Byte pro Zeile zu haben, da sonst jede Zeile nach dem Löschen außer Phase gerät und sich unterscheidet. Leider ist dies kein POSIX, sondern in GNU vorhanden.-tx1
Bei der gewünschten Darstellung ändern Sie den Wert auf einen beliebigen Wert, solange Sie 1 Byte pro Zeile beibehalten.-v
Verhindert die Abkürzung für*
die Sternchenwiederholung, die das Diff stören könntepaste -d '' - -
Verbindet alle zwei Zeilen. Wir brauchen es, weil Hex und ASCII in separate benachbarte Zeilen gehen. Entnommen aus: https://stackoverflow.com/questions/8987257/catenating-every-other-line-with-the-next()
, um den Umfang der inneren Funktion zu definieren,bdiff
anstatt ihn{}
einzuschränkenf
. Siehe auch: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bashSiehe auch:
quelle
Kurze Antwort
Insbesondere bei Verwendung von Hexdumps und Text Diff zum Vergleichen von Binärdateien
xxd
kommt es durch das Hinzufügen und Entfernen von Bytes zu Adressverschiebungen, die die Anzeige möglicherweise erschweren. Diese Methode weist xxd an, keine Adressen auszugeben und nur ein Byte pro Zeile auszugeben, wodurch genau angezeigt wird, welche Bytes geändert, hinzugefügt oder entfernt wurden. Sie können die Adressen später finden, indem Sie in einem "normalen" Hexdump (Ausgabe vonxxd first.bin
) nach den interessanten Folgen von Bytes suchen .quelle
diff
anstelle von verwendenvimdiff
.)Ich empfehle hexdump zum Speichern von Binärdateien im Textformat und kdiff3 zum Anzeigen von Unterschieden.
quelle
kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin)
ohne die Notwendigkeit, Dateien zu erstellenmyfile1.hex
undmyfile2.hex
.Das
hexdiff
ist ein Programm, das genau das macht, wonach Sie suchen.Verwendungszweck:
Es zeigt das Hexadezimal (und 7-Bit-ASCII) der beiden Dateien übereinander an, wobei alle Unterschiede hervorgehoben sind. Suchen Sie
man hexdiff
nach den Befehlen, die in der Datei verschoben werden sollen, und ein einfacherq
Befehl wird beendet.quelle
Es kann sein, dass die Frage nicht genau beantwortet wird, aber ich verwende dies für verschiedene Binärdateien:
Es druckt beide Dateien als Hex- und ASCII- Werte aus, ein Byte pro Zeile, und verwendet dann die Diff-Funktion von Vim, um sie visuell darzustellen.
quelle
dhex http://www.dettus.net/dhex/
DHEX ist mehr als nur ein Hex-Editor: Es enthält einen Diff-Modus, mit dem zwei Binärdateien einfach und bequem verglichen werden können. Da es auf ncurses basiert und themenorientiert ist, kann es auf einer beliebigen Anzahl von Systemen und Szenarien ausgeführt werden. Durch die Verwendung von Suchprotokollen ist es möglich, Änderungen in verschiedenen Iterationen von Dateien einfach zu verfolgen.
quelle
Sie können das Tool gvimdiff verwenden, das im Paket vim-gui-common enthalten ist
Dann können Sie 2 hexadezimale Dateien mit folgenden Befehlen vergleichen:
Das ist alles. Hoffe die Hilfe!
quelle
Das Firmware-Analysetool
binwalk
hat dies auch als eine Funktion über die Befehlszeilenoption-W
/--hexdump
, die Optionen bietet, mit denen nur die unterschiedlichen Bytes angezeigt werden:Im Beispiel von OP
binwalk -W file1.bin file2.bin
:quelle
https://security.googleblog.com/2016/03/bindiff-now-available-for-free.html
BinDiff ist ein großartiges UI-Tool zum Vergleichen von Binärdateien, die kürzlich geöffnet wurden.
quelle
Das Go-to-Open-Source-Produkt unter Linux (und allem anderen) ist Radare , das
radiff2
explizit für diesen Zweck bereitgestellt wird . Ich habe dafür gestimmt, dies zu schließen, weil ich und andere in der von Ihnen gestellten Frage dieselbe Frage habenDas ist aber verrückt. Denn wenn Sie, wie gefragt, ein Byte am ersten Byte in die Datei einfügen, ist jedes nachfolgende Byte anders und der Diff würde die gesamte Datei wiederholen, um eine tatsächliche Differenz von einem Byte zu erhalten.
Etwas praktischer ist
radiff -O
. Das-O
ist für "" Code mit allen Bytes anstelle nur der festen Opcode-Bytes unterscheiden. ""Wie IDA Pro ist Radare ein primäres Werkzeug für die Binäranalyse. Sie können auch Delta-Differenzen mit
-d
anzeigen oder die disassemblierten Bytes anstelle von Hex mit anzeigen-D
.Wenn Sie diese Art von Fragen stellen, lesen Sie weiter
radiff2
für binäres Diffingquelle