ghidralens について
GhidraLensは、バイナリ解析やリバースエンジニアリング向けに、AIクライアント内でGhidraを操作できるMCPサーバーです。逆コンパイルや検索に加え、シンボルの改名や関数・コールグラフの移動に使えるクリック可能なビューを備えています。
主な機能
- 01インタラクティブな逆コンパイラービュー
- 02バイナリ関数の一覧表示と並べ替え
- 03コールグラフで呼び出し関係を表示
- 04文字列とクロスリファレンスの検索
- 05シンボルの改名とコメント追加
- 06編集内容のGhidraプロジェクトへの保存
活用シーン
- 01バイナリの逆コンパイル済み関数の確認
- 02関数間の関係の調査
- 03コード確認中の識別子の改名
- 04ローカルOllamaモデルを使ったバイナリ解析
MCP 対応
Ghidraの解析・編集ツールをMCPクライアントに提供し、MCP Appsを通じてインタラクティブなHTMLビューを表示します。ビュー上のクリックでツールを呼び出せますが、一部の書き込み操作はモデルに公開されません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y ghidralensGHIDRALENS_TOKENシークレットShared secret printed by the PyGhidra bridge on startup. Start the bridge first: python bridge/serve.py --binary <path>GHIDRALENS_BRIDGE_URLWhere the PyGhidra bridge is listening. Defaults to http://127.0.0.1:8799ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
10掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| path | string | はい | 実行可能ファイルの絶対パス |
| analyze | boolean | いいえ | 自動分析を実行します。すでに分析済みの場合のみ false に設定してください。 |
詳細
GhidraLens
AI クライアント内に Ghidra を表示します。シンボルをクリックして名前を変更し、呼び出しをクリックして追跡できます。

これまでの Ghidra MCP サーバーは、いずれもテキストを返していました。モデルはそれを読めますが、ユーザーはその中を移動できません。GhidraLens は同じ解析結果をインタラクティブビューとして返します。これは MCP Apps(io.modelcontextprotocol/ui)を基盤としており、サーバーが会話内に実際の HTML を表示できるようにする拡張機能です。
あなたとモデルは、同じライブプログラムを見ています。変数をクリックして名前を変更すると、モデルが次に逆コンパイルするときには新しい名前が表示されます。
これは実際のスクリーンショットです。Ghidra で逆コンパイルした where.exe の各識別子には、元のアドレスが付いています。
利用できる機能
| ビュー | 機能 |
|---|---|
| 逆コンパイラー | Ghidra の C 出力をライブトークンストリームとして表示します。各識別子にはアドレスと種類が付いています。ローカル変数をクリックして名前を変更し、呼び出しをクリックして追跡できます。サイドバーには呼び出し元、呼び出し先、変数が表示されます。 |
| 関数ブラウザー | バイナリ内のすべての関数を、アドレス、名前、サイズ、呼び出し元の数で絞り込み、並べ替えられます。行をクリックすると逆コンパイルできます。 |
| 呼び出しグラフ | 左に呼び出し元、右に呼び出し先、その中央に指定した関数を表示します。ノードをクリックすると、そのノードを中心に表示し直します。 |
関数ブラウザー

呼び出しグラフ

ツールは全部で 10 個です。ビューを開くものが 3 個、残りは検索と書き込みのツールです。そのうち 2 個はモデルには表示されず、ビュー内のクリックを実行するためだけに使われます。
仕組み
MCP client ──stdio──▶ server/ ──HTTP──▶ bridge/ ──JPype──▶ Ghidra (JVM)
(Claude, TypeScript PyGhidra program stays
Cursor, …) MCP server session resident
▲
│ ui:// HTML in a sandboxed iframe
└── ui/ three self-contained views
ブリッジは、意図的に独立した長時間稼働プロセスとして動作します。負荷の高い Ghidra の自動解析は、一度だけ実行されます。64 KB の Windows システムユーティリティ(198 個の関数)での測定結果は次のとおりです。
| 初回オープン時の解析 | 25 秒 |
| 同じバイナリを再度開く | 0.3 秒 |
| 2 KB の関数を 1 つ逆コンパイル | 0.4 秒 |
| 87 ノードの呼び出しグラフ | < 0.1 秒 |
MCP サーバーやクライアントを再起動しても、解析済みのプログラムはそのまま残ります。
セットアップ
前提条件: Ghidra 11.3 以降、JDK 21 以降、Python 3.9~3.13(3.14 は不可。JPype はまだ対応する wheel がありません)、Node 20 以降。bridge/setup.py.md を参照してください。Python 側は少し扱いが難しく、このファイルでは起こりうる問題をすべて取り上げています。JAVA_HOME が設定されていない場合、GhidraLens が JDK を探します。これは「Java をインストールしたが、シェルを再起動していない」というよくあるケースにも対応しています。
git clone https://github.com/hellosverre/ghidralens
cd ghidralens
npm install
npm run build
次に、調べたいバイナリを指定してブリッジを起動します。
python bridge/serve.py --binary /path/to/target.exe
トークンが表示されます。そのトークンと、ビルドしたサーバーへのパスを、MCP クライアントの設定に追加してください。
{
"mcpServers": {
"ghidralens": {
"command": "npx",
"args": ["-y", "ghidralens"],
"env": {
"GHIDRALENS_BRIDGE_URL": "http://127.0.0.1:8799",
"GHIDRALENS_TOKEN": "paste-the-printed-token-here"
}
}
}
}
クローンから実行する場合は、command に node を、args に /absolute/path/to/ghidralens/server/dist/index.js を指定してください。
次に、クライアントに 「ライセンス検証を処理する関数を逆コンパイルして」 と尋ねてみてください。
公式 MCP Registry にも io.github.hellosverre/ghidralens として掲載されています。
設定を手動で編集しますか? まずクライアントを完全に終了してください。システムトレイのアイコンも含めて終了する必要があります。Claude Desktop は
claude_desktop_config.jsonのコピーをメモリに保持し、終了時にその内容でファイルを上書きします。そのため、実行中に編集すると、次回の再起動時に変更がひっそりと消えてしまいます。設定 → 開発者 → 設定を編集から編集すれば、この競合を完全に回避できます。
ツール
| ツール | 表示先 | レンダリング |
|---|---|---|
open_binary | モデル | — |
program_info | モデル | — |
decompile | モデル + ビュー | デコンパイラー |
list_functions | モデル + ビュー | 関数ブラウザー |
call_graph | モデル + ビュー | 呼び出しグラフ |
find_strings | モデル | — |
xrefs_to | モデル + ビュー | — |
rename_symbol | モデル + ビュー | — |
add_comment | ビューのみ | — |
save_program | モデル | — |
add_comment は意図的にモデルから隠されています。MCP Apps では、表示設定によって「エージェントが実行できること」と「クリック操作で実行できること」を分けています。書き込みツールをモデルの一覧から外すことで、一覧を短く保ち、モデルが勝手に名前を変更するのを防ぎます。
名前の変更やコメントは、save_program で Ghidra プロジェクトに書き込むまでメモリ上に保持されます。書き込み後は、ほかの編集と同様に Ghidra GUI に反映されます。
Ghidra を使わずにビューを開発する
npm run dev:ui
# open http://localhost:5173/dev/harness.html
ui/dev/harness.ts は実際の MCP Apps ホストです。SDK の AppBridge を iframe 内のビューに対して実行するため、ui/initialize ハンドシェイク、最初の ui/notifications/tool-result、クリックによって発生するすべての tools/call は、実際の postMessage JSON-RPC を介してやり取りされます。右側にはメッセージトレースが表示され、ホストテーマも切り替えられます。どちらのテーマでもビューが適切に表示される必要があるためです。
ツールバーで切り替えられるデータソースが 2 つあります。
- fixtures — Ghidra は不要で、インストールも必要ありません
- live bridge — 実行中のブリッジへのプロキシとして動作するため、実際に解析されたプログラムを使って開発できます
信頼する前に、ライブデータを使ってください。fixtures は整然としていますが、実際の出力は 56 個のローカル変数を含む 400 行の関数や、87 ノードの呼び出しグラフになることがあり、レイアウトが本当に崩れるのはそうしたケースです。
ローカルモデルで実行する
リバースエンジニアリングは、ホスト型モデルに送信したくない作業の代表例です。そのため、agent/ollama-agent.mjs は GhidraLens を代わりに Ollama 経由で利用する小規模な MCP ホストです。API キーは不要で、データがマシンの外に出ることもありません。
OLLAMA_MODEL=qwen3:14b node agent/ollama-agent.mjs "what does this binary do?"
_meta.ui.visibility に従うため、アプリ専用ツールはモデルから隠されます。これはグラフィカルクライアントが適用するのと同じ分離です。約 9B のモデルでも find_strings と list_functions を使って状況を把握できます。14B モデルなら、逆コンパイルされた C の読み取りが明らかに得意です。
テスト
| テストスイート | Ghidra が必要 | 対象 |
|---|---|---|
node server/smoke.mjs | いいえ | MCP のインターフェース:ツール、ui:// リソース、ツールの可視性、ブリッジがない場合の正常なエラー処理 |
python bridge/test_serve.py | いいえ | ブリッジ認証、CSRF 拒否、ルーティング、入力の検証 |
python bridge/test_session.py | はい | Ghidra のすべての呼び出し:解析、キャッシュ、デコンパイラートークン、インポート、名前変更、書き込み |
node server/live.mjs | はい(ブリッジの実行中) | 処理全体のチェーンと、すべてのペイロードがビューのインデックス参照に合致すること |
最初の 2 つは CI で実行できます。test_session.py は
bridge/session.py に変更を加えたあとに重要なテストです。Ghidra の
API 呼び出しが正しいことを証明できる唯一のテストであり、作成した日に
実際のバグを 3 つ見つけました。
コンテナー化
Dockerfile は、クライアントやレジストリが自ら起動できるように、サーバーとビューを
ビルドします。正しく設定すべき点が 1 つあります。
CMD ["node", "server/dist/index.js"] # correct
CMD ["npm", "run", "start"] # breaks the protocol
stdio MCP サーバーは stdout で JSON-RPC をやり取りしますが、npm run や pnpm run は
最初にスクリプトのバナーをそこへ出力します。
> [email protected] start
> node server/dist/index.js
この行がハンドシェイクより前にストリームへ出力されるため、初期化の途中で クライアントが処理を諦めます。コンテナーはビルドされ、起動して正常に終了するのに、 クライアントにはツールがないと報告されるだけなので、気をつける必要があります。 node を直接呼び出してください。
実際の解析には、引き続きホスト上でブリッジを起動する必要があります。コンテナー内の
127.0.0.1 はコンテナー自体を指すため、GHIDRALENS_BRIDGE_URL を
host.docker.internal または実際のアドレスに設定してください。
セキュリティ
ブリッジは 127.0.0.1 のみにバインドし、X-GhidraLens-Token の
実行ごとのトークンを要求し、Origin または Referer ヘッダーを含むリクエストを
拒否します。そのため、ブラウザーで開いたページからデコンパイラーにアクセスすることはできません。
マルチユーザーモデルには対応しておらず、公開を想定していません。--host は
ループバック以外のアドレスを拒否します。
バイナリを解析しても実行はされませんが、Ghidra はマルウェアも問題なく開きます。 ほかのリバースエンジニアリング作業と同じ隔離環境を使用してください。
ライセンス
MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。