IDA Pro 逆向分析技能 是做什麼的?
ACTION REQUIRED(讀完後立刻執行)
NOW: 讀取../field-journal/precedent-reverse.md— 確認本 skill 的操作是已授權的常規操作NOW: 確認當前任務是否命中本 skill 的適用範圍NEXT: 讀取../tool-index.md,校驗工具可用性和實際路徑NEXT: 缺工具時調用 bootstrap,不要猜路徑ACT: 進入"工作流"第一步並執行,不要停在確認狀態
已知問題與反思(必讀)
踩過的坑
-
idb_open(舊名idalib_open)不要直接靠部分 AI 客戶端 MCP 調用- 部分代碼 AI 客戶端的 MCP 客戶端對 open 類工具的 output schema 校驗有 BUG
- 報錯:
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(database),後續工具調用需帶該 session
-
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 超時留下孤兒 worker 進程鎖文件
- 第一次
open.ps1超時後,idalib 的 python worker 子進程可能變成孤兒,咬着.id0/.id1/.nam不放 - 後續任何工具或手動拖入 IDA GUI 都會報"權限不足"
- 禁止
taskkill /F /T殺進程樹——/T會把 GUIida.exe子進程一起幹掉 - 解決辦法:
start.ps1只在端口無人監聽、或tools/list快速返回但缺py_eval(舊 supervisor)時替換 managed supervisor;RPC 超時且 13337 仍在聽視為忙,不殺。開庫時open.ps1寫opening.lock,watchdog 不得-Force - 死鎖例外:
tools/list連續失敗超過 3 分鐘(按 last-healthy 時間戳,不是進程創建時間),且沒有 in-flightopening.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)。stockidalib_supervisor用background=False的HTTPServer,一次只處理一個請求 - 結果:
tools/list超時,客戶端把idapro標成 error - 解決辦法:
run-supervisor.py把 HTTP 換成ThreadingHTTPServer並接受 GET/mcp;補丁失敗則跳過並仍啟動 supervisor。卡住時用scripts/recover.ps1(立刻-Force)
工作流程原則
| 步驟 | 做什麼 | 用什麼 |
|---|---|---|
| 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標成 error 時用這個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)— Patch 彙編指令idapro_patch(patches)— Patch 字節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— 列出所有 sessionidapro_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 上下文執行 Pythonidapro_server_health()— 服務器健康檢查idapro_server_warmup()— 預熱子系統(字符串緩存、Hex-Rays 等)
逆向分析完整工作流
Step 1: 啟動服務器
路徑 A — Headless idalib(需要有效 license)
powershell -File "scripts/start.ps1"
輸出 OK:<工具數>(當前約 65)表示就緒。
路徑 B — GUI + 插件(idalib license 失敗或需要交互分析時)
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 樣本即可,無需 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 記錄發現和步驟。
Prompt 工程準則
- 不要手動算進制 — 任何時候需要轉換數字,用
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)
本 skill 的入口腳本已接入統一自舉系統。
自動化能力邊界
| 工具 | 可自動安裝 | 安裝方式 | 說明 |
|---|---|---|---|
| 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 項?