IDA Pro MCP について
IDA Pro MCP は、IDA Pro でのリバースエンジニアリングを LLM ベースのクライアントから行えるようにするシンプルな MCP サーバーです。IDA Pro を使用するリバースエンジニア向けで、GUI とヘッドレスの idalib の両方の実行モードに対応しています。
主な機能
- 01関数の逆コンパイルと逆アセンブル
- 02関数・グローバル変数・インポートシンボルの検索
- 03相互参照と呼び出し先の解析
- 04コメント追加・名前変更・型の変更
- 05ヘッドレス idalib セッションの管理
活用シーン
- 01クラックミーやマルウェア解析でのLLMによる支援
- 02関数へのコメント付与や変数名の一括変更
- 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リポジトリで入手できます。
前提条件
- Python(3.11 以降)
idapyswitchを使用して、最新の Python バージョンに切り替えてください
- IDA Pro(8.3 以降、9 を推奨)、IDA Free はサポートされていません
- サポート対象の MCP クライアント(お好みのものを選んでください)
- Amazon Q Developer CLI
- Augment Code
- Claude
- Claude Code
- Cline
- Codex
- Copilot CLI
- Crush
- Cursor
- Gemini CLI
- Kilo Code
- Kiro
- LM Studio
- Opencode
- Qodo Gen
- Qwen Coder
- Roo Code
- Trae
- VS Code
- VS Code Insiders
- Warp
- Windsurf
- Zed
- Kimi Code
- その他の MCP クライアント:
ida-pro-mcp --configを実行すると、クライアント用の JSON 設定を取得できます。
注: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
プロンプトについて議論し、実際のマルウェア解析を紹介するライブ配信:
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"
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
