
Visualisiert wiederholte Bytesequenzen in Binärdateien, um verborgene Strukturen aufzudecken, und unterstützt Reverse Engineering und Mustererkennung ohne vordefinierte Signaturen.

hexcymatix ist ein exploratives Forschungsprojekt, das lose als ein binäres
Reverse-Engineering-Werkzeug zur Extraktion struktureller Informationen aus
wiederholten Bytemustern in Binärdateien konzipiert war.
Die Idee wurde nie zu einem brauchbaren Werkzeug ausgearbeitet, liefert aber dennoch einige faszinierende Darstellungen der auffälligen Selbstsymmetrie in alltäglichen Daten.
Manchmal hat man beim Reverse Engineering ein Beispiel für bestimmte Daten — eine Tabelle, einen komprimierten Block, eine Protokoll-Payload — und möchte ähnliche Daten an anderer Stelle in einer Datei finden, ohne bereits eine Regel oder einen Parser schreiben zu können, der die Daten beschreibt. Man möchte Ähnlichkeit ohne Spezifikation.
hexcymatix geht davon aus, dass wiederholte Byte-Sequenzen Struktur oder
Beziehung implizieren, auch wenn wir nicht wissen, was diese Struktur ist. Indem
wir Wiederholungen visualisieren, können wir zusammenhängende Daten sichtbar
machen, ohne genau zu wissen, wonach wir suchen.
Zum Beispiel enthält die untenstehende Passage aus den Pensées mehrere sich
selbst wiederholende Sequenzen (' incapable of ', ' which he ', 'ing either ') —
hexcymatix legt die Datei über zwei Zeilen aus und verbindet alle wiederholten
Byte-Sequenzen mit einer Länge von mindestens 8 Bytes:

Die dabei entstehenden Verbindungen deuten dann auf zugrunde liegende Strukturen und Beziehungen in den Daten hin.
Wenn man diesen Prozess auf eine alltägliche Binärdatei anwendet, fördert er automatisch unerwartete Selbstähnlichkeiten, Verbindungen und Strukturen zutage. Als Beispiel hier das Error-Lookup-Programm aus einer Standard-Windows-Installation:

Der wichtigste Teil des Prozesses ist das Hinzufügen von Bögen zwischen den Fragment-Verbindungen, damit die Ausgabe cool aussieht:

Nachdem wir den Faden völlig verloren haben, können wir mit verschiedenen Darstellungen der Daten experimentieren. Zum Beispiel erscheinen dieselbe Datei und dieselben Verbindungen, um den Umfang eines Kreises angeordnet, wie folgt:

python hexcymatix.py [options] file [file ...]
# Circular visualization of an executable
python hexcymatix.py --circular guidgen.exe
# Linear visualization, top 500 fragments only
python hexcymatix.py --linear --top 500 guidgen.exe
# Batch, 4K output
python hexcymatix.py --circular --resolution 4k *.exe






























pip install pycairo numpy pillow
pycairo wird gegen die native Cairo-Bibliothek gebaut, die zuerst installiert
sein muss — brew install cairo pkg-config unter macOS oder apt install libcairo2-dev pkg-config unter Debian/Ubuntu.
Das Werkzeug wurde als Hilfsmittel für das Reverse Engineering entwickelt: Mit einem einzigen bekannten Beispiel für bestimmte Daten — eine Struktur, einen komprimierten Block, eine Protokoll-Payload — sollen weitere Instanzen davon in der Datei gefunden werden, ohne zusätzliches Reverse Engineering zu benötigen. Die Hoffnung war, dass Bereiche, die viele wiederholte Teilsequenzen mit dem bekannten Beispiel teilen, sich zu Kandidaten gruppieren würden, die eine genauere Untersuchung verdienen.
Letztendlich erwies sich die Idee als zu unsolide und der Anwendungsfall als zu eng, sodass die Technik nie zu dem nahtlosen Plugin weiterentwickelt wurde, das für brauchbare Forschung nötig gewesen wäre. Die Arbeit wird hier geteilt, damit sie nicht im Äther verloren geht, in der Hoffnung, dass vielleicht jemand anderes darauf aufbauen kann.
Dieses Projekt wurde ursprünglich von Hand in C# geschrieben. Es wurde mithilfe von LLMs nach Python portiert, mit wenig Aufsicht oder Überprüfung.
hexcymatix ist ein Forschungsprojekt von Christopher Domas (@xoreaxeaxeax).

| Option | Beschreibung |
|---|
--circular | Kreisförmiges Layout: Byte-Offsets werden auf Winkel auf einem Ring abgebildet (Standard) |
--linear | Parallelbalken-Layout: zwei horizontale Balken, verbunden durch sich kreuzende Vierecke |
--top N [N ...] | Nur die N längsten Fragmente vor dem Rendern behalten; mehrere Werte übergeben, um für jeden Schwellenwert ein Bild zu rendern |
--no-arcs | Nur Sehnen zeichnen und die Bögen überspringen (deutlich schneller, weniger visuelles Rauschen) |
--resolution RES | Ausgabeauflösung als WxH oder eine Voreinstellung: 480p, 720p, 1080p, 1440p, 4k, uwfhd (2560x1080), suwfhd (3840x1080) (Standard: 1080p) |
--ultra | Kurzform für --resolution 4000x4000 |
--circle-fill F | Anteil des Leinwanddurchmessers, der vom Kreis genutzt wird (Standard: 0.25 bzw. 0.50 bei den ultrabreiten Voreinstellungen) |
--jpg | Zusätzlich zu jedem PNG ein JPEG mit 80 % Qualität schreiben |
--output-dir DIR | Verzeichnis für die Ausgabedateien (Standard: output) |