mcpField
I
IDA Pro MCP

IDA Pro MCP

ローカル
plugins.hex-rays.comセキュリティ13.2k5 週間前に更新

IDA Pro MCP について

IDA Pro MCP は、IDA Pro でのリバースエンジニアリングを LLM ベースのクライアントから行えるようにするシンプルな MCP サーバーです。IDA Pro を使用するリバースエンジニア向けで、GUI とヘッドレスの idalib の両方の実行モードに対応しています。

主な機能

  1. 01関数の逆コンパイルと逆アセンブル
  2. 02関数・グローバル変数・インポートシンボルの検索
  3. 03相互参照と呼び出し先の解析
  4. 04コメント追加・名前変更・型の変更
  5. 05ヘッドレス idalib セッションの管理

活用シーン

  1. 01クラックミーやマルウェア解析でのLLMによる支援
  2. 02関数へのコメント付与や変数名の一括変更
  3. 03コマンドラインやサーバー上でのヘッドレス解析の実行

MCP 対応

MCP サーバーとして、関数検索、逆コンパイル、相互参照、変更操作、IDB の状態などを MCP クライアントにリソースやツールとして公開します。

設定

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

インストール方法は未掲載です

このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。

リポジトリ

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

IDA Pro MCP

重要

代わりに、公式の Hex-Rays IDA MCP サーバーを使用することをおすすめします!

詳細については、発表ブログ記事をご覧ください。

IDA Pro でバイブリバースを可能にするシンプルな MCP サーバーです。

https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0

動画のバイナリとプロンプトは、mcp-reversing-datasetリポジトリで入手できます。

前提条件

注:idalib をグローバルに有効化し、uv をインストールしておく必要があります。

# windows
uv run "C:\Program Files\IDA Professional 9.3\idalib\python\py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.3.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
# linux
uv run "/path/to/idapro-9.3/idalib/python/py-activate-idalib.py"

インストール(Claude Code)

Claude Code に最新の IDA Pro MCP をインストールするには:

claude plugin marketplace add mrexodia/claude-marketplace
claude plugin uninstall ida-pro-mcp@mrexodia
claude plugin install ida-pro-mcp@mrexodia

インストール(Codex)

Codex に最新の IDA Pro MCP をインストールするには:

codex plugin marketplace add mrexodia/codex-marketplace
codex plugin remove ida-pro-mcp@mrexodia
codex plugin add ida-pro-mcp@mrexodia

インストール(Kimi Code)

Kimi Code に最新の IDA Pro MCP をインストールするには、チャットで次のスラッシュコマンドを実行します:

/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main
/reload

これにより、idalib MCP サーバーと idapython スキルがインストールされます。プラグインは $KIMI_CODE_HOME/plugins/managed/ にコピーされるため、uv が PATH 上にある必要があります。サーバーが応答する前に uv が依存関係を解決するため、インストール後の最初のセッションは通常より時間がかかります。

インストール(GUI)

注:MCP プラグインは推奨されなくなり、いずれ非推奨になります。代わりに idalib-mcp を使用してください。

IDA GUI から MCP サーバーを手動で設定する場合:

pip uninstall ida-pro-mcp
pip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip

MCP サーバーを設定し、IDA プラグインをインストールします:

ida-pro-mcp --install

重要:インストールを反映するには、IDA と MCP クライアントを完全に再起動してください。Claude など一部のクライアントはバックグラウンドで実行されるため、トレイアイコンから終了する必要があります。

プロンプトエンジニアリング

LLM は幻覚を起こしやすいため、プロンプトでは具体的に指示する必要があります。リバースエンジニアリングでは、特に整数とバイト間の変換で問題が起こりやすくなります。以下は最小限のプロンプト例です。別のプロンプトで良い結果が得られた場合は、気軽に議論を始めたり、イシューを作成したりしてください。

Your task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:

- Inspect the decompilation and add comments with your findings
- Rename variables to more sensible names
- Change the variable and argument types if necessary (especially pointer and array types)
- Change function names to be more descriptive
- If more details are necessary, disassemble the function and add comments with your findings
- NEVER convert number bases yourself. Use the `int_convert` MCP tool if needed!
- Do not attempt brute forcing, derive any solutions purely from the disassembly and simple python scripts
- Create a report.md with your findings and steps taken at the end
- When you find a solution, prompt to user for feedback with the password you found

このプロンプトは最初の実験にすぎません。出力を改善する方法が見つかった場合は、ぜひ共有してください!

@can1357 による別のプロンプト:

Your task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.

Use the following systematic methodology:

1. **Decompilation Analysis**
   - Thoroughly inspect the decompiler output
   - Add detailed comments documenting your findings
   - Focus on understanding the actual functionality and purpose of each component (do not rely on old, incorrect comments)

2. **Improve Readability in the Database**
   - Rename variables to sensible, descriptive names
   - Correct variable and argument types where necessary (especially pointers and array types)
   - Update function names to be descriptive of their actual purpose

3. **Deep Dive When Needed**
   - If more details are necessary, examine the disassembly and add comments with findings
   - Document any low-level behaviors that aren't clear from the decompilation alone
   - Use sub-agents to perform detailed analysis

4. **Important Constraints**
   - NEVER convert number bases yourself - use the int_convert MCP tool if needed
   - Use MCP tools to retrieve information as necessary
   - Derive all conclusions from actual analysis, not assumptions

5. **Documentation**
   - Produce comprehensive RE/*.md files with your findings
   - Document the steps taken and methodology used
   - When asked by the user, ensure accuracy over previous analysis file
   - Organize findings in a way that serves the project goals outlined in AGENTS.md or CLAUDE.md

プロンプトについて議論し、実際のマルウェア解析を紹介するライブ配信:

README の画像

LLM の精度を高めるためのヒント

大規模言語モデル(LLM)は強力なツールですが、複雑な数学的計算に苦労したり、「ハルシネーション」(事実をでっち上げること)が起きたりする場合があります。LLM に int_convert MCP ツールを使用するよう必ず指示してください。また、特定の処理では math-mcp も必要になることがあります。

もうひとつ覚えておきたいのは、LLM は難読化されたコードをうまく扱えないことです。LLM を使って問題を解決する前に、バイナリを調べ、以下のものを(自動的に)取り除くための作業に時間をかけてください。

  • 文字列の暗号化
  • インポートハッシュ
  • 制御フローのフラット化
  • コードの暗号化
  • 逆コンパイル対策のトリック

また、Lumina や FLIRT などのツールを使って、オープンソースライブラリのコードと C++ STL をすべて特定することもおすすめします。これにより、精度がさらに向上します。

トランスポートとヘッドレス MCP

次のようにして、ユーザーインターフェイスに接続する SSE サーバーを実行できます。

uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse

idalib をインストールした後は、ヘッドレス MCP サーバーも実行できます。初期バイナリを指定して起動できます。

uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable

または、バイナリを指定せずに起動し、後から idb_open(...) で任意のファイルを開くこともできます。

uv run idalib-mcp --host 127.0.0.1 --port 8745

stdio ベースのクライアントでは、次を使用します。

uv run idalib-mcp --stdio

データベースワーカーは永続的に動作します。各ワーカーはデタッチされたプロセスとして実行され、起動元のスーパーバイザーが終了した後も存続します。新しいスーパーバイザー(stdio または HTTP 経由)が、ホスト上のワーカーですでに開かれているバイナリに対して idb_open を呼び出すと、そのワーカーがスーパーバイザーに透過的に引き継がれます。別途有効にする「共有」モードはありません。一定時間リクエストがないと、ワーカーは自動的に終了します。

注:idalib 機能は Willi Ballenthin によって提供されました。

ヘッドレス idalib セッションモデル

idalib-mcp は、開いている各データベースを専用の idalib ワーカープロセスで維持するスーパーバイザーです。ワーカーはホストローカルのディスカバリーディレクトリに登録され、起動元のスーパーバイザーが終了した後も存続します。同じパスを必要とする後続のスーパーバイザーは、実行中のワーカーを引き継ぎます。アイドル TTL(デフォルトは 1 時間)の間にリクエストがないと、ワーカーは自動的に終了します。idb_close を呼び出すと、ワーカーをすぐに解放できます(--max-workers の枠が空きます)。引き継がれた GUI/ワーカーのインスタンスは、終了させずにデタッチされます。

idb_open は mode パラメーターに基づいてバックエンドを選択します。

  • prefer_headless(デフォルト):idalib ワーカーを起動します(または、すでにファイルを開いているワーカーを引き継ぎます)。
  • force_headless:同様ですが、ファイルを開いている GUI が実行中でも引き継ぎません。
  • prefer_gui:ファイルを開いている GUI が実行中であればそれを引き継ぎ、そうでなければ idalib ワーカーを起動します。
  • force_gui:ファイルを開いている GUI が実行中であればそれを引き継ぎ、そうでなければ新しい IDA GUI プロセスを起動します。

すべてのツール呼び出しには、明示的な database 引数が必要です。暗黙の「現在のデータベース」はありません。呼び出し元は、操作対象のセッションを指定します。

uv run idalib-mcp --stdio --max-workers 4

一般的な流れ:

idb_open("/path/to/binary_a.exe", preferred_session_id="binary_a")
idb_open("/path/to/library.dll", preferred_session_id="library")

decompile("main", database="binary_a")
xrefs_to("ImportantExport", database="library")

database には、idb_open が返した(または idb_list に表示される)セッション ID を指定する必要があります。ファイル名やパスは指定できません。

管理ツール
  • idb_open(input_path, mode="prefer_headless", run_auto_analysis=True, build_caches=True, init_hexrays=True, preferred_session_id=""):バイナリを開き、サブシステム(文字列キャッシュ、Hex-Rays)をウォームアップして、セッション ID を返します。このパスに対するワーカーまたは GUI がホスト上ですでに実行中の場合、そのインスタンスを引き継ぎ、preferred_session_id は無視されます。
  • idb_list():開いているセッションと実行中の GUI IDA インスタンスを一覧表示します。各エントリには、adopted(このスーパーバイザーが管理している場合は True、idb_open 経由でまだ開かれていない、検出済みの GUI/ワーカーの場合は False)、backend(worker または gui)、is_active、プロセス ID が含まれます。
  • idb_close(database, save=True):必要に応じて保存し、セッションの登録を解除して、所有するワーカーを終了し、--max-workers の空き枠を確保します。引き継いだ GUI/ワーカーインスタンスは切り離され、終了されません。
  • idb_save(session_id, path=""):セッションの IDB をディスクに保存します。通常のワーカーツールとして転送されます(database=<id> が注入されます)。両方のバックエンドで同じシグネチャです。
  • データベースごとの健全性確認:server_health(database=<id>) を呼び出します(転送されます)。idb_list() はスーパーバイザーの TCP/RPC プローブに基づく is_active を報告します。

ワーカー制御:

  • --max-workers N:同時に実行できるデータベースワーカーの最大数(0 = 無制限、デフォルトは 4)。
  • IDA_MCP_MAX_WORKERS:--max-workers の環境変数によるデフォルト値。

同梱の Codex プラグインは、Codex ホスト環境のランタイム設定変数 IDA_MCP_* を転送します。

  • 容量とライフサイクル:IDA_MCP_MAX_WORKERS、IDA_MCP_OPEN_TIMEOUT、IDA_MCP_WEDGED_GRACE_SEC、IDA_MCP_WORKER_CALL_TIMEOUT。
  • ヘルスプローブ:IDA_MCP_HEALTH_TCP_TIMEOUT、IDA_MCP_HEALTH_RPC_TIMEOUT、IDA_MCP_HEALTH_RETRIES、IDA_MCP_HEALTH_RETRY_BACKOFF。
  • ワーカーの動作:IDA_MCP_TOOL_TIMEOUT_SEC、IDA_MCP_ANALYSIS_PROMPT、IDA_MCP_URL。
  • リクエストのログ記録:IDA_MCP_LOG_REQUESTS、IDA_MCP_LOG_SKIP_METHODS。

MCP リソース

リソースは、MCP の理念に沿った、閲覧可能な状態(読み取り専用データ)を表します。

コア IDB 状態:

  • ida://idb/metadata - IDB ファイル情報(パス、アーキテクチャ、ベース、サイズ、ハッシュ)
  • ida://idb/segments - アクセス許可を含むメモリセグメント
  • ida://idb/entrypoints - エントリーポイント(main、TLS コールバックなど)

UI 状態:

  • ida://cursor - 現在のカーソル位置と関数
  • ida://selection - 現在の選択範囲

型情報:

  • ida://types - すべてのローカル型
  • ida://structs - すべての構造体/共用体
  • ida://struct/{name} - フィールドを含む構造体定義

検索:

  • ida://import/{name} - 名前によるインポートの詳細
  • ida://export/{name} - 名前によるエクスポートの詳細
  • ida://xrefs/from/{addr} - アドレスからのクロスリファレンス

コア関数

  • lookup_funcs(queries):アドレスまたは名前で関数を取得します(自動判定。リストまたはカンマ区切りの文字列を受け付けます)。
  • int_convert(inputs):数値を別の形式(10 進数、16 進数、バイト列、ASCII、2 進数)に変換します。
  • list_funcs(queries):関数を一覧表示します(ページ分割、フィルタリング対応)。
  • list_globals(queries):グローバル変数を一覧表示します(ページ分割、フィルタリング対応)。
  • imports(offset, count):モジュール名を含むすべてのインポート済みシンボルを一覧表示します(ページ分割対応)。
  • decompile(addr):指定したアドレスの関数を逆コンパイルします。
  • disasm(addr):詳細情報(引数、スタックフレームなど)を含めて関数を逆アセンブルします。
  • xrefs_to(addrs):指定したアドレスへのすべてのクロスリファレンスを取得します。
  • xrefs_to_field(queries):指定した構造体フィールドへのクロスリファレンスを取得します。
  • callees(addrs):指定したアドレスにある関数が呼び出す関数を取得します。

変更操作

  • add_bookmark(addr, name, prefix): アドレスに IDA ブックマークを追加または置換します。プレフィックスを付けない場合は prefix="" に設定します。
  • set_comments(items): 逆アセンブリビューとデコンパイラビューの両方で、指定したアドレスにコメントを設定します。
  • patch_asm(items): 指定したアドレスのアセンブリ命令にパッチを適用します。
  • declare_type(decls): ローカル型ライブラリに C 型を宣言します。
  • define_func(items): 指定したアドレスに関数を定義します。必要に応じて end を指定して境界を明示できます。
  • define_code(items): 指定したアドレスのバイト列をコード命令に変換します。
  • undefine(items): 指定したアドレスの項目を未定義にし、生のバイト列に戻します。必要に応じて end または size を指定できます。

メモリ読み取り操作

  • get_bytes(addrs): 指定したアドレスの生のバイト列を読み取ります。
  • get_int(queries): ty(i8/u64/i16le/i16be など)を使って整数値を読み取ります。
  • get_string(addrs): NULL 終端文字列を読み取ります。
  • get_global_value(queries): アドレスまたは名前でグローバル変数の値を読み取ります(自動検出、コンパイル時の値)。

スタックフレーム操作

  • stack_frame(addrs): 関数のスタックフレーム変数を取得します。
  • declare_stack(items): 指定したオフセットにスタック変数を作成します。
  • delete_stack(items): 名前でスタック変数を削除します。

構造体操作

  • read_struct(queries): 指定したアドレスの構造体フィールド値を読み取ります。
  • search_structs(filter): 名前パターンで構造体を検索します。

デバッガー操作(拡張機能)

デバッガーツールはデフォルトで非表示です。?ext=dbg クエリパラメーターで有効にできます。

http://127.0.0.1:13337/mcp?ext=dbg

制御:

  • dbg_start(): デバッガープロセスを開始します。
  • dbg_exit(): デバッガープロセスを終了します。
  • dbg_continue(): 実行を続行します。
  • dbg_run_to(addr): 指定したアドレスまで実行します。
  • dbg_step_into(): 命令のステップインを実行します。
  • dbg_step_over(): 命令のステップオーバーを実行します。

ブレークポイント:

  • dbg_bps(): すべてのブレークポイントを一覧表示します。
  • dbg_add_bp(addrs): ブレークポイントを追加します。
  • dbg_delete_bp(addrs): ブレークポイントを削除します。
  • dbg_toggle_bp(items): ブレークポイントを有効または無効にします。

レジスター:

  • dbg_regs(): 現在のスレッドのすべてのレジスター。
  • dbg_regs_all(): すべてのスレッドのすべてのレジスター。
  • dbg_regs_remote(tids): 指定したスレッドのすべてのレジスター。
  • dbg_gpregs(): 現在のスレッドの GP レジスター。
  • dbg_gpregs_remote(tids): 指定したスレッドの GP レジスター。
  • dbg_regs_named(names): 現在のスレッドの指定したレジスター。
  • dbg_regs_named_remote(tid, names): 指定したスレッドの指定したレジスター。

スタックとメモリ:

  • dbg_stacktrace(): モジュール/シンボル情報を含むコールスタック。
  • dbg_read(regions): デバッグ中のプロセスからメモリを読み取ります。
  • dbg_write(regions): デバッグ中のプロセスのメモリに書き込みます。

高度な解析操作

  • py_eval(code): IDA のコンテキストで任意の Python コードを実行します(result/stdout/stderr を含む辞書を返し、Jupyter 形式の評価に対応)。
  • analyze_funcs(addrs): 関数を包括的に解析します(デコンパイル、アセンブリ、相互参照、呼び出し先、呼び出し元、文字列、定数、基本ブロック)。

パターンマッチングと検索

  • find_regex(queries): 大文字と小文字を区別しない正規表現で文字列を検索します(ページネーション対応)。
  • find_bytes(patterns, limit=1000, offset=0): バイナリ内でバイトパターンを検索します(例:"48 8B ?? ??")。最大 limit:10000。
  • find_insns(sequences, limit=1000, offset=0): コード内で命令シーケンスを検索します。最大 limit:10000。
  • find(type, targets, limit=1000, offset=0): 高度な検索(即値、文字列、データ/コード参照)。最大 limit:10000。

制御フロー解析

  • basic_blocks(addrs): 後続ブロックと先行ブロックを含む基本ブロックを取得します。

型操作

  • set_type(edits): 関数、グローバル変数、ローカル変数、またはスタック変数に型を適用します。
  • infer_types(addrs): Hex-Rays またはヒューリスティックを使用して、指定したアドレスの型を推論します。

エクスポート操作

  • export_funcs(addrs, format): 指定した形式(json、c_header、または prototypes)で関数をエクスポートします。

グラフ操作

  • callgraph(roots, max_depth): ルート関数から、深さを指定してコールグラフを構築します。

バッチ操作

  • rename(batch):関数、グローバル変数、ローカル変数、スタック変数の統合バッチリネーム操作です(func、data、local、stack のキーを任意で含む辞書を受け取ります)。
  • patch(patches):複数のバイト列を一度にパッチします。
  • put_int(items):ty を使用して整数値を書き込みます(i8/u64/i16le/i16be など)。

主な機能:

  • 型安全な API:すべての関数で TypedDict スキーマを使用した厳密な型付きパラメーターを使用し、IDE のサポートと LLM の構造化出力を向上させます。
  • バッチ優先の設計:ほとんどの操作で単一項目とリストの両方を受け付けます。
  • 一貫したエラー処理:すべてのバッチ操作は [{..., error: null|string}, ...] を返します。
  • カーソルベースのページネーション:検索関数は cursor: {next: offset} または {done: true} を返します(デフォルトの上限は 1000 で、トークンのオーバーフローを防ぐため最大値を 10000 に制限しています)。
  • パフォーマンス:大規模なプロジェクトで build_strlist の呼び出しが繰り返されないよう、文字列を MD5 ベースの無効化方式でキャッシュします。

開発

新機能の追加はとても簡単で、手順も効率化されています。src/ida_pro_mcp/ida_mcp/api_*.py のモジュール式 API ファイルに新しい @tool 関数を追加するだけで、追加のボイラープレートなしでその関数を MCP サーバーから利用できます。以下は、get_metadata 関数をテスト込みで 2 分以内に追加する動画です。

https://github.com/user-attachments/assets/951de823-88ea-4235-adcb-9257f316ae64

MCP サーバー自体をテストするには、次のコマンドを実行します。

npx -y @modelcontextprotocol/inspector

これにより、http://localhost:5173 にウェブインターフェースが開き、テスト用に MCP ツールを操作できます。

テストでは、IDA プラグインへのシンボリックリンクを作成し、JSON-RPC リクエストを http://localhost:13337/mcp に直接 POST します。シンボリックリンクを有効にすると、次のコマンドを実行できます。

uv run ida-pro-mcp --install

main への直接コミットの変更履歴を生成します。

git log --first-parent --no-merges 1.2.0..main "--pretty=- %s"

コメント

MCP は初めてですか?

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

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