So vergleichen Sie Binärdateien unter Linux
Wie können Sie überprüfen, ob zwei Linux-Binärdateien gleich sind? Wenn es sich um ausführbare Dateien handelt, können Unterschiede auf unerwünschtes oder böswilliges Verhalten hinweisen. So können Sie am einfachsten überprüfen, ob sie sich unterscheiden.
Vergleichen von Binärdateien
Linux bietet zahlreiche Möglichkeiten zum Vergleichen und Analysieren von Textdateien. Der Befehl diff
vergleicht zwei Dateien für Sie und hebt die Unterschiede hervor. Es können sogar einige Zeilen auf beiden Seiten der Änderungen bereitgestellt werden, um einen Kontext zu den geänderten Zeilen bereitzustellen. Und der Befehl colordiff
fügt Farbe hinzu, um die visuelle Analyse der Unterschiede noch einfacher zu machen.
Entwickler und Autoren verwenden diff
, um die Unterschiede zwischen verschiedenen Versionen von Programmquellcodedateien oder Entwurfstexten hervorzuheben. Es geht schnell und einfach und Sie benötigen keine technischen Kenntnisse, um die Unterschiede zwischen Textzeichenfolgen zu erkennen.
In der Welt der Binärdateien sind die Dinge nicht so einfach. Binärdateien bestehen nicht aus reinem Text. Sie bestehen aus vielen Bytes, die numerische Werte enthalten. Wenn es sich um eine komprimierte Datei wie ein TAR-Archiv oder eine ZIP-Datei handelt, stellen diese Werte die komprimierten Dateien dar, die in der Archivdatei gespeichert sind, zusammen mit den Symboltabellen, die für die Dekomprimierung und Extraktion der Dateien erforderlich sind.
Wenn es sich bei der Binärdatei um eine ausführbare Datei handelt, werden die numerischen Werte der Dateibytes als Maschinencodeanweisungen für die CPU, Metadaten, Beschriftungen oder codierte Daten interpretiert. Änderungen an einer Binärdatei oder einer Bibliotheksdatei führen wahrscheinlich zu Verhaltensunterschieden, wenn die Binärdatei ausgeführt oder von einer anderen Anwendung verwendet wird.
Es ist leicht, das Erstellungs- oder Änderungsdatum und die Uhrzeit einer Datei zu fälschen. Das bedeutet, dass es zwei Versionen einer Datei geben kann, die den gleichen Namen, die gleiche Dateigröße (wenn die Änderungen den vorhandenen Inhalt Byte für Byte ersetzen) und den gleichen Datumsstempel haben. Und doch könnte eine der Dateien verändert worden sein.
Sichere Hash-Algorithmen
Ein sicherer Hash-Algorithmus ist ein mathematisch-basierter Algorithmus. Es erstellt einen 64-Bit-Wert, indem es alle Bytes in einer Datei scannt und eine mathematische Transformation auf sie anwendet, um den Hash-Wert zu generieren. An jedem Tag erzeugt dieselbe Datei immer denselben Hash. Selbst ein Unterschied von einem Byte führt zu einem völlig anderen Hash.
Oft wird der Hash einer Datei auf der Download-Seite angezeigt. Sie sollten einen Hash für die Datei generieren, sobald Sie sie heruntergeladen haben. Wenn er sich von dem auf der Webseite angezeigten Hash unterscheidet, wissen Sie, dass die Datei kompromittiert ist. Entweder wurde sie manipuliert und durch die Originaldatei ersetzt – um die Benutzer zum Herunterladen der befallenen Datei zu bewegen – oder sie wurde während der Übertragung beschädigt.
Auf unserem Testcomputer haben wir zwei Kopien derselben Datei, eine gemeinsam genutzte Bibliothek. Die Dateien wurden umbenannt, sodass sie sich im selben Verzeichnis befinden können. Theoretisch sollten diese Dateien identisch sein. Schließlich soll es sich um dieselbe Version der gemeinsam genutzten Bibliothek handeln.
ls -l *.so
Die Dateien haben dieselbe Größe, dieselben Datumsstempel und dieselben Zeitstempel. Für den zufälligen Beobachter scheinen sie gleich zu sein. Lassen Sie uns den Befehl sha256sum
verwenden und einen Hash für jede Datei generieren.
sha256sum binary_file1.so
sha256sum binary_file2.so
Die Hashes sind völlig unterschiedlich, was deutlich darauf hinweist, dass es Unterschiede zwischen den beiden Dateien gibt. Wenn auf der Website der Hash der Originaldatei angezeigt wird, können Sie die nicht übereinstimmende Datei verwerfen.
Die Unterschiede finden
Wenn Sie sich die Änderungen ansehen möchten, gibt es auch Möglichkeiten, dies zu tun. Sie müssen weder in der Lage sein, die Datei zu dekompilieren, noch den Assembly- oder Maschinencode zu verstehen, um die Änderungen zu sehen. Um zu verstehen, was diese Änderungen bedeuten und welchen Zweck sie haben, sind natürlich tiefere technische Kenntnisse erforderlich. Aber allein das Wissen, wie umfangreich die Änderungen sind, kann Aufschluss darüber geben, was mit der Datei passiert ist.
Wenn wir diff
für die beiden Binärdateien verwenden, erhalten wir eine etwas enttäuschende Antwort.
diff binary_file1.so binary_file2.so
Wir wussten bereits, dass die Dateien unterschiedlich waren. Versuchen wir es mit cmp
.
cmp binary_file1.so binary_file2.so
Das sagt uns ein bisschen mehr. Das erste Byte, das sich zwischen den beiden Dateien unterscheidet, ist Byte Nummer 13451. Das heißt, vom Anfang der Binärdatei an gezählt, unterscheidet sich Byte 13451 in den beiden Binärdateien. 13451 ist also der Offset der ersten Differenz vom Anfang der Datei.
Zufälligerweise gibt es in der gesamten Datei Bytes, die den Hexadezimalwert 0x10 enthalten. Dies ist der Wert, den Linux in Textdateien als Zeilenendezeichen verwendet. Der Befehl cmp
hat 131 Bytes mit diesem Wert zwischen dem Anfang der Binärdatei und dem Speicherort der ersten Differenz festgestellt. Es geht also davon aus, dass es sich um Zeile 132 handelt. In diesem Zusammenhang hat das eigentlich keine Bedeutung.
Wenn wir die Option -l
(ausführlich) hinzufügen, erhalten wir nützliche Informationen.
cmp -l binary_file1.so binary_file2.so
Alle abweichenden Bytes werden aufgelistet. Die Bytenummer oder der Offset, der Wert aus der ersten Datei und der Wert aus der zweiten Datei werden angezeigt, mit einem Byte pro Ausgabezeile.
Die Bytewerte werden im Oktalformat angezeigt, statt im üblichen Hexadezimalformat, das bei Binärdateien verwendet wird. Dennoch haben wir noch etwas anderes gelernt. Alle geänderten Bytes befinden sich in einer fortlaufenden Reihenfolge. Ihre Offsets werden für jedes Byte um eins erhöht.
Das Tool hexdump
gibt eine Binärdatei im Terminalfenster aus. Wenn wir die Option -C
(kanonisch) verwenden, listet die Ausgabe in jeder Zeile den Offset, die Werte von 16 Bytes an diesem Offset und – falls vorhanden – die ASCII-Darstellung der Bytewerte auf .
hexdump -C binary_file1.so
Wir können die Ausgabe von hexdump
als Eingabe für diff
verwenden, sodass diff
so funktioniert, als würde es zwei Textdateien lesen.
diff <(hexdump binary_file1.so) <(hexdump binary_file2.so)
diff
findet die unterschiedlichen Zeilen und zeigt die hexadezimalen Bytewerte aus der ersten Datei über den Werten aus der zweiten Datei an. Der Offset der ersten Zeile beträgt 0x3480 oder 13440 in Dezimalzahl. Zuvor teilte uns cmp
mit, dass die erste Änderung bei Byte 13451 stattgefunden habe, also 0x348B. Das entspricht tatsächlich dem, was wir hier sehen.
Die Ausgabe von diff
erfolgt in Zwei-Byte-Blöcken. Das erste Bytepaar sind die Bytes 0 und 1 vom Offset von 0x3480, der zweite Block enthält die Bytes 2 und 3 vom Offset. Block 6 enthält die Bytes 0xA und 0xB oder 10 und 11 in Dezimalzahl. Das sind die Bytes 13450 und 13451. Und wir können sehen, dass es sich um die ersten Bytes handelt, die sich unterscheiden. Die ersten fünf Bytepaare sind in beiden Dateien gleich.
Da diff
jedoch von der Basis Null aus zählt, ist das, was cmp
13451 aufruft, Byte 13540 für diff
. Und um die Sache noch verwirrender zu machen, wird die Bytereihenfolge in jedem Zwei-Byte-Block durch diff
umgekehrt. Die Bytes werden tatsächlich in dieser Reihenfolge aufgelistet: 1 und 0, 3 und 2, 5 und 4, 7 und 6 und so weiter.
Der Befehl ist auch rechenintensiv – zwei hexdumps
und ein diff
auf einmal – insbesondere wenn die zu vergleichenden Dateien groß sind.
Aber wenn hexdump -C
eine ASCII-Version der Binärdatei an das Terminalfenster senden kann, warum leiten wir die Ausgabe dann nicht in Textdateien um und vergleichen diese beiden Textdateien dann mit diff
?
hexdump -C binary_file1.so > binary1.txt
hexdump -C binary_file2.so > binary2.txt
diff binary1.txt binary2.txt
Der Unterschied zwischen den beiden Dateien wird in zwei kurzen Auszügen dargestellt. Daneben befindet sich eine ASCII-Darstellung. Für jeden Unterschied zwischen den Dateien wird ein Auszugspaar erstellt. In diesem Beispiel gibt es nur einen Unterschied.
Das ist alles sehr schön, aber wäre es nicht großartig, wenn es etwas gäbe, das all das für Sie erledigt?
VBinDiff
Das VBinDiff-Programm kann aus den üblichen Repositories für alle wichtigen Distributionen installiert werden. Um es unter Ubuntu zu installieren, verwenden Sie diesen Befehl:
sudo apt install vbindiff
Auf Fedora müssen Sie Folgendes eingeben:
sudo dnf install vbindiff
Manjaro-Benutzer müssen pacman
verwenden.
sudo pacman -Sy vbindiff
Um das Programm zu verwenden, übergeben Sie den Namen der beiden Binärdateien in der Befehlszeile.
vbindiff binary_file1.so binary_file2.so
Die terminalbasierte Anwendung wird geöffnet und zeigt beide Dateien in einer Scrollansicht an.
Sie können das Scrollrad der Maus oder die Tasten „Pfeil nach oben“, „Pfeil nach unten“, „Pos1“, „Ende“, „Bild nach oben“ und „Bild nach unten“ verwenden, um durch die Dateien zu navigieren. Beide Dateien werden gescrollt.
Drücken Sie die „Enter“-Taste, um zum ersten Unterschied zu springen. Der Unterschied wird in beiden Dateien hervorgehoben.
Wenn es mehr Unterschiede gäbe, würde durch Drücken der Eingabetaste der nächste Unterschied angezeigt. Durch Drücken von „q“ oder „Esc“ wird das Programm beendet.
Was ist der Unterschied?
Wenn Sie an einem Computer arbeiten, der jemand anderem gehört, und keine Pakete installieren dürfen, können Sie cmp
, diff
und hexdump verwenden
. Wenn Sie die Ausgabe zur weiteren Verarbeitung erfassen müssen, sind diese Tools ebenfalls die richtige Wahl.
Wenn Sie jedoch berechtigt sind, Pakete zu installieren, vereinfacht und beschleunigt VBinDiff Ihren Arbeitsablauf. Und tatsächlich ist die Verwendung von VBinDiff mit einer einzelnen Binärdatei eine einfache und bequeme Möglichkeit, Binärdateien zu durchsuchen, was ein schöner Bonus ist.