
Visualise les séquences d'octets répétées dans les fichiers binaires pour révéler une structure cachée, prenant en charge la rétro-ingénierie et la découverte de motifs sans signatures prédéfinies.

hexcymatix est un projet de recherche exploratoire, conçu de manière lâche comme un outil de rétro-ingénierie binaire pour extraire des informations structurelles à partir de motifs d'octets répétés dans les fichiers binaires.
L'idée ne s'est jamais concrétisée en un outil utilisable, mais elle produit néanmoins des représentations fascinantes de l'étonnante auto-symétrie présente dans les données courantes.
Parfois, en rétro-ingénierie, vous disposez d'un exemple de certaines données — une table, un blob compressé, une charge utile de protocole — et vous voulez trouver des données similaires ailleurs dans un fichier, sans encore pouvoir écrire une règle ou un analyseur qui les décrive. Vous voulez de la similarité sans spécification.
hexcymatix postule que des séquences d'octets répétées impliquent une structure ou une relation, même si nous ne savons pas ce qu'est cette structure. En visualisant les répétitions, nous pouvons faire apparaître des données liées sans savoir exactement ce que nous cherchons.
Par exemple, le passage des Pensées ci-dessous contient plusieurs séquences auto-répétées (' incapable of ', ' which he ', 'ing either ') — hexcymatix dispose le fichier sur deux lignes et relie toute séquence d'octets répétée d'au moins 8 octets :

Les connexions qui apparaissent suggèrent alors la structure et les relations sous-jacentes dans les données.
Répéter ce processus sur un fichier binaire courant commence à faire émerger automatiquement une auto-similarité, des connexions et une structure inattendues. À titre d'exemple, voici l'exécutable de recherche d'erreurs d'une installation Windows standard :

La partie la plus importante du processus consiste à ajouter des arcs entre les connexions de fragments pour rendre le rendu esthétique :

Ayant complètement perdu le fil, nous pouvons expérimenter diverses représentations des données. Par exemple, le même fichier et les mêmes connexions rendus autour du périmètre d'un cercle apparaissent comme suit :

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 se compile contre la bibliothèque cairo native, qui doit être installée au préalable — brew install cairo pkg-config sur macOS, ou apt install libcairo2-dev pkg-config sur Debian/Ubuntu.
L'outil a été développé comme aide à la rétro-ingénierie : à partir d'un seul exemple connu de certaines données — une structure, un blob compressé, une charge utile de protocole — trouver d'autres occurrences dans le fichier sans avoir besoin de rétro-ingénierie supplémentaire. L'espoir était que les régions partageant de nombreuses sous-séquences répétées avec l'exemple connu se regroupent en candidats dignes d'une investigation plus approfondie.
En fin de compte, l'idée semblait fragile et le cas d'utilisation restreint, si bien que la technique n'a jamais été développée en un plugin transparent tel qu'il aurait été nécessaire pour une recherche utile. Ce travail est partagé ici pour ne pas être perdu dans les limbes, dans l'espoir que quelqu'un d'autre puisse s'en inspirer.
Ce projet a été initialement écrit à la main en C#. Il a été porté en Python à l'aide de LLM, avec peu de supervision ou de relecture.
hexcymatix est un effort de recherche de Christopher Domas (@xoreaxeaxeax).

| Option | Description |
|---|
--circular | Disposition circulaire : les décalages d'octets correspondent à des angles sur un anneau (par défaut) |
--linear | Disposition en barres parallèles : deux barres horizontales reliées par des quadrilatères croisés |
--top N [N ...] | Conserver uniquement les N fragments les plus longs avant le rendu ; passer plusieurs valeurs pour générer une image par seuil |
--no-arcs | Dessiner uniquement les cordes, sans les arcs (nettement plus rapide, moins de bruit visuel) |
--resolution RES | Résolution de sortie sous forme WxH ou préréglage : 480p, 720p, 1080p, 1440p, 4k, uwfhd (2560x1080), suwfhd (3840x1080) (par défaut : 1080p) |
--ultra | Raccourci pour --resolution 4000x4000 |
--circle-fill F | Fraction du diamètre du canevas occupée par le cercle (par défaut : 0.25, ou 0.50 pour les préréglages ultra-larges) |
--jpg | Écrire également un JPEG en qualité 80 % à côté de chaque PNG |
--output-dir DIR | Répertoire des fichiers de sortie (par défaut : output) |