
IDA Proと言語モデルをMCPを介して橋渡しする、AI搭載のリバースエンジニアリングアシスタント。
IDA Proでvibeリバースエンジニアリングを可能にするシンプルな MCPサーバー です。
https://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0
動画で使用したバイナリとプロンプトは、mcp-reversing-dataset リポジトリで入手できます。
idapyswitch を使用して最新のPythonバージョンに切り替えます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"
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に最新の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に最新の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 が依存関係を解決するため、遅くなります。
注記: 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は幻覚を起こしやすいため、プロンプトを具体的にする必要があります。リバースエンジニアリングでは、整数とバイト間の変換が特に問題になります。以下は最小限のプロンプト例です。別のプロンプトで良い結果が得られた場合は、遠慮なくディスカッションを開始するか、issueを開いてください:
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に int_convert MCPツールを使用するよう指示してください。また、特定の操作には math-mcp が必要になる場合もあります。
もう1つ覚えておくべきことは、LLMは難読化されたコードではうまく機能しないということです。LLMを使って問題を解決しようとする前に、バイナリを一通り確認し、以下の項目を(自動的に)除去する時間を費やしてください:
また、LuminaやFLIRTなどのツールを使用して、オープンソースライブラリコードとC++ STLをすべて解決してみてください。これにより、さらに精度が向上します。
次のように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-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 引数を指定する必要があります。暗黙の「現在のデータベース」は存在しません。呼び出し元は、操作対象のセッションを指定します。
典型的なフロー:
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をディスクに保存します。通常のワーカーツールとして転送されます( が注入されます)— 両方のバックエンドで同じシグネチャです。ワーカー制御:
--max-workers N: 同時データベースワーカーの最大数(0 = 無制限、デフォルト 4)。IDA_MCP_MAX_WORKERS: --max-workers の環境変数によるデフォルト値。リソース は、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): ヌル終端文字列を読み取ります。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を含むdictを返し、Jupyterスタイルの評価をサポート)。analyze_funcs(addrs): 包括的な関数解析(逆コンパイル、アセンブリ、クロスリファレンス、呼び出し先、呼び出し元、文字列、定数、基本ブロック)。find_regex(queries): 大文字と小文字を区別しない正規表現で文字列を検索します(ページング対応)。find_bytes(patterns, limit=1000, offset=0): バイナリ内のバイトパターンを検索します(例: "48 8B ?? ??")。最大制限: 10000。find_insns(sequences, limit=1000, offset=0): コード内の命令シーケンスを検索します。最大制限: 10000。find(type, targets, limit=1000, offset=0): 高度な検索(即値、文字列、データ/コード参照)。最大制限: 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 キーを持つdictを受け付けます)。patch(patches): 複数のバイトシーケンスを一度にパッチします。put_int(items): ty(i8/u64/i16le/i16beなど)を使用して整数値を書き込みます。主な特徴:
[{..., 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-9257e316ae64
MCPサーバー自体をテストするには:
npx -y @modelcontextprotocol/inspector
これにより、http://localhost:5173 にWebインターフェースが開き、テスト用に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"
database=<id>server_health(database=<id>) を呼び出します(転送されます)。idb_list() は、スーパーバイザーのTCP/RPCプローブから is_active を報告します。