Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ai-reverse-engineering — Ghidraを使用したAI支援リバースエンジニアリング | Kitploit
ツール/GitHubGitHub/biniamf/ai-reverse-engineering
静的分析リバースエンジニアリングデバッガバイナリ解析AI支援リバースエンジニアリングAIセキュリティ
GitHubbiniamf/ai-reverse-engineering

ai-reverse-engineering

Ghidraを使用したAI支援リバースエンジニアリング

リポジトリを見る
1581626日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Rev·Deck — Ghidra を用いた AI 支援リバースエンジニアリング

Rev·Deck は、ローカルで動作するシングルユーザー向け静的解析ワークステーションです。エビデンスを最優先する Web UI と、ヘッドレス Ghidra サービスで解析されたバイナリを対象とする LLM コパイロットを組み合わせています。関数、文字列、インポート、クロスリファレンス、限定されたコールグラフといった確定的なエビデンスを直接参照したり、事実主張には検査可能なエビデンスの引用を必須とする、範囲を限定した質問をアシスタントに行うことができます。

解析対象のバイナリが実行されることはありません。ブラウザはこの Flask アプリとのみ通信し、アプリは検証・型付けされたリクエストを Ghidra サービスにプロキシします。

デモ

https://github.com/user-attachments/assets/fba14dc5-7ad5-4137-9349-ed824da64fbe

クイックスタート(Docker)

root@kitploit:~
cp .env.example .env      # API_BASE と MODEL_NAME を設定。必要な場合は API_KEY も設定
docker compose up --build

Docker Compose は補間のために .env を自動的に読み込みます。API_BASE または MODEL_NAME が欠けていると、起動前に失敗します。API_KEY=not-used はローカル/キーレスプロバイダーでは有効です。スタックは両方のサービスを起動します。http://127.0.0.1:5000 を開いてください。

Ghidra サービスのみを実行する場合:

root@kitploit:~
docker pull biniamfd/ghidra-headless-rest:latest   # 最新イメージを確実に取得

docker run --rm \
  -p 127.0.0.1:9090:9090 \
  -v "$(pwd)/data:/data/ghidra_projects" \
  --security-opt no-new-privileges:true \
  biniamfd/ghidra-headless-rest:latest

再現性のあるピンを利用するには、latest の代わりにテスト済みリリースのダイジェストを使用してください:

root@kitploit:~
docker run --rm \
  -p 127.0.0.1:9090:9090 \
  -v "$(pwd)/data:/data/ghidra_projects" \
  --security-opt no-new-privileges:true \
  biniamfd/ghidra-headless-rest:1.2.1@sha256:971591a3a8448d8ed969079b452306e806f36079c3ddd298f4a618d6e2f1442d

前提条件

  • Docker および Docker Compose(クイックスタートの場合)、または Python 3.10+ と Node.js 18+(ソースから実行する場合)
  • OpenAI 互換の LLM エンドポイント(ローカルまたはホスト)とモデル名
  • 公開 Ghidra イメージ: biniamfd/ghidra-headless-rest:latest

必須環境変数

.env.example を .env にコピーし、必要事項を入力してください。完全なリストとデフォルト値は同ファイルを参照してください。

LLM プロバイダー

Rev·Deck は OpenAI SDK を通じて OpenAI 互換の Chat Completions エンドポイント と通信します。設定はすべて API_BASE / API_KEY / MODEL_NAME で行います。プロバイダー固有のヘッダー、パラメーター、モデルロジックはありません。ローカルの Ollama サーバー(API_BASE=http://127.0.0.1:11434/v1)、セルフホストの vLLM/llama.cpp/LM Studio エンドポイント、OpenAI 自身、または OpenRouter などのゲートウェイもすべて同様に動作します。

.env プロバイダー設定の例(プレースホルダーを使用し、実際のキーをコミットしないでください):

root@kitploit:~
# Ollama
API_BASE=http://127.0.0.1:11434/v1
API_KEY=not-used
MODEL_NAME=qwen3:8b
root@kitploit:~
# OpenRouter
API_BASE=https://openrouter.ai/api/v1
API_KEY=replace-with-your-key
MODEL_NAME=anthropic/claude-opus-4.8
root@kitploit:~
# OpenAI
API_BASE=https://api.openai.com/v1
API_KEY=replace-with-your-key
MODEL_NAME=replace-with-a-supported-model-id
root@kitploit:~
# LM Studio、vLLM、または llama.cpp(ポート/モデルはサーバーに合わせて調整)
API_BASE=http://127.0.0.1:1234/v1
API_KEY=not-used
MODEL_NAME=replace-with-the-served-model-id

デフォルト(LLM_STREAM=auto)では、アシスタントはストリーム応答を要求し、トークンが到着するたびにブラウザに中継します。ストリーミングはキャンセル保証も強化します: 応答を停止したりタブを閉じたりすると、Rev·Deck はプロバイダーのストリームを直ちに閉じ、それ以上のツールやモデルのラウンドを実行しないため、バックグラウンドで完了まで実行されることなく、上流の生成が強制的に終了されます。

注意点:

  • 課金。キャンセルは当社側のストリームを即座に閉じますが、一部のホスト型プロバイダーは、早期のクライアント切断にかかわらず、すでに生成したトークン(または完了全体)に対して課金する場合があります。保証はそれ以上の作業を行わないことについてであり、プロバイダーの課金ポリシーについてではありません。
  • 互換性。すべての OpenAI 互換エンドポイントがツールを使用したストリーミングを受け入れるわけではありません。auto では、プロバイダーがコンテンツやツールコール出力の前にストリームリクエストを互換性エラー(HTTP 400/404/405/422)で拒否した場合、Rev·Deck は一度だけブロッキング呼び出しにフォールバックし、以降のプロセスでそれを記憶します。認証エラー(401/403)、レート制限(429)、サーバーエラー(5xx)は互換性の問題として扱われず、エラーとして表示され、サイレントに再試行されることはありません。ストリーミングを完全にスキップするには LLM_STREAM=false を、ストリーミングを必須にするには LLM_STREAM=true を設定してください(フォールバックなし)。

使い方

アプリを開き、バイナリをアップロードして解析ジョブを開始します。明らかにプレーンテキストのコンテンツは、Ghidra に送信する前に確認を求めます。実行可能形式ではなく意図的にファームウェア/データである場合にのみ、明示的な raw バイナリ上書きオプションを使用してください。解析が完了したら、2 つのワークスペースタブを切り替えます:

  • Analysis — 確定的なエビデンスビュー: サマリー、関数(フィルター/ページネーション)、インポート、文字列、クエリビュー、関数インスペクター(疑似コード、クロスリファレンス、限定コールグラフ、16 進ダンプ)、そして接続された Ghidra サービスがサポートする場合には、型、グローバル、サイドカーアノテーション、アーカイブエクスポート、説明可能な肯定/緩和シグナルとエビデンスカバレッジを備えた確定的な Attack Surface ランキング。
  • Chat — アシスタント。2 つのモードがあります:
    • Copilot(デフォルト): メッセージごとに 1 ステップ/ツールコールに制限。アドホックな質問向け。
    • Autonomous: 名前付きの予算制限付きワークフローを開始し、自律的に複数の制限されたステップを実行。作業中はライブアクティビティタイムラインを表示。

どちらのモードもタスクごとにステップ予算を設定でき、ステップ制限なしオプションではタスクが完了するまで実行されます(それでも MAX_STEP_BUDGET で上限が設定されるため、ループするモデルが暴走することはありません)。実行が予算に達すると、部分的な結果を報告し、「Continue」を提供します。これは、完了したツールコールをやり直すことなく、すでに取得したエビデンスを使用して同じ会話を再開します。コストはツール/モデル呼び出しの回数に応じて増加するため、予算が高いほどコストが高くなります。

利用可能なワークフロー:

フォーカスされたサブ調査

各解析ジョブには、Main チャットに加えて、オプションのフォーカスされたサブスレッドがあります。New sub-investigation を選択し、1 行のブリーフィングを入力すると、同じバイナリと同一の読み取り専用ツールに対して、新しい会話コンテキストで作業できます。スレッド履歴は分離され、同時にストリーミングされるのは 1 つのスレッドのみです。

フォーカスされた作業が完了したら、Return conclusion to parent を選択します。Rev·Deck はそのサブスレッドのみに対して 1 回の制限付きモデル呼び出しを行い、そのエビデンス引用を検証し、証明マーク付きの結論カードを親に追加します。ブランチ全体は再開可能なままですが、親コンテキストにはコンパクトな結論のみが受け取られます(ブランチのトランスクリプトは受け取りません)。検証済み引用がないまま戻されたカードは、明示的に未検証とマークされます。

アシスタントの回答は、[function:0xADDR]、[string:0xADDR]、[import:name] のようにエビデンスをインラインで引用します。引用はそのターン中に実際に取得されたものと照合され、一致しない引用は「(未検証)」とフラグが立てられ、未確認の主張として扱う必要があります(事実ではありません)。

アシスタント出力内の Mermaid 図(コールグラフのスケッチなど)は、外部ネットワークアクセスのないサンドボックスフレームでレンダリングされます。

アーキテクチャ

ブラウザは Rev·Deck Web アプリケーションとのみ通信します。Rev·Deck は設定された LLM とヘッドレス Ghidra サービスを調整し、結果のエビデンスとエージェントアクティビティを 1 つのワークスペースに表示します。

Rev·Deck アーキテクチャ

ソースからの実行

root@kitploit:~
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
npm ci && npm run vendor        # 1 回のみ: 固定された Mermaid ランタイムをベンダリング

cp .env.example .env            # API_BASE / MODEL_NAME / API_KEY を編集
set -a; source .env; set +a     # 通常の Python は .env を自動的に読み込まない

# 別の Ghidra サービスを起動し、次に:
python webui/app.py

http://127.0.0.1:5000 を開いてください。Docker Compose は .env を自動的に読み込みますが、ソース実行の場合は上記のようにエクスポートする必要があります。Flask 開発サーバーはローカル使用には十分です。Docker イメージは Gunicorn を実行します。

セキュリティ / ローカルオンリーの境界

これは、自分のマシン上で作業する信頼できる 1 人のアナリスト向けに設計されています。マルチユーザーや公開ホスティング向けではありません。デフォルトでは、アプリと Ghidra サービスは 127.0.0.1 のみにバインドされ、デバッグモードはオフ、アップロードされたバイナリは決して実行されず、LLM プロバイダーのキーはサーバーサイドに留まります。

テスト

root@kitploit:~
pip install -r requirements.txt -r requirements-dev.txt
python -m pytest
node --test "webui/static/js/tests/**/*.test.mjs"
npm ci && npm run vendor:verify   # ベンダリングされた Mermaid バンドルの整合性を検証

トラブルシューティング

  • "Service offline" / /readyz が 503 を返す — Ghidra サービスが GHIDRA_API_BASE で到達不能、または API_BASE/MODEL_NAME が未設定です。
  • Types/Globals/Annotations に "requires v1" と表示される — 接続された Ghidra サービスがその機能を宣言していません。古いサービスでは想定内です。
  • チャットが即座にエラーになる — API_BASE/API_KEY/MODEL_NAME を確認し、プロバイダーが LLM_TIMEOUT 内に到達可能であることを確認してください。
  • アップロードが大きすぎると拒否される — MAX_UPLOAD_BYTES を増やしてください。
  • アップロードがプレーンテキストに見える — Rev·Deck は Ghidra に送信する前に確認を求めます。意図的な場合のみ raw バイナリとして続行してください。
  • 大規模解析がタイムアウトする — Ghidra コンテナの ANALYSIS_TIMEOUT を増やし(例: 1 万以上の関数を含む C++/Android バイナリの場合は 5400)、再アップロードしてください。LLM_TIMEOUT は関係ありません。
ツールをダウンロード
変数デフォルト意味
API_BASE必須OpenAI 互換のベース URL(http/https)。Compose は値がないと早期に失敗します。
API_KEYnot-usedプロバイダーのキー。ログに記録されたりブラウザに送信されることはありません。not-used はキーレスのローカルプロバイダーで有効です。
MODEL_NAME必須設定されたエンドポイントが期待するモデル ID。Compose は値がないと早期に失敗します。
LLM_STREAMautoストリーミング転送: auto(ストリーム、出力前の互換性エラーが一度発生した場合はブロッキングにフォールバック)、true(常にストリーム)、false(常にブロッキング)。
GHIDRA_API_BASEhttp://127.0.0.1:9090Ghidra サービスのベース URL。
GHIDRA_IMAGEbiniamfd/ghidra-headless-rest:1.2.1@sha256:971591a3...不変ダイジェストでピン留めされたテスト済みリリース。:latest もこのダイジェストに解決されます。別のリリースをピン留めするには上書きします。
HOST / PORT127.0.0.1 / 5000開発サーバーのバインド。
MAX_UPLOAD_BYTES104857600アップロードサイズの上限。
CHATS_DIRwebui/chatsチャット履歴のディレクトリ。
ワークフロー目的ターゲット関数アドレスが必要
program_triageメタデータ、インポート、文字列、関数からプログラムの推定目的を要約する。いいえ
suspicious_behavior最初に確定的な指標を表示し、その後、範囲を限定し明確にラベル付けされた仮説を提示する。いいえ
selected_function関数を逆コンパイルし、その呼び出し元/呼び出し先とともに説明する。はい
call_chain開始関数から、限定されたネイティブ/合成コールグラフの近傍を探索する。はい
attack_surface_triage確定的スコアのカバレッジ/Top-K を読み取り、その後最大 3 つの候補を深く調査する。スコアは優先度であり、判定ではない。いいえ
vulnerability_hypothesis1 つの限定された候補を選択し、エビデンス、反証、未解決の質問を提示する。決して自動確認はしない。いいえ
  • 引用に "(未検証)" と表示される — モデルが実際には取得していないエビデンスを引用しました。その主張は未確認の仮説として扱ってください。