Wiimms Hex-Dumper
Ich habe mir in dieser Woche einen neuen Hex-Dumper gebaut. Der Dumper kann auch Dezimal, Big- und Little-Endian, Ganzzahlen mit 1 bis 8 Bytes sowie Fließkommazahlen (4 und 8 bytes). Dann kann er nicht nur Dumpen, sondern auch Binärdateien vergleichen und die Unterschiede als Hex-Dump darstellen sowie Hex-Dumps in einlesen und als Binärdaten ausgaben.
Sucht euch dass passende raus:
* download.wiimm.de/tools/xdump/
Ich habe bisher ausschließlich die x86_64-Version getestet. Die anderen beiden (i386 und Cygwin) sollten aber auch funktionieren.
Durch die Option -h (--help) erhält man eine Hilfe zum jeweiligen Kommando, und durch -hh (--help --help) zum gesamten Tool. Diese Hilfen sind auch im Download-Bereich hinterlegt.
Installation
Den Dumper am besten in ein von PATH erfasstes Verzeichnis. Bei mir (Linux) liegt er im Verzeichnis /usr/local/bin/xdump. Dann habe ich noch 2 Softlinks eingebaut, um die beiden anderen Tools direkt nutzen zu können:
Die Links muss man nicht setzen. Mit "xdump +diff" bzw. "xdump +scan" kommt man alternativ an die anderen Kommandos.
Geschichte
Ich habe schon diverse Hex-Dumper, meist integriert in den Debug-Funktionen eines Tools, geschrieben. Ein Beispiel hierfür ist der Hex-Dump von mkw-ana. Bei der Analyse der Wii-Images für meine WIT-Tools habe ich dann das Tool hexdump16 als Analyse-Hilfe geschrieben. Und jede Implementierung hatte ihre eigenen Vorteile.
Schon länger stand auf dem Plan, dass ich den Hex-Dumper als C-Bibliothek schreibe und dabei die Features der einzelnen Tools vereinige. Und so ist XDUMP entstanden.
Das Tool XDUMP analysiert nur die Parameter und Optionen, baut dann eine Kontroll-Struktur auf und übergibt diese den Bibliotheks-Funktionen XDump(), XDiff() oder XScan().
Kommando +CREATE
Das Tool hat auch einen kleinen Binär-Datei-Erzeuger dabei, um den Dumper zu testen. Er kann für jedes Ausgabeformat eine spezielle Ausgabe erzeugen.
Mit der Option -1 erzeugt er exakt 43 (eine Primzahl) Bytes mit den Werten 0 bis 42 (eine meiner Lieblingszahlen).
Mit "xdump +create -1" erzeige ich so eine nachvollziehbare Binärdateien, die dann direkt an den Dumper weitergereicht wird.
Hilfe gibt es mit: xdump +create -h (Text-Version)
Dump-Beispiele
Ein einfacher Dump sieht so aus:
Jetzt behaupten wir, dass jeweils 4 Bytes eine Zahl ergeben:
Das ganze als Big-Endian mit 3 Bytes pro Zahl:
Bei der Ganzzahl-Ausgabe kann man entscheiden zwischen
* Hex oder Dezimal
* Mit oder ohne führende Nullen oder C-Syntax
Die Ausgabe als Fließkommazahlen ist auch möglich, wieder mit Big- oder Little-Endian:
Mit --skip=size und --max=size kann man auch nur einen Teil der Datei anzeigen lassen:
Die Option --align richtet es wieder aus:
Wird die Option --align gesetzt, dann wird versucht, dass das jeweils erste Byte eine Zeile und damit auch die Adress-Anzeige auf einem Vielfachen von Bytes_pro_Zeile legen. Wie das folgenden Beispiel zeigt, ist es manchmal nur näherungsweise möglich:
Dann kann man auch einen Trigger setzen, um vorzeitig eine neue Zeile zu beginnen. Im Beispiel habe ich das Leerzeichen (Code 32) verwendet:
Und mit --align erhält man eine andere Anzeige. Der Trigger ist diesmal das Komma:
Alle Optionen lassen sich beliebig kombinieren!
XDIFF: Der Vergleich
Mit dem Kommando XDIFF lassen sich 2 Dateien vergleichen. Die Unterschiede werden dann als Hexdump ausgegeben.
Vergleich von 2 Dateien:
Vergleich einer Datei mit STDIN:
Es folgen 2 Beispiel-Ausgaben mit speziell konstruierten Test-Dateien:
Quellcode
- # ./xdiff test-8016.bin test-8050.bin
- Diff file: test-8016.bin : test-8050.bin
- < 1c40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f :@ABCDEFGHIJKLMNO:
- > 1c40: . . . . . . . . . . . . . . 5f 5f :@ABCDEFGHIJKLM__:
- < 1c50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f :PQRSTUVWXYZ[\]^_:
- > 1c50: 5f 5f . . . . . . . . . . . . . . :__RSTUVWXYZ[\]^_:
- < 1f50: / ::
- > 1f50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f :PQRSTUVWXYZ[\]^_:
Beim 2. Beispiel wurde mit -D (--dec) die Dezimal-Ausgabe und mit -s (--small) eine schmale Ausgabe gewählt:
Quellcode
XSCAN: Hexdump wieder in Binärdatei wandeln.
Es ist auch möglich, einen (Hex-)Dump wieder zurück in eine Binär-Datei zu wandeln. Dieses ist hilfreich, wenn man die Werte verändert gelöscht oder hinzugefügt hat. Beim Einlesen wird das Adressfeld am Anfang und der Text-Teil am Ende einer jeden Zeile ignoriert.
Syntax: