
Visualizza sequenze di byte ripetute nei file binari per rivelare strutture nascoste, supportando il reverse engineering e l'individuazione di pattern senza firme predefinite.

hexcymatix è un progetto di ricerca esplorativo, vagamente concepito come uno
strumento di reverse engineering binario per estrarre informazioni strutturali
da pattern di byte ripetuti nei file binari.
L'idea non si è mai concretizzata in uno strumento utilizzabile, ma produce comunque alcune affascinanti rappresentazioni della sorprendente auto-simmetria presente nei dati di uso quotidiano.
A volte nel reverse engineering hai un esempio di certi dati — una tabella, un blob compresso, un payload di protocollo — e vuoi trovare dati simili altrove in un file, senza ancora poter scrivere una regola o un parser che li descriva. Vuoi similarità senza specifica.
hexcymatix parte dal presupposto che stringhe di byte ripetute implichino
struttura o relazione, anche se non sappiamo quale sia quella struttura.
Visualizzando le ripetizioni, possiamo far emergere dati correlati senza sapere
esattamente cosa stiamo cercando.
Ad esempio, il brano delle Pensées qui sotto contiene diverse sequenze che si
ripetono (' incapable of ', ' which he ', 'ing either ') — hexcymatix
dispone il file su due righe e collega qualsiasi sequenza di byte ripetuta di
almeno 8 byte:

Le connessioni che emergono suggeriscono quindi struttura e relazioni sottostanti nei dati.
Ripetendo questo processo su un file binario di uso quotidiano, si iniziano a far emergere automaticamente auto-similarità, connessioni e strutture inaspettate. Come esempio, ecco l'eseguibile per la ricerca degli errori in un'installazione Windows standard:

La parte più importante del processo è aggiungere archi tra le connessioni dei frammenti per rendere l'output accattivante:

Avendo ormai perso completamente il filo, possiamo sperimentare con varie rappresentazioni dei dati. Ad esempio, lo stesso file e le stesse connessioni renderizzate attorno al perimetro di un cerchio appaiono come segue:

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 viene compilato contro la libreria cairo nativa, che deve essere
presente prima — brew install cairo pkg-config su macOS, oppure apt install libcairo2-dev pkg-config su Debian/Ubuntu.
Lo strumento è stato sviluppato come ausilio per il reverse engineering: dato un singolo esempio noto di certi dati — una struct, un blob compresso, un payload di protocollo — trovare altre istanze dello stesso dato nel file senza bisogno di ulteriore RE. La speranza era che le regioni che condividono molte sottosequenze ripetute con l'esempio noto si raggruppassero in candidati degni di ulteriori indagini.
Alla fine, l'idea sembrava traballante e il caso d'uso limitato, quindi la tecnica non è mai stata sviluppata nel tipo di plugin integrato che sarebbe servito per una ricerca utile. Il lavoro è condiviso qui affinché non vada perso nell'etere, nella speranza che forse qualcun altro possa costruirci sopra.
Questo progetto è stato originariamente scritto a mano in C#. È stato portato in Python utilizzando LLM, con poca supervisione o revisione.
hexcymatix è uno sforzo di ricerca di Christopher Domas (@xoreaxeaxeax).

| Flag | Description |
|---|
--circular | Layout circolare: gli offset dei byte corrispondono ad angoli su un anello (predefinito) |
--linear | Layout a barre parallele: due barre orizzontali collegate da quadrilateri incrociati |
--top N [N ...] | Mantieni solo gli N frammenti più lunghi prima del rendering; passa più valori per renderizzare un'immagine per ogni soglia |
--no-arcs | Disegna solo le corde, saltando gli archi (sostanzialmente più veloce, meno rumore visivo) |
--resolution RES | Risoluzione di output come WxH o un preset: 480p, 720p, 1080p, 1440p, 4k, uwfhd (2560x1080), suwfhd (3840x1080) (predefinito: 1080p) |
--ultra | Abbreviazione di --resolution 4000x4000 |
--circle-fill F | Frazione del diametro della tela occupata dal cerchio (predefinito: 0.25, o 0.50 per i preset ultra-wide) |
--jpg | Scrivi anche un JPEG all'80% di qualità accanto a ogni PNG |
--output-dir DIR | Directory per i file di output (predefinito: output) |