Back to home

O3SET

dsh-idapro

No description

Stars
0
Language
JavaScript
Created
Aug 16, 2026
Updated
Aug 16, 2026

Introduction

dsh-idapro

DeepSeek Harness 插件:连接本地 IDA Pro,让 AI 智能体直接查询与控制当前打开的 idb。

IDA 本身没有远程控制 API,因此本插件由两部分组成:

┌─────────────────────────┐        HTTP JSON (POST /rpc)        ┌──────────────────────────┐
│  IDA Pro (本地)          │  ◄───────────────────────────────► │  DeepSeek Harness (DSH)  │
│  ida/dsh_ida_server.py  │      127.0.0.1:13337 (默认)         │  dsh-idapro 插件          │
│  IDAPython HTTP 服务     │                                    │  15 个 ida_* 工具          │
└─────────────────────────┘                                    └──────────────────────────┘
  • IDA 侧 ida/dsh_ida_server.py:在 IDA 内启动一个默认仅本机可访问的 HTTP 服务,所有 IDA API 调用经 ida_kernwin.execute_sync 封送到主线程执行(读 MFF_READ,写 MFF_WRITE)。
  • DSH 侧 本插件:通过 curl 经 ctx.shell 调用 /rpc,向智能体注册 32 个工具 (15 个静态分析 + 17 个动态调试)。

快速开始

1. IDA 侧:启动服务(任选其一)

A. 作为插件(推荐) — 复制脚本到 IDA plugins 目录,重启 IDA 后自动启动:

copy ida\dsh_ida_server.py "C:\Program Files\IDA Pro 8.3\plugins\"

B. 作为脚本 — IDA 菜单 File > Script file... 打开 ida\dsh_ida_server.py,立即启动。

IDA 控制台出现 [dsh-ida-server] ✔ 监听 http://127.0.0.1:13337 即成功。

2. DSH 侧:构建并安装

cd dsh-idapro
node scripts/install.mjs

install.mjs 会自动构建 dist,在 %DSH_HOME%\profiles\web\node_modules\dsh-idapro 创建 junction 链接并在补丁层 cordis.patch.yml 登记 name: dsh-idapro重启 DSH 进程(或等待 长驻界面 HMR 自动重载)后生效。

3. 验证

在新会话中调用 ida_status,返回当前 idb 的文件信息、架构、函数数量等即连接成功。

工具列表

工具功能写操作
ida_status连接状态 + idb 元信息(文件/MD5/架构/基址/函数数/Hex-Rays 可用性)
ida_functions函数列表(名称过滤 / 地址范围 / 分页)
ida_decompileHex-Rays 反编译(地址或函数名 → 伪代码)
ida_disasm线性反汇编(逐条 / 整个函数,支持 next_ea 续读)
ida_xrefs交叉引用(to=谁引用我 / from=我引用谁 / both)
ida_strings已定义字符串(C/UTF-16,最小长度与子串过滤)
ida_imports导入表(模块/函数名/序号/地址)
ida_exports导出表(序号/名称/地址/转发目标)
ida_segments段布局(名称/起止/大小/权限/类型)
ida_bytes读取原始字节(hex + 可打印 ASCII)
ida_search搜索字节模式(支持 ?? 通配)或文本
ida_rename重命名符号(函数名/全局名)
ida_comment设置注释(可重复/不可重复)
ida_patch写入补丁字节
ida_config查看/设置连接地址与访问令牌否(写凭证)

动态调试(需 IDA 已加载调试器后端,打开 PE/ELF 的 idb 即可自动加载):

工具功能写操作
ida_dbg_status调试器状态(会话/挂起状态/当前 ip/断点模块线程数)
ida_dbg_launch启动调试目标进程(可带参数),挂起于入口点
ida_dbg_attach附加到运行中进程(按 pid 或进程名)
ida_dbg_continue继续执行(立即返回,运行态)
ida_dbg_pause挂起进程,返回当前 ip
ida_dbg_step_into单步进入(等待挂起)
ida_dbg_step_over单步跳过(等待挂起)
ida_dbg_run_to运行到指定地址后挂起
ida_dbg_bps列出所有断点
ida_dbg_add_bp添加断点(soft/exec/read/write/rdwr)
ida_dbg_del_bp删除断点
ida_dbg_regs读取寄存器(全部或指定)
ida_dbg_set_reg写入寄存器(如改 EIP/EAX)
ida_dbg_mem读写被调试进程运行时内存(write_hex 时写入)是/否
ida_dbg_modules已加载模块列表(基址/大小)
ida_dbg_threads线程列表
ida_dbg_detach分离调试器(kill=true 终止被调试进程)

地址约定:所有地址均为十六进制字符串(如 "0x401000")或符号名(如 "main"), 避免 64 位地址在 JSON 中的精度丢失。写操作(rename/comment/patch)可用 IDA 自身撤销 (Edit > Undo)。

动态调试工作流

  1. 在 IDA 中打开目标文件对应的 idb(调试器后端自动加载),运行 dsh_ida_server.py
  2. ida_dbg_launch 启动目标(或 ida_dbg_attach 附加到运行中的进程)——进程挂起于入口点
  3. ida_dbg_add_bp 在关键位置下断点(软件断点或硬件读写断点)
  4. ida_dbg_continue 运行,命中后自动挂起;ida_dbg_status 查看当前 ip 与状态
  5. 挂起状态下:ida_dbg_regs 读寄存器、ida_dbg_mem 读运行时内存、 ida_decompile/ida_disasm 对照静态视图、ida_dbg_step_into/step_over 单步、 ida_dbg_run_to 快速越过区间、ida_dbg_set_reg/ida_dbg_mem(write_hex) 篡改状态
  6. 结束:ida_dbg_detach(或 kill=true 终止)

注意:ida_bytes 读的是 idb 静态字节,运行期内存用 ida_dbg_mem;两者在自修改代码 场景下会不同。调试控制工具会等待进程挂起(默认 10 秒,可传 timeout),超时后进程 可能仍在运行,用 ida_dbg_pause 或重试。

配置

优先级:工具参数 > 环境变量 > 凭证库(同名环境变量优先生效)。

用途DSH 侧引用名 / 环境变量IDA 侧环境变量
服务地址DSH_IDA_URL(默认 http://127.0.0.1:13337DSH_IDA_HOST / DSH_IDA_PORT
访问令牌DSH_IDA_TOKENDSH_IDA_TOKEN
  • 会话内设置:调用 ida_config(写入凭证库,跨会话持久)。
  • 环境变量方式:设置 DSH_IDA_URL / DSH_IDA_TOKEN 后重启 DSH。
  • 端口冲突时:IDA 侧设置 DSH_IDA_PORT=13338,DSH 侧 ida_config 设置 url 为 http://127.0.0.1:13338

安全

  • 默认只监听 127.0.0.1,外部无法访问。
  • 需要跨机访问时可将 IDA 侧 DSH_IDA_HOST 设为 0.0.0.0,但务必同时设置 DSH_IDA_TOKEN,请求需携带相同令牌(hmac 恒时比较)。
  • 写操作工具(ida_rename / ida_comment / ida_patch)直接修改 idb,请谨慎使用。

协议

POST /rpc
{"method": "decompile", "params": {"addr": "0x401000"}, "token": ""}

200 OK
{"ok": true, "result": {"ea": "0x401000", "name": "main", "hexrays": "8.3.0.240320", "pseudo": "..."}}

或 {"ok": false, "error": "..."}

方法:静态 status functions decompile disasm xrefs strings imports exports segments read_bytes search rename comment patch;调试 dbg_status dbg_launch dbg_attach dbg_detach dbg_continue dbg_pause dbg_step_into dbg_step_over dbg_run_to dbg_bps dbg_add_bp dbg_del_bp dbg_regs dbg_set_reg dbg_mem dbg_modules dbg_threads

常见问题

连接失败(curl 退出码 7):检查 (1) IDA 已打开目标 idb;(2) 服务脚本已运行(IDA 控制台 有监听提示);(3) 地址端口与 ida_config 一致。可先 curl http://127.0.0.1:13337/ 手工验证。

ida_decompile 报未安装 Hex-Rays:需要 IDA 装有 Hex-Rays 反编译器(F5 可用)。

ida_strings:全量扫描大文件耗时,请限定 start/end、提高 min_len 或减小 count

执行器/无界面模式execute_sync 依赖 IDA 主线程,idat 文本模式可用,无界面批处理不支持。

目录结构

dsh-idapro/
├── ida/dsh_ida_server.py    # IDA 侧 HTTP 服务 (IDAPython, 插件或脚本方式加载)
├── src/                     # DSH 插件源码 (零依赖 ESM, mini-bundler 拼接)
│   ├── index.js             # 插件入口 (inject: shell, tools)
│   ├── lib/                 # utils / runtime 适配 / http(经 curl) / config / rpc client
│   └── tools/               # 15 个 ida_* 工具
├── scripts/                 # build.mjs (打包) / install.mjs / uninstall.mjs
├── test/                    # node:test 单元 + loader 冒烟测试
└── dist/                    # 构建产物 (dsh-idapro-host.js + dsh-idapro-plugin.mjs)

开发

npm run build   # 构建 dist (动态插件函数体 + Loader ESM 产物)
npm test        # 构建 + node --test

与 MapScan 插件相同:src/** 中的模块由 scripts/build.mjs 按依赖顺序拼接为单文件函数体, 仅支持单行 named import/export,模块间顶层符号名不得重复。

License

MIT