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.
      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 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.
      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 habe xdump auf v1.00 aktualisiert:
      * download.wiimm.de/tools/xdump/

      Quellcode

      1. xdump v1.00 r2877 - 2019-02-02
      2. - New option: --ingore (-i): Ignore data lines with NULL bytes only and
      3. print a summary for each NULL block.
      4. - XDUMP supports now up to 600 bytes each line.
      5. - Windows only: Cygwin update to v2.11.1 2018-09-05.

      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.