xdump : Wiimms Hex-Dumper

      xdump : Wiimms Hex-Dumper

      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:

      Quellcode

      1. ln -s xdump /usr/local/bin/xdiff
      2. ln -s xdump /usr/local/bin/xscan

      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:

      Quellcode

      1. # xdump +create -1 | xdump
      2. #FORMAT: HEX1
      3. 0: 0 1 2 3 4 5 6 7 8 9 a b c d e f :................:
      4. 10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f :................:
      5. 20: 20 21 22 23 24 25 26 27 28 29 2a / : !"#$%&'()*:
      6. 2b: [43 Bytes]
      Die Format-Zeile "#FORMAT: ...", die man auch ausblenden kann, gibt das Dump-Format an. Diese wird auch von XSCAN zur automatischen Format-Erkennung genutzt.

      Jetzt behaupten wir, dass jeweils 4 Bytes eine Zahl ergeben:

      Quellcode

      1. # xdump +create -1 | xdump -4
      2. #FORMAT: HEX4 LE
      3. 0: 3020100 7060504 b0a0908 f0e0d0c :................:
      4. 10: 13121110 17161514 1b1a1918 1f1e1d1c :................:
      5. 20: 23222120 27262524 >3 : !"#$%&':
      6. #FORMAT: HEX1
      7. 28: 28 29 2a :()*:
      8. 2b: [43 Bytes]
      Zum einen sehen wir ">3", was angibt, dass noch 3 Bytes folgen, die nicht als 4-bytige Zahl verwendet werden können. Daher erfolgt eine Umschaltung auf Einzelbytes und eine weitere Zeile.

      Das ganze als Big-Endian mit 3 Bytes pro Zahl:

      Quellcode

      1. # xdump +create -1 | xdump -3b
      2. #FORMAT: HEX3 BE
      3. 0: 102 30405 60708 90a0b c0d0e f1011 :..................:
      4. 12: 121314 151617 18191a 1b1c1d 1e1f20 212223 :.............. !"#:
      5. 24: 242526 272829 >1 :$%&'():
      6. #FORMAT: HEX1
      7. 2a: 2a :*:
      8. 2b: [43 Bytes]
      Hier wird die automatischen Anzahl der Bytes pro Zeile auf 18 angehoben, da sie ja ganzzahlig durch 3 teilbar sein muss.

      Bei der Ganzzahl-Ausgabe kann man entscheiden zwischen
      * Hex oder Dezimal
      * Mit oder ohne führende Nullen oder C-Syntax

      Quellcode

      1. 0: 0 1 2 3 4 5 6 7 8 9 a b c d e f
      2. 0: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f
      3. 0: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
      4. 0: 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015
      5. /* 0*/ 0x00,0x01,0x02,0x03, 0x04,0x05,0x06,0x07,
      6. /* 0*/ 0, 1, 2, 3, 4, 5, 6, 7,

      Die Ausgabe als Fließkommazahlen ist auch möglich, wieder mit Big- oder Little-Endian:

      Quellcode

      1. # xdump +create -1 | xdump -f
      2. #FORMAT: FLOAT LE
      3. 0: 3.8205e-37 1.0083e-34 2.6585e-32 7.0037e-30 :................:
      4. 10: 1.8436e-27 4.8494e-25 1.2747e-22 3.3482e-20 :................:
      5. 20: 8.7891e-18 2.3057e-15 >3 : !"#$%&':
      6. #FORMAT: HEX1
      7. 28: 28 29 2a :()*:
      8. 2b: [43 Bytes]
      Mit -d anstatt -f werden Fließkommazahlen mit doppelter Genauigkeit (8 Bytes) angezeigt.


      Mit --skip=size und --max=size kann man auch nur einen Teil der Datei anzeigen lassen:

      Quellcode

      1. # xdump +create -1 | xdump --skip 9 --max 20
      2. #FORMAT: HEX1
      3. 9: 9 a b c d e f 10 11 12 13 14 15 16 17 18 :................:
      4. 19: 19 1a 1b 1c / :....:
      5. 1d: [20 Bytes]


      Die Option --align richtet es wieder aus:

      Quellcode

      1. # xdump +create -1 | xdump --skip 9 --max 20 --align
      2. #FORMAT: HEX1
      3. 0: 9 a b c d e f : .......:
      4. 10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c / :.............:
      5. 1d: [20 Bytes]

      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:

      Quellcode

      1. # xdump +create -1 | xdump -4b --skip 11 --max 0x40 --align
      2. #FORMAT: HEX4 BE
      3. 3: b0c0d0e f101112 : ........:
      4. 13: 13141516 1718191a 1b1c1d1e 1f202122 :............. !":
      5. 23: 23242526 2728292a / :#$%&'()*:
      6. 2b: [32 Bytes]


      Dann kann man auch einen Trigger setzen, um vorzeitig eine neue Zeile zu beginnen. Im Beispiel habe ich das Leerzeichen (Code 32) verwendet:

      Quellcode

      1. # echo "Hallo Wiimm, wie geht es dir." | xdump --trigger 32
      2. #FORMAT: HEX1
      3. 0: 48 61 6c 6c 6f 20 :Hallo :
      4. 6: 57 69 69 6d 6d 2c 20 :Wiimm, :
      5. d: 77 69 65 20 :wie :
      6. 11: 67 65 68 74 20 :geht :
      7. 16: 65 73 20 :es :
      8. 19: 64 69 72 2e a / :dir..:
      9. 1e: [30 Bytes]


      Und mit --align erhält man eine andere Anzeige. Der Trigger ist diesmal das Komma:

      Quellcode

      1. # echo "Hallo Wiimm, wie geht es dir." | xdump --trigger 0x2c --align
      2. #FORMAT: HEX1
      3. 0: 48 61 6c 6c 6f 20 57 69 69 6d 6d 2c :Hallo Wiimm,:
      4. 0: 20 77 69 65 : wie:
      5. 10: 20 67 65 68 74 20 65 73 20 64 69 72 2e a / : geht es dir..:
      6. 1e: [30 Bytes]


      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:

      Quellcode

      1. xdiff file1 file2 | less
      2. xdump +diff file1 file2 | less

      Vergleich einer Datei mit STDIN:

      Quellcode

      1. ... | xdiff file1 | less
      2. ... | xdump +diff file1 | less

      Es folgen 2 Beispiel-Ausgaben mit speziell konstruierten Test-Dateien:

      Quellcode

      1. # ./xdiff test-8016.bin test-8050.bin
      2. Diff file: test-8016.bin : test-8050.bin
      3. < 1c40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f :@ABCDEFGHIJKLMNO:
      4. > 1c40: . . . . . . . . . . . . . . 5f 5f :@ABCDEFGHIJKLM__:
      5. < 1c50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f :PQRSTUVWXYZ[\]^_:
      6. > 1c50: 5f 5f . . . . . . . . . . . . . . :__RSTUVWXYZ[\]^_:
      7. < 1f50: / ::
      8. > 1f50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f :PQRSTUVWXYZ[\]^_:
      Alles anzeigen
      In der jeweils 2 Zeile werden nur Tahlenwertr ausgegeben, wenn der Wirt sich vom vorherigen unterscheidet.

      Beim 2. Beispiel wurde mit -D (--dec) die Dezimal-Ausgabe und mit -s (--small) eine schmale Ausgabe gewählt:

      Quellcode

      1. # ./xdiff test-8016.bin test-8050.bin -Ds
      2. Diff files: test-8016.bin : test-8050.bin
      3. < 1c48: 72 73 74 75 76 77 78 79 :HIJKLMNO:
      4. > 1c48: . . . . . . 95 95 :HIJKLM__:
      5. < 1c50: 80 81 82 83 84 85 86 87 :PQRSTUVW:
      6. > 1c50: 95 95 . . . . . . :__RSTUVW:
      7. < 1f50: / ::
      8. > 1f50: 80 81 82 83 84 85 86 87 :PQRSTUVW:
      Alles anzeigen


      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:

      Quellcode

      1. xscan file.txt > file.bin
      2. xdump +scan file.txt > file.bin

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.
      Ich trage keinen FC auf Vorrat ein, sondern nur, wenn sich ein Spiel ergibt.
      V0.02 ist online. Ich habe im wesentliche textuelle Änderungen u.a. in der eingebauten Hilfe vorgenommen:

      Quellcode

      1. xdump v0.02 r2618 - 2016-10-22
      2. - C-Syntax: Suppress '/' and '>NUM' for incomplete lines.
      3. - Command +CREATE: Control content and size with --skip and --max.
      4. - Built-in help improved.

      Als zweites habe ich noch die obige Einführung ergänzt.

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.
      Ich trage keinen FC auf Vorrat ein, sondern nur, wenn sich ein Spiel ergibt.
      Ich habe das Thema mal in die PC-Ecke verschoben.

      @Wii Freund
      Vor meinem ersten Hex-Dumper hatte ich noch "od" genutzt. "xxd" ist dagegen schon viel besser. Bei der Analyse der Wii-Images fehlten mir insbesondere die Endian-Auswahl. Und so gab es dann "hexdump16" und dessen Nachfolger "xdump".

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.
      Ich trage keinen FC auf Vorrat ein, sondern nur, wenn sich ein Spiel ergibt.
      Tatsächlich gab es einen Download (x86-64) und er war wohl von @Wii Freund. Schade, denn ich betrachte das Tool bei der Hex-Analyse von Dateien als sehr nützlich und nutze es regelmäßig.

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.
      Ich trage keinen FC auf Vorrat ein, sondern nur, wenn sich ein Spiel ergibt.