GhidraMCP について
GhidraMCP は、MCP を通じて 70 のリバースエンジニアリング用ツールを AI アシスタントに公開する Ghidra 拡張機能です。逆コンパイル、シンボルの名前変更、注釈付け、脆弱性の検索に対応します。Java プラグインと Go ブリッジで構成され、複数の Ghidra インスタンスを同時に扱えます。
主な機能
- 01リバースエンジニアリング向け MCP ツール 70 種
- 02Ghidra プラグインと Go ブリッジ間の TCP 接続
- 03非同期逆コンパイルと後からの結果取得
- 04API キー認証とローカルホストへの限定バインド
- 05target_port による複数インスタンスへのルーティング
活用シーン
- 01AI アシスタントによるバイナリ関数の逆コンパイルと解説
- 02解析中のシンボル一括リネームとコメント追加
- 03バイナリのセキュリティ緩和策や ROP ガジェットの検出
MCP 対応
MCP サーバーとして、Ghidra の解析・編集機能を MCP ツールとして Claude などの MCP クライアントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
GhidraMCP
Ghidra の拡張機能です。70 種類のリバースエンジニアリングツールを Model Context Protocol (MCP) を通じて AI アシスタントに公開します。Ghidra でバイナリを開いてプラグインを有効にすると、Claude(または任意の MCP クライアント)が関数の逆コンパイル、シンボルの名前変更、コードへの注釈付け、脆弱性の検索などを行えるようになります。
アーキテクチャ
AI Client (Claude Desktop / CLI)
| stdio + MCP JSON-RPC
v
Go MCP Bridge (mcp_bridge)
| TCP, length-prefixed JSON-RPC
v
Ghidra Plugin (MCPServerPlugin)
|
v
Ghidra Program API
Ghidra プラグイン(Java)は Ghidra 内で TCP サーバーを起動し、Go ブリッジバイナリを自動的に起動します。ブリッジは stdio 経由で AI クライアントと MCP 通信を行い、4 バイトの長さプレフィックス付き JSON-RPC フレーミングを使用して、ローカル TCP ソケット経由で Java プラグインに呼び出しを転送します。オプションの API キー認証により TCP チャネルを保護できます。
機能
- 70 種類の MCP ツールを搭載。クエリ、変更、分析、マルウェアのトリアージ、IoT/組み込みセキュリティ、構造体管理、非同期逆コンパイル、複数インスタンス対応を網羅
- 簡単なセットアップ -- プラグインがブリッジを自動起動します。MCP > Settings > Write to Claude Config を使って MCP クライアントを設定できます
- クロスプラットフォーム -- Linux x86_64、Windows x86_64、macOS x86_64、macOS ARM64 向けのビルド済みブリッジバイナリを提供
- 設定可能 -- ポート、localhost のみへのバインド、API キー認証、自動起動、
GhidraMCP.propertiesによるブリッジの有効化/無効化 - 複数インスタンス対応 --
target_portを使ってツールの呼び出し先を指定することで、複数の Ghidra ウィンドウを同時に操作 - 非同期逆コンパイル -- 大きな関数をブロックせずに逆コンパイルし、後から結果を取得できます
- 接続の再試行 -- Ghidra の再起動時や接続が切れた場合、ブリッジが自動的に再接続します
- ページネーション -- 大きな結果セット(関数、文字列、インポートなど)では、
offset/limitを使って安全に段階的に取得できます - CI/CD -- ビルド、Go と Java のテスト、Ghidra 統合テストを自動化し、新しい Ghidra バージョンのリリース時には自動リリースします
クイックスタート
前提条件
- Ghidra 12.0.3+
- Java 21+
- MCP 対応の AI クライアント(Claude Desktop、Claude Code など)
インストール
- リリースから最新のリリース ZIP をダウンロードします
- Ghidra で、File > Install Extensions > "+" > ZIP を選択します
- Ghidra を再起動します
有効化
- プロジェクトとプログラム(バイナリ)を開きます
- File > Configure > GhidraMCP -- MCPServerPlugin にチェックを入れます
- プラグインが TCP サーバー(デフォルトは
localhost:8765)を自動的に起動し、ブリッジを起動します
Claude Desktop を設定するには、MCP > Settings を開き、Write to Claude Config をクリックします。他の MCP クライアントの場合は、Copy to Clipboard をクリックし、以下をクライアントの設定に追加します。
{
"mcpServers": {
"ghidra": {
"command": "/path/to/mcp_bridge",
"args": ["--host", "localhost", "--port", "8765"]
}
}
}
API キーを設定している場合は、env ブロックに追加します(プラグインが自動的に追加します)。
{
"mcpServers": {
"ghidra": {
"command": "/path/to/mcp_bridge",
"args": ["--host", "localhost", "--port", "8765"],
"env": {
"GHIDRA_API_KEY": "your-key-here"
}
}
}
}
Ghidra から設定スニペットを取得することもできます。MCP > Copy MCP Config を選択すると、クリップボードにコピーされます。
ツール
パラメーター、型、使用例を含む完全なリファレンス: TOOLS.md
以下の表は概要を示しています。パラメーターの詳細については、TOOLS.md を参照してください。
クエリ(1-21)
| ツール | 説明 |
|---|---|
list_functions | エントリーポイント、サイズ、戻り値の型とともに、すべての関数を一覧表示します |
list_classes | すべてのクラス/名前空間を一覧表示します |
list_imports | インポートされたシンボルと外部依存関係を一覧表示します |
list_exports | エクスポートされたシンボルを一覧表示します |
list_namespaces | すべての名前空間を一覧表示します |
list_data_items | 定義済みデータ(グローバル変数、定数、配列、構造体)を一覧表示します |
list_strings | 任意の部分文字列で絞り込んで、文字列を一覧表示します |
search_functions_by_name | 名前の部分文字列で関数を検索します |
get_function_by_address | 指定したアドレスの関数の詳細情報を取得します |
get_current_address | Ghidra で現在選択されているアドレスを取得します |
get_current_function | 現在のカーソル位置にある関数を取得します |
decompile_function | 名前を指定して C 擬似コードに逆コンパイルします |
decompile_function_by_address | アドレスを指定して C 擬似コードに逆コンパイルします |
disassemble_function | 関数の未加工の逆アセンブル一覧を取得します |
get_xrefs_to | 指定したアドレスへのクロスリファレンスを取得します |
get_xrefs_from | 指定したアドレスからのクロスリファレンスを取得します |
get_function_xrefs | 関数のすべてのクロスリファレンス(呼び出し元と呼び出し先)を取得します |
get_program_info | プログラムのメタデータ(アーキテクチャ、コンパイラー、形式など)を取得します |
get_memory_map | セグメントのアクセス許可を含むメモリレイアウトを取得します |
get_variables | 関数のパラメーターとローカル変数を取得します |
変更(22-38)
| ツール | 説明 |
|---|---|
rename_function | 名前を指定して関数の名前を変更します |
rename_function_by_address | アドレスを指定して関数の名前を変更します |
rename_data | データラベルの名前を変更します |
rename_variable | ローカル変数の名前を変更します |
set_decompiler_comment | デコンパイラービューのコメントを設定します |
set_disassembly_comment | 逆アセンブルビューのコメントを設定します |
set_function_prototype | 関数のプロトタイプ全体を設定します |
set_local_variable_type | 変数のデータ型を変更します |
set_bookmark | ブックマークを追加します |
remove_bookmark | ブックマークを削除します |
set_equate | スカラーオペランドに名前付き定数を設定します |
create_structure | 構造体のデータ型を作成します |
create_enum | 列挙型のデータ型を作成します |
apply_data_type | アドレスにデータ型を適用します |
set_namespace | 関数の名前空間またはクラスを設定します |
set_calling_convention | 関数の呼び出し規約を設定します |
set_image_base | イメージベースアドレスを設定します |
set_memory_permissions | メモリブロックのアクセス許可を変更します |
高度な解析(39-45)
| ツール | 説明 |
|---|---|
patch_bytes | アドレスの未加工バイトをパッチします |
get_basic_blocks | 関数の基本ブロックを取得します |
extract_api_call_sequences | セキュリティ解析用に API 呼び出しシーケンスを抽出します |
identify_user_input_sources | ユーザー入力のエントリーポイントを特定します |
generate_call_graph | 階層的な呼び出しグラフを生成します |
identify_crypto_patterns | 暗号処理の実装を検出します |
find_obfuscated_strings | 難読化された文字列を特定します |
マルウェア解析(46-53)
| ツール | 説明 |
|---|---|
search_bytes | バイトパターンを検索します |
emulate_function | 関数をエミュレートします |
extract_iocs | 侵害の痕跡(IOC)を抽出します |
find_dynamic_api_resolution | 動的 API 解決を検出します |
detect_anti_analysis | 解析妨害技術を検出します |
add_external_function | 外部関数参照を追加します |
get_pe_info | PE ヘッダーの詳細情報を取得します |
get_elf_info | ELF ヘッダーの詳細情報を取得します |
IoT/組み込みセキュリティ(54-59)
| ツール | 説明 |
|---|---|
create_memory_block | メモリブロックを作成します |
detect_security_mitigations | バイナリのセキュリティ緩和策を検出します |
find_format_string_vulns | フォーマット文字列の脆弱性を特定します |
find_rop_gadgets | ROP ガジェットを特定します |
detect_control_flow_flattening | 制御フローの平坦化を検出します |
mark_code_coverage | コードカバレッジ領域をマークします |
ユーティリティ(60-62)
| ツール | 説明 |
|---|---|
get_bookmarks | ブックマークを一覧表示します(アドレスで絞り込むこともできます) |
list_equates | すべての等価定義を一覧表示します |
ping | 接続のヘルスチェックを行います |
複数インスタンス(63)
| ツール | 説明 |
|---|---|
list_ghidra_instances | 実行中の Ghidra インスタンスをポート 8765-8774 でスキャンします |
すべてのツールは、呼び出しを特定の Ghidra インスタンスにルーティングするための省略可能な target_port パラメーターを受け付けます。これにより、別々の Ghidra ウィンドウで複数のバイナリを同時に開いて作業できます。
構造体の管理(64-68)
| ツール | 説明 |
|---|---|
get_structure | 構造体の詳細(フィールド、オフセット、型)をすべて取得します |
list_structures | 定義済みの構造体をすべてページネーション付きで一覧表示します |
edit_structure | 構造体のフィールドを追加、挿入、削除、置換、またはクリアします |
rename_structure | 既存の構造体の名前を変更します |
delete_structure | 構造体のデータ型を削除します |
非同期デコンパイル(69-70)
| ツール | 説明 |
|---|---|
decompile_function_async | 大きな関数の非同期デコンパイルを開始します(タスク ID を返します) |
get_decompile_result | タスク ID を指定して、非同期デコンパイルの結果をポーリングします |
非同期デコンパイルは、デコンパイルに 30 秒以上かかる可能性のある大きな関数で便利です。クライアントはデコンパイルを開始した後、ほかの作業を続け、後で結果をポーリングできます。
設定
プラグインは、Ghidra のユーザー設定ディレクトリにある GhidraMCP.properties に設定を保存します。
| プロパティ | デフォルト | 説明 |
|---|---|---|
port | 8765 | Java サーバーの TCP ポート |
localhost_only | true | localhost のみでバインドします |
api_key | (空) | ブリッジ認証用の共有シークレット |
auto_start | true | プラグインの読み込み時にサーバーを起動します |
bridge_enabled | true | Go ブリッジバイナリを自動起動します |
設定ダイアログ
Ghidra メニューから MCP > Settings を開くと、GUI で各プロパティを設定できます。ダイアログには次の項目があります。
- ポート、localhost バインド、API キー、自動起動、ブリッジの有効化を編集できるフィールド
- 暗号学的に安全なランダムな 32 文字の API キーを生成する Generate ボタン
- GhidraMCP を Claude Desktop の
claude_desktop_config.jsonにマージする Write to Claude Config ボタン - 手動設定用の MCP 設定 JSON スニペットをコピーする Copy to Clipboard ボタン
- API キーを設定せずにリモートアクセスを有効にした場合のセキュリティ警告
- 保存時にサーバーが実行中の場合に表示される自動再起動の確認
OK をクリックすると、変更がディスクに保存されます。ダイアログに表示されているパスにあるプロパティファイルを直接編集することもできます。
auto_start が false の場合は、Ghidra メニューから MCP > Toggle Server を選択して、サーバーを手動で起動してください。
Note:
bridge_enabled設定は、高度な用途向けです。ブリッジバイナリをデバッグする開発者や、Java サーバーと TCP で直接通信するカスタム MCP クライアントを使用するユーザー向けです。ほとんどのユーザーは有効のままにしてください。
セキュリティ
デフォルトでは、TCP サーバーは localhost のみでバインドされ、API キーは設定されていません。ローカルで単一ユーザーが使用する場合はこれで問題ありません。より厳格な設定にする場合は、次の手順に従ってください。
API キー認証
- MCP > Settings を開き、Generate をクリックしてランダムなキーを生成します(または独自のキーを入力します)
- OK をクリックして保存します。次回の起動時にブリッジがキーを自動的に取得します
- 接続時、ブリッジはほかの呼び出しを行う前に、キーを含む
authenticateリクエストを送信します - 認証が成功するまで、サーバーは認証以外のすべてのリクエストを拒否します
- 3 回失敗すると、サーバーは接続を終了します
API キーは、プロセスの引数リストから漏えいするのを防ぐため、CLI フラグではなく GHIDRA_API_KEY 環境変数を介してブリッジに渡されます。ブリッジを手動で実行する場合は、環境変数を設定してください。
# Linux/macOS
export GHIDRA_API_KEY="your-key-here"
./mcp_bridge --host localhost --port 8765
# Windows (PowerShell)
$env:GHIDRA_API_KEY = "your-key-here"
.\mcp_bridge.exe --host localhost --port 8765
API キーが設定されている場合、設定ダイアログの Write to Claude Config ボタンと Copy to Clipboard ボタンは、キーを env ブロックに自動的に含めます。
ローカルホストへのバインド
localhost_only=true(デフォルト)の場合、サーバーは 127.0.0.1 からの接続のみを受け付けます。リモートアクセスが必要な場合(例:ヘッドレスサーバー上の Ghidra)は false に設定します。ただし、ポートをローカルホスト以外に公開する場合は、必ず API キーを使用してください。
リモート/ヘッドレス環境のセットアップ
GhidraMCP は、別のマシンで実行されている AI クライアントにサービスを提供できます。これは、Ghidra をヘッドレス分析サーバーで実行し、AI クライアントを別の場所で実行する場合に便利です。
- MCP > Settings を開きます
- リモート接続を受け付けるには、Localhost Only のチェックを外します
- API キーを作成するには、Generate をクリックします(リモートアクセスでは必ず使用してください)
- OK をクリックし、サーバーを再起動します
リモートマシンで、Ghidra ホストを指定するように MCP クライアントを設定します。
{
"mcpServers": {
"ghidra": {
"command": "/path/to/mcp_bridge",
"args": ["--host", "ghidra-server.local", "--port", "8765"],
"env": {
"GHIDRA_API_KEY": "your-key-here"
}
}
}
}
Warning: サーバーをローカルホスト以外に公開する場合は、必ず API キーを使用してください。認証がない場合、ポートに接続できる人は誰でも Ghidra API に完全にアクセスできます。
ソースからのビルド
git clone https://github.com/13bm/GhidraMCP.git
cd GhidraMCP
Go ブリッジのビルド
cd mcp-bridge
go build -o mcp_bridge .
cd ..
Ghidra 拡張機能のビルド
export GHIDRA_INSTALL_DIR=/path/to/ghidra
gradle buildExtension
拡張機能の ZIP は dist/ に作成されます。
テストの実行
# Go tests
cd mcp-bridge && go test ./... -v && cd ..
# Java unit + integration tests (requires Xvfb on headless Linux)
xvfb-run gradle test -PGHIDRA_INSTALL_DIR=$GHIDRA_INSTALL_DIR
CI/CD
このプロジェクトでは、自動ビルドとリリースに GitHub Actions を使用しています。
build.yml--masterへのプッシュ/PR、およびタグ作成時に実行されます。Go テストを実行し、4 つのプラットフォーム向けにブリッジをクロスコンパイルし、Xvfb 上で Java のユニットテストと Ghidra の統合テストを実行し、拡張機能の ZIP をビルドします。また、v*タグで GitHub Releases を作成します。check-ghidra-release.yml-- 毎日実行されます。Ghidra の新しいリリースを検出し、バージョン更新の PR を作成して、GitHub App 経由で自動承認し、すべてのテストが成功した場合に自動マージします。
コントリビューション
コントリビューションを歓迎します。イシューを作成するか、プルリクエストを送信してください。
- リポジトリをフォークします
- 機能ブランチを作成します:
git checkout -b feature/my-feature - 変更をコミットします
- プッシュしてプルリクエストを作成します
ライセンス
謝辞
- NSA / Ghidra
- Model Context Protocol
- mcp-go -- Go MCP SDK
GhidraMCP は NSA または Ghidra プロジェクトとは関係がなく、いずれからも承認されていません。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。