mcpField
G
ghidralens

ghidralens

ローカル
github.com開発ツール09 週間前に更新

ghidralens について

GhidraLensは、バイナリ解析やリバースエンジニアリング向けに、AIクライアント内でGhidraを操作できるMCPサーバーです。逆コンパイルや検索に加え、シンボルの改名や関数・コールグラフの移動に使えるクリック可能なビューを備えています。

主な機能

  1. 01インタラクティブな逆コンパイラービュー
  2. 02バイナリ関数の一覧表示と並べ替え
  3. 03コールグラフで呼び出し関係を表示
  4. 04文字列とクロスリファレンスの検索
  5. 05シンボルの改名とコメント追加
  6. 06編集内容のGhidraプロジェクトへの保存

活用シーン

  1. 01バイナリの逆コンパイル済み関数の確認
  2. 02関数間の関係の調査
  3. 03コード確認中の識別子の改名
  4. 04ローカルOllamaモデルを使ったバイナリ解析

MCP 対応

Ghidraの解析・編集ツールをMCPクライアントに提供し、MCP Appsを通じてインタラクティブなHTMLビューを表示します。ビュー上のクリックでツールを呼び出せますが、一部の書き込み操作はモデルに公開されません。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"hellosverre-ghidralens": {
"command": "npx",
"args": [
"-y",
"ghidralens"
],
"env": {
"GHIDRALENS_TOKEN": "<GHIDRALENS_TOKEN>",
"GHIDRALENS_BRIDGE_URL": "<GHIDRALENS_BRIDGE_URL>"
}
}
}
}
起動コマンドnpx -y ghidralens
設定が必要な環境変数
GHIDRALENS_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmghidralens0.1.1

ツール

10

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
pathstringはい実行可能ファイルの絶対パス
analyzebooleanいいえ自動分析を実行します。すでに分析済みの場合のみ false に設定してください。

詳細

GhidraLens

AI クライアント内に Ghidra を表示します。シンボルをクリックして名前を変更し、呼び出しをクリックして追跡できます。

CI MCP Apps Ghidra 11.3+ Local models npm MIT

逆コンパイラービュー

これまでの 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。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。