
Визуализирует повторяющиеся последовательности байтов в бинарных файлах, чтобы выявить скрытую структуру, поддерживая реверс-инжиниринг и обнаружение закономерностей без предопределённых сигнатур.

hexcymatix — это экспериментальный исследовательский проект, в общих чертах задуманный как инструмент реверс-инжиниринга бинарных файлов для извлечения структурной информации из повторяющихся байтовых последовательностей.
Идея так и не воплотилась в полноценный инструмент, но по-прежнему даёт завораживающие изображения поразительной самосимметрии обычных данных.
Иногда при реверс-инжиниринге у вас есть образец некоторых данных — таблица, сжатый блок, полезная нагрузка протокола, — и вы хотите найти похожие данные в другом месте файла, ещё не имея возможности написать правило или парсер, который их описывает. Вам нужна схожесть без спецификации.
hexcymatix исходит из того, что повторяющиеся байтовые строки подразумевают структуру или взаимосвязь, даже если мы не знаем, что это за структура. Визуализируя повторения, мы можем выявлять связанные данные, точно не зная, что ищем.
Например, в приведённом ниже отрывке из «Мыслей» Паскаля есть несколько повторяющихся последовательностей (« incapable of », « which he », «ing either ») — hexcymatix раскладывает файл на две строки и соединяет все повторяющиеся байтовые последовательности длиной не менее 8 байт:

Возникающие при этом соединения намекают на скрытую структуру и взаимосвязи в данных.
Повторение этого процесса на обычном бинарном файле автоматически начинает выявлять неожиданную самоподобность, связи и структуру. В качестве примера — исполняемый файл просмотра кодов ошибок из стандартной установки Windows:

Самая важная часть процесса — добавление дуг между соединениями фрагментов, чтобы результат выглядел эффектно:

Полностью потеряв нить повествования, можно поэкспериментировать с различными представлениями данных. Например, тот же файл и соединения, отрисованные по периметру окружности, выглядят так:

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 собирается с привязкой к нативной библиотеке cairo, которую необходимо установить заранее: brew install cairo pkg-config в macOS или apt install libcairo2-dev pkg-config в Debian/Ubuntu.
Инструмент разрабатывался как помощник при реверс-инжиниринге: имея единственный известный образец некоторых данных — структуру, сжатый блок, полезную нагрузку протокола, — найти другие его экземпляры в файле без дополнительного реверс-инжиниринга. Предполагалось, что области, разделяющие множество повторяющихся подпоследовательностей с известным образцом, будут группироваться в кандидатов, заслуживающих дальнейшего изучения.
В конечном счёте идея казалась шаткой, а сценарий использования — узким, поэтому метод так и не был доведён до уровня бесшовного плагина, необходимого для полезных исследований. Эта работа публикуется здесь, чтобы не кануть в Лету, в надежде, что кто-то другой сможет развить её.
Изначально этот проект был написан вручную на C#. Он был портирован на Python с использованием LLM, практически без контроля и проверки.
hexcymatix — исследовательская работа Кристофера Домаса (@xoreaxeaxeax).

| Параметр | Описание |
|---|
--circular | Круговая компоновка: смещения байтов отображаются на углы кольца (по умолчанию) |
--linear | Линейная компоновка: две горизонтальные полосы, соединённые перекрещивающимися четырёхугольниками |
--top N [N ...] | Оставить только N самых длинных фрагментов перед рендерингом; можно передать несколько значений, чтобы получить по одному изображению на каждое пороговое значение |
--no-arcs | Рисовать только хорды, пропуская дуги (значительно быстрее, меньше визуального шума) |
--resolution RES | Разрешение вывода в формате WxH или один из пресетов: 480p, 720p, 1080p, 1440p, 4k, uwfhd (2560x1080), suwfhd (3840x1080) (по умолчанию: 1080p) |
--ultra | Сокращение для --resolution 4000x4000 |
--circle-fill F | Доля диаметра холста, занимаемая окружностью (по умолчанию: 0.25, или 0.50 для сверхшироких пресетов) |
--jpg | Дополнительно сохранять JPEG с качеством 80% рядом с каждым PNG |
--output-dir DIR | Каталог для выходных файлов (по умолчанию: output) |