Frage Wie kann ich Binärdateien in Linux vergleichen?


Ich muss zwei Binärdateien vergleichen und die Ausgabe im Formular erhalten

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

für jedes andere Byte. Also, wenn file1.bin ist

  00 90 00 11

in binärer Form und file2.bin ist

  00 91 00 10

Ich möchte etwas wie

  00000001 90 91
  00000003 11 10

Was ist der einfachste Weg, um das Ziel zu erreichen? Standardwerkzeug? Irgendein Drittanbieter-Tool?

(Hinweis: cmp -l sollte mit Feuer getötet werden, es verwendet ein Dezimalsystem für Offsets und oktal für Bytes.)


253
2018-03-29 15:28


Ursprung


Sie suchen im Grunde nach "Binär-Diff". ich kann mir ein paar hässliche Kommandozeilen-Einzeiler vorstellen od... - quack quixote
@quack quixote: Was ist an einem One-Liner hässlich? ;) - Bobby
xdelta.org funktioniert ganz gut. Vielleicht wäre es einen Blick wert. - thatjuan


Antworten:


Dies wird den Offset und Bytes in Hex ausgeben:

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

Oder tu es $1-1 um den ersten gedruckten Offset bei 0 beginnen zu lassen.

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

Unglücklicherweise, strtonum() ist spezifisch für GAWK, also für andere Versionen von awk-z.Bsp. mawk-müssen Sie eine Oktal-Dezimal-Konvertierungsfunktion verwenden. Beispielsweise,

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

Zur besseren Lesbarkeit aussortiert:

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

143
2018-03-29 16:30



Leider gibt mir das awk: line 2: function strtonum never defined Fehler auf Ubuntu 12.04. Spezifische AWK-Implementierung vielleicht? - gertvdijk
@gertvdijk: strtonum ist spezifisch für GAWK. Ich glaube, dass Ubuntu zuvor GAWK als Standard verwendet hat, aber irgendwann auf mawk. In jedem Fall kann GAWK installiert und auf den Standardwert gesetzt werden (siehe auch man update-alternatives). Siehe meine aktualisierte Antwort für eine Lösung, die nicht benötigt wird strtonum. - Dennis Williamson
Ich fügte hinzu, den ursprünglichen Charakter zu drucken und es in das MC-Menü zu legen, ich musste die Prozentzeichen verdoppeln: cmp -l %d/%f %D/%f | gawk '{printf "%%08X %%02X %%02X %%c %%c\n", $1-1, strtonum(0$2), strtonum(0$3), strtonum(0$2), strtonum(0$3)}' - 18446744073709551615


Wie ~ Quacksalber wies darauf hin:

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

Und dann

 % diff b1.hex b2.hex

oder

 % vimdiff b1.hex b2.hex

137
2018-03-29 16:07



In Bash: diff <(xxd b1) <(xxd b2) aber das Ausgabeformat dieses (oder Ihres) ist nicht annähernd das, wonach das OP gefragt hat. - Dennis Williamson
mit vimdiff ist es, es wird die Bytes in den Zeilen färben, wo die zwei "Dateien" unterscheiden - akira
Das hat gut für mich funktioniert (mit opendiff auf OS X statt vimdiff) - die Standardansicht xxdStellt die Vergleichs-Engine auf Spur und vergleicht Byte für Byte. Mit einfachem (rohem) Hex einfach mit der Spalte anpassen fold, diff Ich würde versuchen, zufällige Sachen in den Dateien zu falten / gruppieren, die ich verglichen habe. - natevw
Dieser Befehl funktioniert nicht gut für das Entfernen von Byte-Additionen, da jede folgende Zeile falsch ausgerichtet ist und von geändert wird diff. Die Lösung besteht darin, 1 Byte pro Zeile zu setzen und die Adressspalte wie von vorgeschlagen zu entfernen John Lawrence Aspden und mich. - Ciro Santilli 新疆改造中心 六四事件 法轮功
Deine Antwort ist perfekt für kleine Dateien, aber nicht so für große. - peterh


Versuchen diff in der folgenden Kombination von zsh / bash Prozesssubstitution und colordiff im CLI:

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

Woher:

  • -y zeigt Ihnen Unterschiede nebeneinander (optional)
  • xxd ist CLI-Tool zum Erstellen einer Hexdump-Ausgabe der Binärdatei
  • colordiff wird kolorieren diff Ausgabe (Installation über: sudo apt-get install colordiff)
  • hinzufügen -W200 zu diff für eine breitere Ausgabe

Hinweise:

  • Wenn Dateien zu groß sind, fügen Sie ein Limit hinzu (z. -l1000) für jede xxd

Beispielausgabe:

binary file output in terminal - diff -y <(xxd foo1.bin) <(xxd foo2.bin) | colordiff


57
2017-09-05 21:14



Befehl kann vereinfacht werden als colordiff -y <(xxd foo1.bin) <(xxd foo2.bin). - golem
Wenn Sie nicht über colordiff verfügen, wird dies auch ohne Farben möglich sein: diff -y <(xxd foo1.bin) <(xxd foo2.bin) - Rock Lee
Wenn Sie nur wissen wollen, ob beide Dateien tatsächlich gleich sind, können Sie das verwenden -q oder --brief Schalter, der nur die Ausgabe anzeigt, wenn sich die Dateien unterscheiden. - Stefan van den Akker
Erstelle eine Funktion xxddiff dafür mit: xxddiff() ( f() ( xxd "$1" ; ); diff -y <(f "$1") <(f "$2") | colordiff; ) - rubo77
groß! immer noch, diff -u <(xxd tinga.tgz) <(xxd dec.out.tinga.tgz) | vim -  Ich werde einen guten Job machen - ribamar


Es gibt ein Tool namens DHEX das kann den Job machen, und es gibt ein anderes Tool namens VBinDiff.

Versuchen Sie für einen strikten Befehlszeilenansatz JDIFF.


48
2018-03-29 15:41



DHEX ist fantastisch, vergleichen Sie Binärdateien, was Sie tun möchten. Führen Sie zwei Dateien ein, und Sie gelangen direkt zu einer vergleichenden Ansicht, die Unterschiede hervorhebt und leicht zum nächsten Unterschied übergeht. Es ist auch in der Lage, mit großen Terminals zu arbeiten, was bei Widescreen-Monitoren sehr nützlich ist. - Marcin
Ich bevorzuge VBinDiff. DHEX benutzt die CPU auch im Leerlauf, ich denke, es wird ständig neu gezeichnet oder so. VBinDiff funktioniert jedoch nicht mit breiten Terminals. Aber die Adressen werden sowieso mit breiten Terminals seltsam, da Sie mehr als 16 Bytes pro Zeile haben. - Janus Troelsen
vbindiff lässt uns die Datei bearbeiten, thx! - Aquarius Power
@DanielBeauyat komprimierte Dateien werden vollständig unterschiedlich sein, nachdem Sie das erste andere Byte gefunden haben. Die Ausgabe ist wahrscheinlich nicht nützlich. - Mark Ransom
@ 1111161171159459134 jdiff ist Teil einer "Suite" von Programmen zum Synchronisieren und Patchen der von jdiff gefundenen Unterschiede. Aber, wie Mark Ransom sagte, wäre das bei komprimierten Dateien im Allgemeinen nicht klug; die Ausnahme sind "synchronisierbare" komprimierte Formate (wie sie von gzip --rsyncable erzeugt werden), bei denen kleine Unterschiede in den unkomprimierten Dateien eine begrenzte Auswirkung auf die komprimierte Datei haben sollten. - hmijail


Methode, die für das Hinzufügen / Löschen von Bytes funktioniert

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

Erzeuge einen Testfall mit einer einzelnen 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:

64d63
<  40

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

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

bdiff file1 file2

Ausgabe:

64d63
<   40   @

Getestet auf Ubuntu 16.04.

ich bevorzuge od Über xxd weil:

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

Befehl Erklärung:

  • -An Entfernt die Adressspalte. Dies ist wichtig, ansonsten würden sich alle Zeilen nach einem Byte-Hinzufügen / Entfernen unterscheiden.
  • -w1 setzt ein Byte pro Zeile, so dass diff es konsumieren kann. Es ist wichtig, ein Byte pro Zeile zu haben, sonst wäre jede Zeile nach einem Löschen phasenverschoben und würde sich unterscheiden. Leider ist dies nicht POSIX, sondern in GNU vorhanden.
  • -tx1 Ist die gewünschte Darstellung, ändern Sie sie auf jeden möglichen Wert, solange Sie 1 Byte pro Zeile behalten.
  • -v verhindert die Abkürzung der Sternchenwiederholung * was das diff stören könnte
  • paste -d '' - - verbindet sich alle zwei Zeilen. Wir brauchen es, weil hex und ASCII in separate benachbarte Zeilen gehen. Genommen von: https://stackoverflow.com/questions/8987257/concatenating-every-other-line-with-the-next
  • Wir verwenden Klammern () definieren bdiff Anstatt von {} um den Umfang der inneren Funktion zu begrenzen f, siehe auch: https://stackoverflow.com/questions/8426077/how-to-define-a-function-inside-another-function-in-bash

Siehe auch:


25
2018-04-04 20:31





Kurze Antwort

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

Bei Verwendung von Hexdumps und Textdiff besonders zum Vergleichen von Binärdateien xxd, die Hinzufügungen und Entfernungen von Bytes werden Verschiebungen in der Adressierung, die es schwierig machen, sie zu sehen. Diese Methode weist xxd an, keine Adressen auszugeben und nur ein Byte pro Zeile auszugeben, was wiederum genau anzeigt, welche Bytes geändert, hinzugefügt oder entfernt wurden. Sie können die Adressen später finden, indem Sie nach den interessanten Sequenzen von Bytes in einem "normalen" Hexdump suchen (Ausgabe von xxd first.bin).


12
2018-04-22 12:10



(Natürlich kann man verwenden diff Anstatt von vimdiff.) - VasyaNovikov


Ich würde hexdump empfehlen, um Binärdateien in das Textformat und kdiff3 für die Diff-Ansicht zu speichern.

hexdump myfile1.bin > myfile1.hex
hexdump myfile2.bin > myfile2.hex
kdiff3 myfile1.hex myfile2.hex

10
2018-06-12 07:46



Auch hier in der Bash kdiff3 <(hexdump myfile1.bin) <(hexdump myfile2.bin) ohne dass Dateien erstellt werden müssen myfile1.hex und myfile2.hex. - Hastur


Das hexdiff ist ein Programm, das entwickelt wurde, um genau das zu tun, wonach Sie suchen.

Verwendung:

hexdiff file1 file2

Es zeigt das Hexadezimal- (und 7-Bit-ASCII) der beiden Dateien übereinander an, wobei alle Unterschiede hervorgehoben sind. Ansehen man hexdiff für die Befehle in der Datei zu bewegen, und eine einfache q wird aufhören.


4
2017-10-07 04:11



Aber es macht einen ziemlich schlechten Job, wenn es um den Vergleich geht. Wenn Sie einige Bytes in eine Datei einfügen, werden alle nachfolgenden Bytes als Änderungen markiert - Murmel
und hexdiff ist nicht verfügbar über apt-get auf Ubuntu 16.4 - rubo77


Es kann die Frage nicht strikt beantworten, aber ich benutze dies für differierende Binärdateien:

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

Es druckt beide Dateien als Hex und ASCII Werte, ein Byte pro Zeile, und verwendet dann Vims Diff-Funktion, um sie visuell zu rendern.


3
2017-09-07 15:47





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

BinDiff ist ein großartiges UI-Tool zum Vergleichen von binären Dateien, die kürzlich geöffnet wurden.


0
2018-03-23 20:18



Kann es aber auch für beliebige Binärdateien verwendet werden? Diese Seite scheint zu zeigen, dass sie nur nützlich ist, um ausführbare Dateien zu vergleichen, die von Hex-Rays IDA Pro demontiert wurden. - eswald


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 anpassbar ist, kann es auf beliebig vielen Systemen und Szenarien ausgeführt werden. Mit der Verwendung von Suchprotokollen ist es möglich, Änderungen in verschiedenen Iterationen von Dateien leicht zu verfolgen.


0
2017-08-18 11:25



Willkommen bei SuperUser! Obwohl diese Software so aussieht könnte Um das Problem des OP zu lösen, ist reine Werbung im Stack Exchange-Netzwerk stark verpönt. Wenn Sie mit dem Editor dieser Software verbunden sind, geben Sie dies bitte bekannt. Und versuchen Sie, Ihren Beitrag so umzuschreiben, dass er weniger wie ein Werbespot aussieht. Vielen Dank. - Nathan.Eilisha Shiraini
Ich bin in keiner Weise mit dhex verbunden. Ich habe die Beschreibung des Autors in den Post kopiert, da es eine Mindestlänge für die Postlänge gibt - Vincent Vega
Bereits erwähnt bei: superuser.com/a/125390/128124 - Ciro Santilli 新疆改造中心 六四事件 法轮功