
バイナリファイル内の繰り返し出現するバイト列を可視化して隠れた構造を明らかにし、事前定義されたシグネチャを必要とせずにリバースエンジニアリングとパターン発見を支援します。

hexcymatix は探索的な研究プロジェクトであり、バイナリファイル内の繰り返し出現するバイトパターンから構造情報を抽出するバイナリリバースエンジニアリングツールとして大まかに構想されていました。
このアイデアは実用ツールには結実しませんでしたが、それでも日常のデータに潜む驚くべき自己対称性の魅力的な表現を生み出します。
リバースエンジニアリングでは、データの一例(テーブル、圧縮ブロブ、プロトコルペイロードなど)を手にしているものの、それを記述するルールやパーサーをまだ書けないまま、ファイル内の他の場所で類似したデータを探したいことがあります。仕様なしの類似性が欲しいのです。
hexcymatix は、繰り返し出現するバイト列が、その構造が何であるかを知らなくても、構造や関連性を示唆するという考えに基づいています。繰り返しを可視化することで、自分が何を探しているのか正確にわからなくても、関連するデータを浮かび上がらせることができます。
たとえば、以下の『パンセ』の一節には、複数の自己反復配列(' incapable of '、' which he '、'ing either ')があります。hexcymatix はファイルを2行にわたって配置し、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 ライブラリに対してビルドされるため、先に cairo をインストールしておく必要があります。macOS では brew install cairo pkg-config、Debian/Ubuntu では apt install libcairo2-dev pkg-config を実行します。
このツールはリバースエンジニアリングの補助として開発されました。あるデータ(構造体、圧縮ブロブ、プロトコルペイロードなど)の既知の例が1つ与えられたとき、追加のリバースエンジニアリングを必要とせずにファイル内の他のインスタンスを探すというものです。既知の例と多くの反復部分列を共有する領域が、さらに調査する価値のある候補へとクラスタ化されることが期待されていました。
結局、このアイデアは確実性に欠け、ユースケースも狭いように思われたため、この手法は有用な研究に必要なシームレスなプラグインのような形には発展しませんでした。この成果が失われることのないようここに共有し、誰かがこれを基に発展させてくれることを願っています。
このプロジェクトは元々 C# で手書きされました。その後、LLM を使用して Python に移植されましたが、ほとんど監修やレビューは行われていません。
hexcymatix は Christopher Domas(@xoreaxeaxeax)による研究プロジェクトです。

| フラグ | 説明 |
|---|
--circular | 円形レイアウト: バイトオフセットをリング上の角度にマッピングします(デフォルト) |
--linear | 平行バーレイアウト: 交差する四辺形で接続された2本の水平バー |
--top N [N ...] | レンダリング前に最長の N 個のフラグメントのみを保持します。複数の値を渡すと、カットオフごとに1枚の画像をレンダリングします |
--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 | 各 PNG に加えて品質80%の JPEG も書き出します |
--output-dir DIR | 出力ファイルのディレクトリ(デフォルト: output) |