$npx -y skills add TsingShui/ida-agent-bridge --skill ida-agent-bridgeUse when writing ida-domain scripts, querying .i64 databases, or analyzing binaries. Provides short-connection REPL commands (disasm, xrefs, hexdump, pseudocode, rename) and arbitrary Python script execution piped via nc, with real-time file sync on rename/comment/patch.
| 1 | # IDA Domain API Reference |
| 2 | |
| 3 | ## 启动 ida-bridge |
| 4 | |
| 5 | **首先执行 ps 确认现有进程:** |
| 6 | |
| 7 | ```bash |
| 8 | ps -ef | grep ida-bridge | grep -v grep |
| 9 | ``` |
| 10 | |
| 11 | **根据结果判断:** |
| 12 | |
| 13 | - **有进程** → 从命令行参数里直接读取文件路径和端口号,跳到步骤 2 |
| 14 | - **无进程** → 询问用户: |
| 15 | > 没有发现正在运行的 ida-bridge。请告诉我: |
| 16 | > 1. 要分析的文件路径(`.i64` / `.so`) |
| 17 | > 2. 需要我帮你启动吗? |
| 18 | |
| 19 | **用户确认启动后:** |
| 20 | |
| 21 | ```bash |
| 22 | ida-bridge /path/to/file.i64 <port> --skip-export & |
| 23 | ``` |
| 24 | |
| 25 | - 端口默认 13120,如有冲突自选其他端口 |
| 26 | - **默认加 `--skip-export`**,不做全量导出(速度更快) |
| 27 | - 如果任务明确需要导出(批量分析、读 function_index.tsv 等),先问用户: |
| 28 | > 这个任务可能需要导出函数索引,是否启用导出?(首次较慢) |
| 29 | |
| 30 | 启动后用 `!ping` 确认就绪。 |
| 31 | |
| 32 | > **Agent 只使用短连接模式。** `--human-shell` 是给人用的交互模式,Agent 不应使用。 |
| 33 | |
| 34 | --- |
| 35 | |
| 36 | ## 工作流 |
| 37 | |
| 38 | **优先级:REPL 指令 → Python 脚本 → 原生 ida_* 模块** |
| 39 | |
| 40 | ``` |
| 41 | REPL 快捷指令(echo '!cmd' | nc localhost PORT) |
| 42 | ↓ 指令无法满足(批量操作/复杂逻辑) |
| 43 | Python 脚本(cat script.py | nc localhost PORT) |
| 44 | ↓ ida-domain 没有封装 |
| 45 | 原生 ida_* 模块(直接在脚本中调用) |
| 46 | ``` |
| 47 | |
| 48 | --- |
| 49 | |
| 50 | ## 快捷指令 |
| 51 | |
| 52 | 不需要写 Python,直接发单行命令。**这是最快的操作方式。** |
| 53 | |
| 54 | 地址和函数名均可互换(`0x...` 十六进制地址或符号名)。 |
| 55 | |
| 56 | ### 探索与查询 |
| 57 | |
| 58 | ```bash |
| 59 | echo '!afl' | nc localhost <port> # 列出所有函数 |
| 60 | echo '!afl jni' | nc localhost <port> # 搜含 jni 的函数名 |
| 61 | echo '!afi main' | nc localhost <port> # 函数详情 |
| 62 | echo '!iz ssl' | nc localhost <port> # 搜含 ssl 的字符串 |
| 63 | echo '!axi malloc' | nc localhost <port> # 导入符号的所有调用点 |
| 64 | ``` |
| 65 | |
| 66 | 输出格式: |
| 67 | |
| 68 | ``` |
| 69 | # !afl — TAB 分隔: 地址 名称 大小(hex) callers=N |
| 70 | 0x11f0 _ossl_fnv1a_hash 0x38 callers=0 |
| 71 | 0x1228 _ossl_ctype_check 0x28 callers=2 |
| 72 | |
| 73 | # !afi — 键值对 |
| 74 | name: _ossl_fnv1a_hash |
| 75 | addr: 0x11f0 - 0x1228 |
| 76 | size: 0x38 (56) |
| 77 | callers: 0 |
| 78 | callees: 0 |
| 79 | |
| 80 | # !iz — 地址 内容 refs=N [引用函数] |
| 81 | 0x810ee ossltest refs=1 [_alpn_select_cb] |
| 82 | |
| 83 | # !axi — 地址 引用类型 [所在函数] |
| 84 | 0x12f0 CALL_NEAR [in: _SSL_read] |
| 85 | ``` |
| 86 | |
| 87 | ### 交叉引用 |
| 88 | |
| 89 | ```bash |
| 90 | echo '!axt 0x1234' | nc localhost <port> # xrefs to 地址 |
| 91 | echo '!axf main' | nc localhost <port> # xrefs from 函数名 |
| 92 | ``` |
| 93 | |
| 94 | 输出格式: |
| 95 | |
| 96 | ``` |
| 97 | # !axt / !axf — 地址 引用类型 [所在函数] |
| 98 | 0x2f020 CALL_NEAR [in: _ossl_qlog_set_filter] |
| 99 | 0x2f064 CALL_NEAR [in: _ossl_qlog_set_filter] |
| 100 | ``` |
| 101 | |
| 102 | ### 反汇编与伪代码 |
| 103 | |
| 104 | ```bash |
| 105 | echo '!pd 0x1234' | nc localhost <port> # 从地址反汇编 16 条(默认) |
| 106 | echo '!pd 0x1234 32' | nc localhost <port> # 反汇编 32 条 |
| 107 | echo '!pdf main' | nc localhost <port> # 整函数反汇编(带 CFG block 标注) |
| 108 | echo '!pdc 0x1234' | nc localhost <port> # 伪代码 |
| 109 | echo '!pdc 0x1234 -s' | nc localhost <port> # 过滤变量声明(大函数用) |
| 110 | echo '!mc main' | nc localhost <port> # 微码(默认 generated) |
| 111 | echo '!mc main lvars' | nc localhost <port> # 微码 maturity: generated/preopt/locopt/calls/glbopt1/glbopt2/glbopt3/lvars |
| 112 | echo '!deps main' | nc localhost <port> # 递归调用链(默认深度 3) |
| 113 | echo '!deps main 5' | nc localhost <port> # 调用链深度 5 |
| 114 | ``` |
| 115 | |
| 116 | 输出格式: |
| 117 | |
| 118 | ``` |
| 119 | # !pd — 地址 指令助记符 操作数 |
| 120 | 0x11f0 MOV X8, X0 |
| 121 | 0x11f4 MOV X0, #0xCBF29CE484222325 |
| 122 | |
| 123 | # !pdf — 带 CFG block 标注的反汇编 |
| 124 | ; block 0 [0x11f0 - 0x1208] |
| 125 | 0x11f0 MOV X8, X0 |
| 126 | 0x1204 CBZ X1, locret_1224 ; true→ 0x1224 false→ 0x1208 |
| 127 | ; block 1 [0x1208 - 0x1210] |
| 128 | 0x1208 MOV X9, #0x100000001B3 ; → 0x1210 |
| 129 | |
| 130 | # !pdc — C 伪代码,首行注释标注函数名和地址 |
| 131 | ; _ossl_fnv1a_hash @ 0x11f0 |
| 132 | __int64 __fastcall ossl_fnv1a_hash(unsigned __int8 *a1, __int64 a2) |
| 133 | { |
| 134 | ... |
| 135 | } |
| 136 | |
| 137 | # !deps — 缩进树形调用链 |
| 138 | _ossl_isdigit [0x1250] |
| 139 | _ossl_ctype_check [0x1228] |
| 140 | ``` |
| 141 | |
| 142 | ### 修改与注释 |
| 143 | |
| 144 | ```bash |
| 145 | echo '!afn 0x1234 sign_request' | nc localhost <port> # 重命名函数(自动同步导出,caller 级联刷新) |
| 146 | echo '!cc main entry point' | nc localhost <port> # 设置函数级注释(Function Comment) |
| 147 | echo '!ca 0x1234 key check here' | nc localhost <port> # 设置地址级注释(Address Comment) |
| 148 | ``` |
| 149 | |
| 150 | ### 工具 |
| 151 | |
| 152 | ```bash |
| 153 | echo '!sb 01 14 40 f9' | nc localhost <port> # 搜索字节序列(全局) |
| 154 | echo '!sb 01 14 40 f9 0x1000 0x5000' | nc localhost <port> # 限定地址范围搜索 |
| 155 | echo '!hd 0x1234' | nc localhost <port> # hexdump 64 字节(默认) |
| 156 | echo '!hd 0x1234 128' | nc localhost <port> # hexdump 128 字节 |
| 157 | echo '!hd func_name' | nc localhost <port> # 符号名同样支持 |
| 158 | echo '!ping' | nc localhost <port> # 探活,返回打开的文件路径 |
| 159 | echo '!pwd' | nc localhost <port> # 当前工作目录 |
| 160 | echo '!quit' | nc localhost <port> # 关闭服务 |
| 161 | ``` |
| 162 | |
| 163 | 输出格式: |
| 164 | |
| 165 | ``` |
| 166 | # !sb — 地址 函数名+偏移 [所在函数] |
| 167 | 0x2e00 _ssl_ctrl+0x20 [in: _ssl_ctrl] |
| 168 | 0x3a1f _dtls1_start_timer+0x43 [in: _dtls1_start_timer] |
| 169 | |
| 170 | # !hd — 地址 hex bytes ASCII |
| 171 | 0x11f0 e8 03 00 aa a0 64 84 d2 40 84 b0 f2 80 9c d3 f2 .....d..@....... |
| 172 | |
| 173 | # !ping — 返回当前打开的文件绝对路径 |
| 174 | /path/to/libssl.dylib |
| 175 | ``` |
| 176 | |
| 177 | ### 与 Bash 工具联动 |
| 178 | |
| 179 | REPL 输出是纯文本,可直接接 `grep`、`sort`、`awk`、`jq` 等工具处理,无需额外解析。 |
| 180 | |
| 181 | ```bash |
| 182 | # 找被调用最多的函数 |
| 183 | echo '!afl' | nc localhost <port> | sort -t= -k2 -rn | head -10 |
| 184 | |
| 185 | # 找所有大于 0x200 字节的未命名函数 |
| 186 | echo '!afl' | nc localhost <port> | awk -F'\t' '$3 >= 0x200 && $2 ~ /^sub_/' |
| 187 | |
| 188 | # 从伪代码提取所有被调用函数名 |
| 189 | echo '!pdc _wpacket_intern_close' | n |