メインコンテンツへ移動
AIチュートリアル

ReverifyでAI支援バイナリ解析を検証する

Reverifyのインストール方法、バイナリの調査、構造上および動作上の主張の検証、チェックの自動化、そしてMCPを通じて決定論的なリバースエンジニアリングツールをAIエージェントに公開する方法を学びます。

ReverifyでAI支援バイナリ解析を検証する

Reverifyの機能

Reverifyは、バイナリ解析中のハルシネーションを減らすために設計された、AI支援型のリバースエンジニアリングツールキットです。言語モデルによる再構成をそのまま信頼するのではなく、Reverifyはそれを仮説として扱い、実際のバイナリと照合します。

ワークフローはシンプルです。モデルが提案し、決定論的なツールが検証します。Reverifyは、バイト列の逆アセンブル、パターンのスキャン、実行可能形式の解析、文字列の抽出、コードのエミュレーション、ワイヤ形式の調査を行えます。検証された主張には、観測された証拠とともに、VERIFIED、REFUTED、INCONCLUSIVEのいずれか3つの結果が付与されます。

Reverifyは、マルウェア解析、CTFチャレンジ、相互運用性の調査、自身が所有または検査許可を得ているソフトウェアなど、許可されたリバースエンジニアリングにのみ使用してください。

主な機能

  • 決定論的な検証: 主張をAIが生成した説明から受け入れるのではなく、対象バイナリで観測されたバイト列に基づいて判定します。
  • 実行可能ファイルの解析: PE、ELF、Mach-Oファイルを調査し、対応している場合はアーキテクチャ、エントリポイント、セクション、インポート、エクスポートを確認できます。
  • 逆アセンブルとエミュレーション: x86、x64、ARM、ARM64のコードを解析できます。利用できる機能は、アクティブなバックエンドによって異なります。
  • パターンと文字列の解析: ??ワイルドカードを使ったAOBパターンのスキャンや、オフセット付きのASCIIまたはUTF-16LE文字列の抽出を行えます。
  • プロトコルの調査: スキーマなしでProtobufおよびTLVデータをデコードできます。
  • リバースエンジニアリング用ユーティリティ: Fridaフックの生成、アライメント済み16進ダンプの作成、バイナリ差分またはパッチの生成を行えます。
  • エージェント連携: Claude CodeやCursorなどのツール向けに、Model Context ProtocolサーバーとしてReverifyを実行できます。
  • Pure-Pythonフォールバック: ベースパッケージは、Ghidraや必須のネイティブ解析エンジンなしで動作します。

インストールとセットアップ

Pure-Pythonコアのインストール

PyPIからCLIとMCPサーバーをインストールします。

pip install reverify

Pure-Pythonコアが提供され、最も簡単に使い始められます。

オプションの成熟したエンジンのインストール

解析、逆アセンブル、エミュレーションを強化するには、fullエクストラをインストールします。

pip install "reverify[full]"

fullインストールでは、逆アセンブルにCapstone、CPUエミュレーションにUnicorn、PE、ELF、Mach-Oの解析にLIEFをReverifyで使用できるようになります。これらのパッケージを利用できない場合、ReverifyはPure-Python実装にフォールバックします。

有効なエンジンを確認します。

reverify backends

チェックアウトから直接実行

リポジトリは、パッケージをインストールせずに使用することもできます。

python reverify/cli.py auto sample.bin --json
python reverify/cli.py parse-pe sample.exe --json
python reverify/cli.py disasm 90505831C0C3 --arch x86_64

バイナリの基本トリアージ

まずautoコマンドを使い、ファイル形式とアーキテクチャを検出し、セクションを調査して、注目すべき文字列を報告します。

reverify auto sample.bin --json

--jsonオプションは、別のスクリプト、CIジョブ、AIエージェントで結果をプログラムから利用する場合に便利です。

PE、ELF、Mach-Oファイルを集中的に解析するには、parseを使用します。

reverify parse sample.bin --json

Windows実行可能ファイルの場合、専用のPEパーサーでPE32またはPE32+ヘッダー、インポート、エクスポートを調査できます。

reverify parse-pe sample.exe --json

生バイト列の逆アセンブル

disasmコマンドでは、16進数のマシンコードをデコードできます。この例では、短いx86-64シーケンスを解析します。

reverify disasm 90505831C0C3 --arch x86_64

逆アセンブルは、提案された命令シーケンスがバイト列と一致するかを確認するのに役立ちます。Reverifyはバイナリのセクションからコードを逆アセンブルすることもできるため、モデルが生成した孤立した解釈ではなく、ファイルの内容に基づいて主張を検証できます。

検証ループの利用

Reverifyの主張は、バイナリに関する構造化された仮説です。verifyコマンドは主張を評価し、ツールキットが観測した証拠とともにステータスを返します。

命令シーケンスの検証

次の主張では、オフセット4096のバイト列が、push、mov、subで始まる関数プロローグとしてデコードされるかを確認します。

reverify verify sample.bin --claim '{
  "kind": "instructions",
  "offset": 4096,
  "mnemonics": ["push", "mov", "sub"],
  "note": "function prologue"
}'

Reverifyは、提案された解釈を単に繰り返すだけではありません。関連するバイト列を読み取って逆アセンブルし、要求されたニーモニックシーケンスが裏付けられるかどうかを報告します。

エミュレーション結果の検証

エミュレーターでマシンコードを実行し、結果のレジスターを確認することで、動作に関する主張を検証することもできます。

reverify verify - --claim '{
  "kind": "emulate_result",
  "code": "b805000000b90300000001c8c3",
  "arch": "x86",
  "expect_registers": {"eax": 8}
}'

これにより、指定されたルーチンがeaxを8にしたまま終了することを検証できます。これは、命令が何を計算しているように見えるかについてのモデルの説明を受け入れるよりも強力な確認です。

利用可能な主張の種類

Reverifyは次の種類の主張に対応しています。

  • bytes_atは指定位置のバイトを確認します。
  • pattern_presentはバイトパターンの有無を確認します。
  • string_presentはバイナリ内の文字列を確認します。
  • instructionsは提案された命令シーケンスを確認します。
  • emulate_resultはエミュレーション後に予想されるレジスタ結果を確認します。
  • protobuf_fieldはProtobufフィールドに関する主張を確認します。
  • pe_importはPEインポートに関する主張を確認します。

一括検証とCIゲート

大規模な調査では、複数の主張をJSONファイルに記述し、まとめて検証できます。

reverify verify sample.bin --claims-file claims.json

いずれかの主張が反証されると、CLIはゼロ以外の終了ステータスを返します。この動作により、CIパイプラインや自動エージェントのワークフローに適しています。再構成された構造やルーチンを、公開または後続ステップで使用する前に却下できます。

実用的なワークフローは次のとおりです。

  1. auto、parse、strings、またはdisasmを使って初期証拠を収集します。
  2. アナリストまたはモデルに、範囲を限定した主張を作成させます。
  3. 関連する主張をJSONファイルに保存します。
  4. verifyを実行し、すべてのREFUTEDまたはINCONCLUSIVEの結果を確認します。
  5. 裏付けのある主張が観測された証拠に基づくものになるまで、再構成を修正して繰り返します。

その他の分析コマンド

Reverifyには、検証プロセスを支援できる、用途を絞ったコマンドがいくつか含まれています。

  • パターンスキャン: pattern-scanを使うと、完全一致バイトと??ワイルドカードを含むAOB検索を実行できます。
  • 文字列抽出: stringsを使うと、ASCIIおよびUTF-16LE文字列を検索し、オフセットを保持できます。
  • マイクロエミュレーション: emulateを使うと、CPUレジスタとスタックの動作を確認できます。
  • ワイヤーフォーマット解析: decode-protobufまたはdecode-tlvを使うと、スキーマのないデータを分析できます。
  • Frida統合: gen-hookを使うと、インターセプタースクリプトを生成できます。
  • 生データの検査: hexdumpを使うと、バイナリデータをアラインメント済みの形式で表示できます。
  • 変更分析: diff-patchを使うと、バイナリ差分の確認とパッチ生成ができます。
  • 境界監査: audit-boundaryを使うと、防御目的のファイルシステム境界およびSSRF境界を確認できます。

再構成による検証ループの完結

reconstructコマンドは、Reverifyの閉ループ方式を実装しています。モデルが主張を提案し、決定論的なツールが判定し、そのプロセスを繰り返して根拠のある結果に近づけます。モデルに完全な構造やアルゴリズムを求め、最初の回答を正しいものとして扱うよりも、この方法が適しています。

信頼できる結果を得るには、主張を小さく検証可能なものにしてください。正確なバイト列、短い命令シーケンス、インポートされた関数、レジスタ結果に関する主張は、バイナリ全体についての広範な説明よりも検証や修正が容易です。

ReverifyとAIエージェントの接続

リポジトリのチェックアウトから、次のコマンドでMCPサーバーを起動します。

python reverify/mcp_server.py

その後、Claude CodeやCursorなどのMCP互換クライアントを設定して、サーバーを起動できます。エージェントはReverifyの解析、逆アセンブル、スキャン、検証ツールを直接呼び出せます。

MCPツールre_verify_claimは、同じ検証ループをエージェントに公開します。これにより、エージェントは仮説を送信し、VERIFIED、REFUTED、またはINCONCLUSIVEを受け取り、結論を報告する前に分析を修正できます。

高度なヒント

  • まず有効なバックエンドを確認する: 分析前にreverify backendsを実行し、Capstone、Unicorn、LIEFが利用可能か確認します。
  • JSON出力を優先する: スクリプト、エージェント、CIシステムで結果を解析する場合は--jsonを使用します。
  • 観測と解釈を分ける: 高レベルの説明を書く前に、オフセット、バイト列、デコード済み命令、レジスタ状態を記録します。
  • 不確定な結果を正直に扱う: INCONCLUSIVEは検証済みという意味ではありません。さらに証拠を集めるか、主張の範囲を狭めてください。
  • 関連するアサーションを一括処理する: 構造チェックと動作チェックをclaimsファイルにまとめ、反証された1つの仮定によって自動再構成を停止できるようにします。
  • 動作に関する主張にはエミュレーションを使う: ルーチンが何を計算するかを主張する場合は、逆アセンブルだけに頼らず、予想されるレジスタ状態を検証します。
  • 移植性には純粋なPythonフォールバックを使う: まず基本パッケージから始め、成熟したネイティブエンジンが必要になったらreverify[full]をインストールします。

まとめ

Reverifyは、重要な主張に対してバイナリとの決定論的な照合を要求することで、AI支援によるリバースエンジニアリングの検証可能性を高めます。CLIは迅速なトリアージ、解析、逆アセンブル、パターンスキャン、エミュレーション、一括検証をサポートし、MCPサーバーはAIエージェントに同じ証拠ベースのワークフローを提供します。その結果、確信に満ちた推測ではなく、観測されたバイト列に基づく分析が可能になります。

ReverifyはMITライセンスで提供され、PyPIから入手できます。