安全与风控
分析二进制/PE/ELF/APK/DLL/SO 时用…
当需要逆向、反编译、破解、找密码、漏洞/病毒/固件分析或分析 exe/dll/so/elf/macho/sys 等二进制文件时,用 IDA Pro + ida-pro-mcp(HTTP 模式)做静态分析与证据化报告。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
分析二进制/PE/ELF/APK/DLL特定
解决思路
- 读完后立刻读取 `../field-journal/precedent-reverse.md`,确认本次逆向操作是已授权的常规操作,并确认当前任务是否命中本 skill 适用范围。
- 读取 `../tool-index.md` 校验工具可用性和实际路径;缺工具时调用 bootstrap,不要猜路径;随后直接进入工作流第一步执行,不要停在确认状态。
- 不要用 AI 客户端 MCP 直接调用 `idb_open`(旧名 `idalib_open`),否则会报 `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\` 下的文件无权限打开时,交给 `open.ps1` 自动检测并复制到临时目录后再打开。
- 启动服务器用 `scripts/start.ps1`(`-WindowStyle Hidden` 后台静默启动),避免 idalib-mcp 持续输出 INFO 日志阻塞对话;脚本会等待服务就绪后自动退出。
- MCP 服务器名用 `idapro`(不要用带横线的 `ida-pro-mcp`,可能引起工具注册问题),工具前缀为 `idapro_*`。
- 采用 `type:"remote"`(HTTP)模式而不是 `type:"local"`(stdio)模式;HTTP 模式可先用脚本直开文件,再用 MCP 工具。
- 安装最新 `main` 分支版本(含 PR #389 对 HTTP 模式 structuredContent schema 的修复,对应 issue #388;部分客户端侧校验仍有问题)。
- 处理 idalib 超时留下的孤儿 worker 进程锁文件(咬着 `.id0`/`.id1`/`.nam` 不放导致后续报权限不足):禁止 `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 时间戳,不是进程创建时间)、且没有 in-flight `opening.lock`、不是 GUI 占端口时,才 `-Force` 替换 supervisor,仍不杀 `ida.exe`。
- 兜底:`open.ps1` 检测到旧库被锁时自动复制到 Temp 并加 GUID 前缀后打开,不报错。
- 带自动分析打开看起来像卡死时(`idalib_open(run_auto_analysis=true)` 长时间不回包但后端仍在继续打开和分析),用 `open.ps1` 的 `-TimeoutSeconds`,其实现为后台请求 + 前台轮询 + 定时进度输出;轮询到会话已就绪时提前返回 `OK:文件名:session_id`,超时返回 `ERR:open_timeout_xxs`。
- 处理 HTTP MCP 登录后静默退出:`start.ps1` 默认健康则复用;`watchdog.ps1` 每分钟巡检;日志在 `%LOCALAPPDATA%\reverse-skill\ida-mcp\`;用 `scripts/install-autostart.ps1` 安装;HTTP 客户端若启动时端口还没起来,仍需在 MCP 面板手动刷新一次。
- 处理 Streamable HTTP GET `/mcp` 卡住单线程 supervisor(stock `idalib_supervisor` 用 `background=False` 的 `HTTPServer`,一次只处理一个请求,导致 `tools/list` 超时被标 error):由 `run-supervisor.py` 把 HTTP 换成 `ThreadingHTTPServer` 并接受 GET `/mcp`;补丁失败则跳过并仍启动 supervisor;卡住时用 `scripts/recover.ps1`(立刻 `-Force`)。
- 按四步工作流原则执行:① `scripts/start.ps1`(无参数)确保 HTTP 服务器在运行;② `scripts/open.ps1 -Path "xxx.exe"` 打开目标二进制;③ 直接调用 `idapro_*` / HTTP tools(约 65 个,视版本而定)使用 MCP 分析工具;④ 分析完毕,工具自动可用。
- 用 `powershell -File "<skill-root>\ida-reverse\scripts\start.ps1"` 启动 MCP HTTP 服务器:脚本自动解析 `IDADIR`(环境变量 / 便携版桌面路径 / 常见安装路径),优先用 IDA 自带 `Python314\python.exe -m ida_pro_mcp.idalib_supervisor`。
- 按 start.ps1 输出判断状态:默认先探测 `http://127.0.0.1:13337/mcp`,健康则输出 `OK:<n>:reuse` 并退出;13337 在听但 `tools/list` 超时输出 `WARN:busy` / `OK:busy:reuse` 且不杀;死锁输出 `INFO:deadlock` 并 `-Force` 替换 supervisor;GUI 占用 13337 输出 `WARN:gui_busy` 并退出,不另起 supervisor;成功输出 `OK:<工具数>`(当前约 66),失败输出 `ERR:timeout`;supervisor 日志在 `%LOCALAPPDATA%\reverse-skill\ida-mcp\supervisor.log`。
- 用 `watchdog.ps1` 保活:探测 13337,健康 reuse 并刷新 last-healthy;GUI / `open.ps1` 开库锁 / last-healthy 未满 3 分钟的 busy → reuse;只有 `tools/list` 连续失败超过 3 分钟才 `start.ps1 -Force`。
- 用 `recover.ps1` 立刻执行 `start.ps1 -Force`(不杀 `ida.exe`),在 HTTP 客户端把 `idapro` 标成 error 时使用。
- 用 `install-autostart.ps1` 注册计划任务 `reverse-skill-ida-mcp`(登录 + 每分钟);watchdog 日志在 `%LOCALAPPDATA%\reverse-skill\ida-mcp\watchdog.log`。
- 用 `powershell -File "<skill-root>\ida-reverse\scripts\open.ps1" -Path "C:\path\to\file.exe"` 打开二进制:它通过 HTTP API 直调 `idb_open`、自动检测 System32 路径并复制到临时目录、自动清理同名旧数据库文件(`.id0`/`.id1`/`.nam`/`.til`/`.i64`)、旧库被锁时自动降级为 Temp 加 GUID 前缀、把打开请求放后台避免同步等待无响应、每隔 10 秒输出 `INFO:opening:已用时/超时秒数`、成功输出 `OK:文件名:session_id`(降级加 `(temp copy)` 标记)、失败时自动重试走 Temp 副本。
- 按需给 `open.ps1` 加参数:`-SessionId "my_session"` 指定 SessionId;`-NoAutoAnalysis` 跳过自动分析(大文件推荐);`-TimeoutSeconds 600` 设置超时避免带自动分析时长时间无返回。
- GUI 程序或较复杂样本(如 `Snipaste.exe` 带自动分析实测约 324s)优先显式设置 `-TimeoutSeconds 600`,不要把长时间的 `INFO:opening:...` 误判成脚本卡死。
- 概况分析(第一步)用 `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)` 为引用地址的代码生成签名。
- 调试器工具默认隐藏,通过 URL 参数 `?ext=dbg` 启用;用 `idapro_open_file(file_path)` 在 GUI IDA 实例中打开文件。
- 会话管理(ida-pro-mcp 2.x)用 `idapro_idb_list` / HTTP `idb_list` 列出所有 session、`idapro_idb_save` / HTTP `idb_save` 保存数据库;打开文件仍建议用 `open.ps1`;多数分析工具需要 `database=<session_id>` 参数。
- 进制转换必须用 `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,需有效 license)执行 `powershell -File "scripts/start.ps1"`,输出 `OK:<工具数>`(当前约 65)表示就绪;路径 B(idalib license 失败或需要交互分析时)执行 `powershell -File "scripts/start-gui.ps1" -Path "C:\目标.exe"`,或双击便携版 `Launch-IDA-Pro.cmd` 并在 IDA 中打开样本,确认 Output 窗口出现 `[MCP] ... port=13337` 后 MCP 工具即可用。
- 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、路径、错误消息)、热门函数(高 xref 计数的函数通常是关键逻辑)。
- Step 3 导入表硬门:必须把导入分类(加密函数 / 网络 API / 文件操作 / 进程注入 / 注册表)落成 Evidence(建议 id `E-imports`),可用 `idapro_entity_query(kind="imports")` 或 survey 输出中的 imports 段;DLL/SYS 需导出表与导入表并列(Evidence `E-exports`);.NET 无传统 IAT 时用模块/元数据/托管引用摘要作为等价锚点写入 E-imports 语义槽;干净导入表需注明动态加载嫌疑并推动动态 API 断点验证。
- 硬门禁:未把 imports 视图/分类摘要(或合法等价锚点)写入 Evidence 前,不得进入 Step 4 深挖结论,不得声称 survey 完成;导入表为空或查询失败时仍需记录失败现象;加壳 IAT 修复失败时必须记 `E-iat-repair-fail` 并转动态调试抓 API,禁止静态死磕;用户要求重做导入表/IAT 检查时必须重做被点名步骤(阻塞时走可行性门闩:说明+确认;强制则标 `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 准则:先 survey 后深入(先看概况再针对性分析);分析过程中持续加注释和重命名以提升后续分析准确性;发现有趣的数据/字符串用 `xrefs_to` 跟踪交叉引用。
- 遇到混淆代码先做字符串解密、导入哈希去除、控制流平坦化去除等预处理;遇到 C++ STL 代码先用 FLIRT/Lumina 识别库函数后再分析业务逻辑。
- 不要暴力破解,分析应从反汇编中推导解决方案,用简单 Python 辅助计算。
- 遇到 `No database bound` 说明还没打开任何二进制文件,先执行 `open.ps1`;遇到 `Failed to open database` 可能是旧数据库文件被锁,`open.ps1` 会自动降级到 Temp 副本(输出含 `(temp copy)` 标记)。
- 按路由上下文跳转:上游入口 `skills/SKILL.md`(总控)、`routing.md`;上游备选 `radare2/`(不想开 IDA 时先 r2 快速侦察);下游需 Frida 动态验证或符号执行/angr → `reverse-engineering/tools-dynamic.md`,需通用逆向方法论 → `reverse-engineering/SKILL.md`。
- 按需自举安装(仅 idalib-mcp 可自动,IDA Pro 本体需手动装):① `setx IDADIR "<你的IDA安装目录>"`;② `pip install git+https://github.com/mrexodia/ida-pro-mcp.git`(PyPI 上 jtsylve 的 `ida-mcp` 是另一个项目,不要装错);③ `ida-pro-mcp --install`(选 Streamable HTTP + Global + 全选客户端);④ 重启 IDA Pro 并打开目标文件,插件自动监听 127.0.0.1:13337;⑤ `ida-pro-mcp --config` 验证。
- 用自举触发点:`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 安装目录、可选 `~\Tools\bin\idalib-mcp.cmd` / `ida-pro-mcp.cmd` 包装器、客户端 MCP 服务器名只留 `idapro` → `http://127.0.0.1:13337/mcp`。
- 声称完成前通过自检:是否执行了工作流中的每一步(而不是只阅读);survey/imports 是否已写入 Evidence(E-imports 或等价)、DLL/SYS 是否含 E-exports、IAT 失败是否记 E-iat-repair-fail;用户若要求重做导入表/IAT 是否重做了同一步;是否基于 `tool-index` 使用了真实工具路径;是否产出可复现证据(命令/脚本/截图/报告);是否完成并回写了 RULES 要求的 Checklist 项。
适用边界 · 注意事项
- 没有 IDA Pro 有效 license 或无法使用 GUI 模式时,本技能依赖的商业 IDA Pro 与 ida-pro-mcp 无法工作,应先改用 radare2 等替代方案。
- 只想做快速侦察、不想开 IDA 时,可直接走 `radare2/` 上游备选模块,而不是启动完整 idalib 服务器。
- 需要动态插桩验证或符号执行而非静态反编译时,应转 `reverse-engineering/tools-dynamic.md` 的 Frida / angr 流程。