
Visualiza secuencias repetidas de bytes en archivos binarios para revelar estructuras ocultas, facilitando la ingeniería inversa y el descubrimiento de patrones sin firmas predefinidas.

hexcymatix es un proyecto de investigación exploratoria, concebido en líneas generales como una herramienta de ingeniería inversa binaria para extraer información estructural a partir de patrones de bytes repetidos en archivos binarios.
La idea nunca se materializó en una herramienta utilizable, pero aún así produce algunas representaciones fascinantes de la sorprendente autosimetría presente en los datos cotidianos.
A veces, en ingeniería inversa, tienes un ejemplo de ciertos datos — una tabla, un blob comprimido, una carga útil de protocolo — y quieres encontrar datos similares en otra parte de un archivo, sin poder aún escribir una regla o un analizador que los describa. Deseas similitud sin especificación.
hexcymatix postula que las cadenas de bytes repetidas implican estructura o relación, incluso si no sabemos cuál es esa estructura. Al visualizar las repeticiones, podemos sacar a la luz datos relacionados sin saber exactamente qué estamos buscando.
Por ejemplo, el pasaje de Pensées que se muestra a continuación contiene varias secuencias autorrepetidas
(' incapable of ', ' which he ', 'ing either ') — hexcymatix dispone el archivo
en dos líneas y conecta cualquier secuencia de bytes repetida de al menos 8 bytes:

Las conexiones que emergen entonces insinúan la estructura subyacente y las relaciones en los datos.
Repetir este proceso en un archivo binario cotidiano comienza a extraer automáticamente autosimilitudes, conexiones y estructuras inesperadas. Como ejemplo, aquí está el ejecutable de búsqueda de errores en una instalación estándar de Windows:

La parte más importante del proceso es añadir arcos entre las conexiones de los fragmentos para que el resultado se vea genial:

Tras haber perdido por completo el norte, podemos experimentar con distintas representaciones de los datos. Por ejemplo, el mismo archivo y las mismas conexiones renderizadas alrededor del perímetro de un círculo aparecen de la siguiente manera:

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 compila contra la biblioteca cairo nativa, que debe estar presente primero — brew install cairo pkg-config en macOS, o apt install libcairo2-dev pkg-config en Debian/Ubuntu.
La herramienta se desarrolló como ayuda para la ingeniería inversa: dado un único ejemplo conocido de ciertos datos — una estructura, un blob comprimido, una carga útil de protocolo — encontrar otras instancias del mismo en el archivo sin necesidad de más ingeniería inversa. La esperanza era que las regiones que compartieran muchas subsecuencias repetidas con el ejemplo conocido se agruparan en candidatos que valiera la pena investigar más a fondo.
En última instancia, la idea parecía frágil y el caso de uso limitado, por lo que la técnica nunca se desarrolló hasta convertirse en el tipo de complemento integrado que habría necesitado para una investigación útil. El trabajo se comparte aquí para que no se pierda en el éter, con la esperanza de que quizás otra persona pueda construir sobre él.
Este proyecto fue originalmente escrito a mano en C#. Se ha portado a Python mediante LLM, con poca supervisión o revisión.
hexcymatix es un esfuerzo de investigación de Christopher Domas (@xoreaxeaxeax).

| Opción | Descripción |
|---|
--circular | Diseño circular: los desplazamientos de bytes se asignan a ángulos en un anillo (predeterminado) |
--linear | Diseño de barras paralelas: dos barras horizontales conectadas por cuadriláteros cruzados |
--top N [N ...] | Conservar solo los N fragmentos más largos antes de renderizar; pasa varios valores para generar una imagen por cada límite |
--no-arcs | Dibujar solo cuerdas, omitiendo los arcos (sustancialmente más rápido, menos ruido visual) |
--resolution RES | Resolución de salida como WxH o un valor preestablecido: 480p, 720p, 1080p, 1440p, 4k, uwfhd (2560x1080), suwfhd (3840x1080) (predeterminado: 1080p) |
--ultra | Abreviatura de --resolution 4000x4000 |
--circle-fill F | Fracción del diámetro del lienzo utilizada por el círculo (predeterminado: 0.25, o 0.50 para los valores preestablecidos ultra panorámicos) |
--jpg | Además, escribir un JPEG al 80 % de calidad junto a cada PNG |
--output-dir DIR | Directorio para los archivos de salida (predeterminado: output) |