IDA Pro リバースエンジニアリングスキル
アクション必須(読んだらすぐ実行)
NOW:../field-journal/precedent-reverse.mdを読む — 本スキルの操作が許可された通常操作であることを確認するNOW: 現在のタスクが本スキルの適用範囲に合致しているか確認するNEXT:../tool-index.mdを読み、ツールの可用性と実際のパスを検証するNEXT: ツールがない場合は bootstrap を呼び出し、パスを推測しないACT: 「ワークフロー」の最初のステップに入り実行する。確認状態で止まらない
既知の問題と反省(必読)
踏んだ穴
-
idb_open(旧名idalib_open)を一部の AI クライアントの MCP で直接呼ばない- 一部のコード AI クライアントの MCP クライアントは、open 系ツールの output schema 検証にバグがある
- エラー:
Structured content does not match the tool's output schema - 解決策:
scripts/open.ps1スクリプトを使用して HTTP API 経由で直接呼び出し、MCP 検証レイヤを回避する - 現在の ida-pro-mcp 2.x のツール名は
idb_open/idb_list/idb_save(idalib_*ではない) - ファイルオープン後は
session_id(データベース)が返され、後続のツール呼び出しにはこのセッションが必要
-
C:\Windows\System32\のファイルは権限不足で開けない- idalib は System32 ディレクトリ内のファイルを直接読み取れない
- 解決策:
open.ps1が自動的に検出し、一時ディレクトリにコピーしてから開く
-
サーバ起動コマンドが会話をブロックする
idalib-mcp起動後、INFO ログがコンソールに出力され続ける- 解決策:
scripts/start.ps1(-WindowStyle Hiddenでバックグラウンド起動)を使用する - スクリプトはサービスが準備できるのを待ってから自動終了し、会話をブロックしない
-
MCP サーバ名にハイフンが使えない
- 以前は
ida-pro-mcpをサーバ名として使用していたが、ツール登録に問題が発生する可能性がある - 現在の設定:サーバ名
idapro、ツールプレフィックスidapro_*
- 以前は
-
Remote HTTP vs Local Stdio
type:"local"(stdio)モード:idalib_openでも schema 検証の問題が発生するtype:"remote"(HTTP)モード:スクリプトで直接ファイルを開き、その後 MCP ツールを使用できる- 現在の方式:Remote HTTP モード
-
PR #389 で schema の問題の一部が修正された
- 作者 mrexodia が issue #388 を受けて PR #389 で修正をマージ
- HTTP モードの structuredContent schema は修正されたが、一部のコード AI クライアント側の検証にまだ問題がある
- 最新の
mainブランチのバージョンがインストール済み
-
idalib のタイムアウトにより orphan worker プロセスがファイルをロックする
- 最初の
open.ps1がタイムアウトすると、idalib の python worker 子プロセスが orphan になり、.id0/.id1/.namを掴み続ける可能性がある - 後続のあらゆるツールや IDA GUI への手動ドラッグで「権限不足」エラーが発生する
- 禁止:
taskkill /F /Tでプロセスツリーを殺す —/Tは GUI のida.exe子プロセスも一緒に殺してしまう - 解決策:
start.ps1は、ポートがリッスンされていないか、tools/listが高速で返ってくるがpy_eval(旧 supervisor)がない場合のみ managed supervisor を置き換える;RPC がタイムアウトしても 13337 がまだリッスンしている場合はビジーと見なして殺さない。ライブラリを開くとき、open.ps1がopening.lockを書き込み、watchdog は-Forceしない - デッドロックの例外:
tools/listが 3 分以上連続して失敗(last-healthy タイムスタンプで判断、プロセス作成時間ではない)し、実行中のopening.lockがなく、GUI がポートを占有していない場合のみ、-Forceで supervisor を置き換える。それでもida.exeは殺さない - 最終手段:
open.ps1が古いライブラリがロックされていることを検出すると、自動的に Temp にコピーし、GUID プレフィックスを付けて開く
- 最初の
-
自動解析付きで開くとフリーズしたように見える
idalib_open(run_auto_analysis=true)は長時間パケットを返さない可能性があるが、バックエンドでは実際に開いて解析中である- 以前はユーザー側で「PowerShell の出力がずっとない」と見え、スクリプトのフリーズと誤判断されやすかった
- 現在の解決策:
open.ps1に-TimeoutSecondsを追加し、バックグラウンドリクエスト+フォアグラウンドポーリング+定期的な進捗出力に変更 - セッションの準備が整ったかをポーリングし、準備完了したら
OK:ファイル名:session_idを早期に返す。タイムアウトしたらERR:open_timeout_xxsを返す
-
HTTP MCP がログイン後に静かに終了する
- Cursor/Claude の
type: httpはプロセスを代わりに起動しない;古いタスクスケジューラはログイン時に一度だけ実行される pythonwはコンソールを持たず、クラッシュしても Application ログは空- 解決策:
start.ps1はデフォルトで正常なら再利用;watchdog.ps1が毎分巡回;ログは%LOCALAPPDATA%\reverse-skill\ida-mcp\ - インストール:
scripts/install-autostart.ps1。HTTP クライアントが起動時にポートがまだ上がっていない場合、MCP パネルで手動で一度リフレッシュする必要がある
- Cursor/Claude の
-
Streamable HTTP GET
/mcpがシングルスレッドの supervisor をブロックする- 一部の HTTP MCP クライアントは
/mcpに対して長期間の GET 接続(SSE)を送信する。stock のidalib_supervisorはbackground=FalseのHTTPServerを使用し、一度に一つのリクエストしか処理しない - 結果:
tools/listがタイムアウトし、クライアントがidaproをエラーとマークする - 解決策:
run-supervisor.pyで HTTP をThreadingHTTPServerに変更し、GET/mcpを受け入れる;パッチが失敗した場合はスキップして supervisor を起動する。ブロックされた場合はscripts/recover.ps1(即座に-Force)を使用する
- 一部の HTTP MCP クライアントは
ワークフロー原則
| ステップ | 何をする | 何を使う |
|---|---|---|
| 1 | HTTP サーバーが実行中であることを確認する | scripts/start.ps1(引数なし) |
| 2 | 対象のバイナリファイルを開く | scripts/open.ps1 -Path "xxx.exe" |
| 3 | MCP 分析ツールを使用する | idapro_* / HTTP tools を直接呼び出す(約 65 個、バージョンによる) |
| 4 | 分析完了 | ツールは自動利用可能 |
スクリプトリソース
start.ps1 — MCP HTTP サーバを起動する
パス:scripts/start.ps1
IDADIR(環境変数 / ポータブル版デスクトップパス / 一般的なインストールパス)を自動解決する- 優先的に IDA 付属の
Python314\python.exe -m ida_pro_mcp.idalib_supervisorを使用する - デフォルトでまず
http://127.0.0.1:13337/mcpをプローブし、正常ならOK:<n>:reuseを出力して終了する - 13337 がリッスン中だが
tools/listがタイムアウト →WARN:busy/OK:busy:reuse、殺さない(ライブラリを開いているか GUI が占有している場合、パケットを返せない) tools/listが 3 分以上連続して失敗(last-healthy タイムスタンプ)し、opening.lockがない → デッドロックと見なし、INFO:deadlockを出力し-Forceで supervisor を置き換える。進行中のidb_openと GUI はこのパスを通らない- ポートがリッスンされていない、
py_evalがない、または上記のデッドロックの場合のみ managed supervisor を置き換える;決してida.exeを殺さず、taskkill /Tも使用しない - GUI が 13337 を占有している場合、
WARN:gui_busyを出力して終了し、別の supervisor は起動しない - 成功すると
OK:<ツール数>(現在約 66)を出力し、失敗するとERR:timeoutを出力する - supervisor ログ:
%LOCALAPPDATA%\reverse-skill\ida-mcp\supervisor.log - サーバーはバックグラウンドで実行され、会話をブロックしない
呼び出し方:
powershell -File "<skill-root>\ida-reverse\scripts\start.ps1"
watchdog.ps1 / recover.ps1 / install-autostart.ps1 — 生存維持
watchdog.ps1:13337 をプローブ;正常なら reuse(last-healthy をリフレッシュ);GUI /open.ps1の開庫ロック / last-healthy が 3 分未満の busy → reuse;tools/listの連続失敗が 3 分を超えた場合のみstart.ps1 -Forcerecover.ps1:即座にstart.ps1 -Force(ida.exeは殺さない)。HTTP クライアントがidaproをエラーとマークした場合にこれを使用するinstall-autostart.ps1:タスクスケジューラreverse-skill-ida-mcp(ログイン時 + 毎分)を登録する- ログ:
%LOCALAPPDATA%\reverse-skill\ida-mcp\watchdog.log
open.ps1 — バイナリファイルを開く
パス:scripts/open.ps1
- HTTP API 経由で
idb_openを直接呼び出し、MCP schema 検証を回避する - System32 パスを自動検出し、一時ディレクトリにコピーする
- 同じ名前の古いデータベースファイル(
.id0/.id1/.nam/.til/.i64)を自動削除する - 古いライブラリがロックされている場合、自動的に縮退:Temp に GUID プレフィックスを付けてコピーし、開く。エラーにはしない
- オープンリクエストをバックグラウンドで実行し、長時間の同期待機によるスクリプトの応答なしを防ぐ
-TimeoutSecondsをサポートし、タイムアウトするとERR:open_timeout_xxsを返し、無限にブロックされない- 10 秒ごとに
INFO:opening:経過時間/タイムアウト秒数を出力し、解析中であることが分かるようにする - 成功すると
OK:ファイル名:session_idを出力し、縮退時には(temp copy)というマークが付く - 失敗した場合は自動的に Temp コピーで再試行する
呼び出し方:
powershell -File "<skill-root>\ida-reverse\scripts\open.ps1" -Path "C:\path\to\file.exe"
オプションパラメータ:
# SessionId を指定
powershell -File "scripts\open.ps1" -Path "file.exe" -SessionId "my_session"
# 自動解析をスキップ(大容量ファイル推奨)
powershell -File "scripts\open.ps1" -Path "large.exe" -NoAutoAnalysis
# タイムアウトを設定し、自動解析時の長時間応答なしを防ぐ
powershell -File "scripts\open.ps1" -Path "file.exe" -TimeoutSeconds 600
出力ルール:
# 解析進行中(10 秒ごとに出力)
INFO:opening:11/600s
# 成功して開いた
OK:sample.exe:abcd1234
# 成功して開いたが、ロックファイルのため Temp コピーに縮退
OK:1234abcd-sample.exe:abcd1234 (temp copy)
# タイムアウト上限に達した
ERR:open_timeout_600s
実測メモ:
Snipaste.exeの自動解析は実測で約324sかかって成功を返した。これは「解析に時間がかかっている」のであって「スクリプトがデッドロックしている」わけではない- したがって、GUI プログラムややや複雑なサンプルに遭遇した場合は、明示的に
-TimeoutSeconds 600を設定することを推奨する
コアツール一覧
概要分析(最初のステップ)
idapro_survey_binary(detail_level="minimal")— クイック概要:関数数、文字列、セグメント、エントリポイント、インポート分類(暗号化/ネットワーク/ファイルIO)idapro_list_funcs(queries)— 関数一覧(ページネーション、名前でフィルタリング)idapro_list_globals(queries)— グローバル変数一覧idapro_entity_query(kind, filter)— 統一クエリ:functions/globals/imports/strings/names
逆コンパイルと逆アセンブル
idapro_decompile(addr)— 疑似コードに逆コンパイルidapro_disasm(addr, max_instructions=N)— 逆アセンブルidapro_analyze_function(addr, include_asm=false)— 総合分析(疑似コード+文字列+定数+呼び出し元+呼び出し先+ブロック)idapro_func_profile(queries)— 関数概要指標
クロスリファレンスとデータフロー
idapro_xrefs_to(addrs)— 対象アドレスを参照しているものを調べるidapro_xref_query(addr, direction)— 高度な xref クエリ(方向/タイプフィルタリング)idapro_callees(addrs)— 子関数一覧idapro_callgraph(roots, max_depth)— コールグラフidapro_trace_data_flow(addr, direction, max_depth)— データフロー追跡(forward/backward)
検索
idapro_find_regex(pattern, limit)— 正規表現で文字列を検索idapro_search_text(pattern)— 逆アセンブルリスト内のテキストを検索idapro_find_bytes(patterns, limit)— バイトパターン検索(?? ワイルドカード対応)idapro_find(type, targets)— 高度な検索(即値/文字列/参照)
メモリとデータ
idapro_get_bytes(addrs)— 生のバイトを読み取るidapro_get_string(addrs)— 文字列を読み取るidapro_get_int(queries)— 整数値を読み取るidapro_get_global_value(queries)— グローバル変数の値を読み取るidapro_read_struct(queries)— 構造体フィールドの値を読み取るidapro_search_structs(filter)— 構造体を検索する
変更操作
idapro_set_comments(items)— コメントを追加する(逆アセンブル+逆コンパイルの双方向同期)idapro_append_comments(items)— コメントを追記するidapro_rename(batch)— 一括リネーム(関数/グローバル/ローカル/スタック変数)idapro_patch_asm(items)— アセンブリ命令をパッチするidapro_patch(patches)— バイトをパッチするidapro_define_func(items)— 関数を定義するidapro_undefine(items)— 定義を解除するidapro_define_code(items)— バイトをコードに変換する
型システム
idapro_declare_type(decls)— C 構造体/列挙型/共用体を宣言するidapro_set_type(edits)— 型を関数/グローバル/ローカルに適用するidapro_infer_types(addrs)— 型を推論するidapro_type_query(queries)— 宣言された型をクエリするidapro_type_inspect(queries)— 型の詳細を表示する
スタックフレーム
idapro_stack_frame(addrs)— スタックフレーム変数を表示するidapro_declare_stack(items)— スタック変数を宣言するidapro_delete_stack(items)— スタック変数を削除する
シグネチャ
idapro_make_signature(addrs)— アドレスからユニークなバイトシグネチャを生成するidapro_make_signature_for_function(addrs)— 関数のシグネチャを生成するidapro_find_xref_signatures(addrs)— アドレスを参照するコードのシグネチャを生成する
デバッガ(?ext=dbg が必要)
idapro_open_file(file_path)— GUI IDA インスタンスでファイルを開く- デバッガツールはデフォルトで非表示。URL パラメータ
?ext=dbgで有効化
セッション管理(ida-pro-mcp 2.x)
idapro_idb_open/ HTTPidb_open— ⚠️open.ps1を使って開くことを推奨idapro_idb_list/ HTTPidb_list— 全セッションを一覧表示idapro_idb_save/ HTTPidb_save— データベースを保存- ほとんどの分析ツールには
database=<session_id>パラメータが必要(open.ps1 が出力する session)
その他
idapro_int_convert(inputs)— 進数変換(必ずこれを使うこと。自分で計算しない!)idapro_export_funcs(addrs, format)— 関数をエクスポート(json/c_header/prototypes)idapro_py_eval(code)— IDA のコンテキストで Python を実行idapro_server_health()— サーバーのヘルスチェックidapro_server_warmup()— サブシステムをウォームアップ(文字列キャッシュ、Hex-Rays など)
リバースエンジニアリング完全ワークフロー
Step 1: サーバーを起動
パス A — Headless idalib(有効なライセンスが必要)
powershell -File "scripts/start.ps1"
OK:<ツール数>(現在約 65)が出力されれば準備完了。
パス B — GUI + プラグイン(idalib ライセンスが失敗した場合や対話的分析が必要な場合)
powershell -File "scripts/start-gui.ps1" -Path "C:\目標.exe"
またはポータブル版の Launch-IDA-Pro.cmd をダブルクリックし、IDA でサンプルを開く。
Output ウィンドウに [MCP] ... port=13337 と表示されたら、MCP ツールが使用可能。
一般的な連携手順は LOCAL-SETUP.md を参照。
Step 2: ファイルを開く
Headless の場合:
powershell -File "scripts/open.ps1" -Path "C:\目標.exe" -TimeoutSeconds 600
OK:ファイル名:session_id が出力されれば成功(後ろに (temp copy) が付いている場合は、自動的に一時コピーに縮退したことを示す)。
ERR:idalib_license:... が出力された場合は、パス B(GUI モード)に切り替え、open.ps1 を繰り返し再試行しない。
GUI モード:IDA で直接サンプルを開けばよく、open.ps1 は不要。
Step 3: 全体概要(インポートテーブルは必須)
idapro_survey_binary(detail_level="minimal")
注目点:
- アーキテクチャ(x86/x64/ARM)
- エントリポイント(main/WinMain/DllMain)
- 興味深い文字列(URL、パス、エラーメッセージ)
- インポート分類(MUST):暗号化関数 / ネットワーク API / ファイル操作 / プロセスインジェクション / レジストリ — 必ず Evidence として記録する(推奨 ID:
E-imports)。idapro_entity_query(kind="imports")または survey 出力の imports セクションを使用可能 - DLL/SYS:エクスポートテーブルとインポートテーブルを併記する(Evidence
E-exports) - .NET:従来の IAT がない場合、モジュール/メタデータ/マネージド参照サマリを同等のアンカーとして使用し、E-imports セマンティックスロットに書き込む
- クリーンなインポートテーブル:動的ロードの疑いを指摘し、動的 API ブレークポイント検証を促す
- 人気の関数(xref カウントの高い関数は、重要なロジックである可能性が高い)
ハードゲート:imports ビュー/分類サマリ(または正当な同等アンカー)を Evidence に書き込む前は、MUST NOT で Step 4 の深掘り結論に入ってはいけない。MUST NOT で survey 完了を主張してはいけない。インポートテーブルが空の場合やクエリに失敗した場合でも、失敗した現象を MUST で記録すること。パッキングされた IAT の修復に失敗した場合は、MUST で E-iat-repair-fail を記録し、動的デバッグに移行して API をキャッチする。静的解析に固執してはいけない。ユーザーがインポートテーブル/IAT の再チェックを要求した場合は、MUST で指名されたステップを再実行すること(ブロック時は実行可能性の門閂:説明+確認;強制時は quality=unreadable とマーク)。無関係なステップに変更してはいけない。
Step 4: 重要な関数を深掘り
idapro_analyze_function(addr="重要な関数名")
または:
idapro_decompile(addr="関数名")
idapro_disasm(addr="関数名", max_instructions=50)
Step 5: データフローとクロスリファレンス
idapro_xrefs_to(addrs="重要なアドレス/文字列")
idapro_callgraph(roots=["重要な関数"], max_depth=3)
idapro_trace_data_flow(addr="重要なアドレス", direction="backward", max_depth=5)
Step 6: 記録と最適化
idapro_set_comments(items=[{"addr": "0x140001000", "comment": "あなたの理解"}])
idapro_rename(batch={"func": [{"addr": "関数アドレス", "name": "意味のある名前"}]})
Step 7: レポートを出力
分析完了後、report.md を生成して発見事項と手順を記録する。
プロンプトエンジニアリングガイドライン
- 自分で進数計算をしない — 数値変換が必要な場合は常に
idapro_int_convertを使用する - survey してから深掘り — まず概要を確認し、的を絞って分析する
- 継続的にコメントとリネームを行う — 分析中に関数名や変数名を更新し続け、後続の分析精度を高める
- クロスリファレンスを追跡する — 興味深いデータ/文字列を見つけたら、
xrefs_toで誰がそれを参照しているかを確認する - 難読化コードに遭遇したら — まず文字列の復号、インポートハッシュの除去、コントロールフロー平坦化の除去などの前処理を行う
- C++ STL コード — FLIRT/Lumina でライブラリ関数を特定してから、ビジネスロジックを分析する
- ブルートフォースはしない — 分析は逆アセンブリから解決策を導き出すべきであり、簡単な Python で計算を補助する
- 「No database bound」が出たら — まだバイナリファイルを開いていない。先に
open.ps1を実行する - 「Failed to open database」が出たら — 古いデータベースファイルがロックされている可能性がある。
open.ps1が自動的に Temp コピーに縮退する(出力に(temp copy)マークが付く) - 自動解析付きで GUI/複雑なサンプルを開くとき — デフォルトで
-TimeoutSeconds 600を追加し、長時間のINFO:opening:...をスクリプトフリーズと誤判断しないこと
ルーティングコンテキスト
上流エントリ: skills/SKILL.md(統括)、routing.md
上流代替: radare2/(IDA を開きたくない場合、まず r2 でクイック偵察が可能)
下流出口:
- Frida による動的検証が必要 →
reverse-engineering/tools-dynamic.md - シンボリック実行/angr が必要 →
reverse-engineering/tools-dynamic.md - 汎用的なリバースエンジニアリング方法論が必要 →
reverse-engineering/SKILL.md
同階層の関連モジュール: radare2/(IDA が利用できない場合の代替手段)
オンデマンドブートストラップ(On-Demand Bootstrap)
本スキルのエントリスクリプトは、統合ブートストラップシステムに接続されています。
自動化能力の境界
| ツール | 自動インストール可能 | インストール方法 | 説明 |
|---|---|---|---|
| idalib-mcp | ✓ | pip install (from GitHub) | start.ps1 がない場合に自動インストール |
| IDA Pro 本体 | ✗ | 商用ソフトウェア。手動インストールが必要 | IDADIR 環境変数をインストールディレクトリに設定する |
インストール手順(検証済み)
:: 1. IDA パスを設定(実際の IDA インストールディレクトリに置き換える)
setx IDADIR "<あなたのIDAインストールディレクトリ>"
:: 2. GitHub から ida-pro-mcp をインストール(PyPI の ida-mcp は別プロジェクト。間違えないこと!)
pip install git+https://github.com/mrexodia/ida-pro-mcp.git
:: 3. IDA プラグインをインストール(Streamable HTTP + Global + 全クライアントを選択)
ida-pro-mcp --install
:: 4. IDA Pro を再起動し、対象ファイルを開く
:: プラグインは自動的に 127.0.0.1:13337 でリッスンする
:: 5. 確認
ida-pro-mcp --config
⚠️ 注意:PyPI の
ida-mcpパッケージ(作者 jtsylve)は別のプロジェクトです。私たちが必要としているものではありません。 GitHub からmrexodia/ida-pro-mcpをインストールする必要があります。
ブートストラップトリガーポイント
scripts/start.ps1:idalib-mcpがない場合、自動的にbootstrap-reverse.ps1を呼び出す- MCP 登録:bootstrap は自動的に
idaproを Claude MCP 設定に書き込む
前提条件
- IDA Pro がインストールされ、
IDADIR環境変数が設定されていること(またはスクリプト内のデフォルトパスが正しいこと) - IDA 付属の Python314 内の
ida-pro-mcpを使用することを推奨(ポータブル版には組み込み済み) - 一般的なローカル設定:
- User env
IDADIR→ IDA インストールディレクトリ(ida.exeを含む) - オプションで
~\Tools\bin\idalib-mcp.cmd/ida-pro-mcp.cmdラッパー - クライアント MCP サーバ名は
idapro→http://127.0.0.1:13337/mcpのみを残す
- User env
タスク完了セルフチェック(完了を主張する前に MUST で通過)
- ワークフローの各ステップを実行したか(読んだだけではないか)?
- survey/imports は Evidence に書き込んだか(E-imports または同等)?DLL/SYS は E-exports を含むか?IAT の失敗は E-iat-repair-fail を記録したか?
- ユーザーがインポートテーブル/IAT の再実行を要求した場合、同じステップを再実行したか?
-
tool-indexに基づいて実際のツールパスを使用したか? - 再現可能な証拠(コマンド/スクリプト/スクリーンショット/レポート)を生成したか?
- RULES で要求されている Checklist 項目を完了し、書き戻したか?