让任何 AI 智能体都能理解编译后的二进制文件。
IDASQL 是 IDA Pro 数据库的 SQL 接口,由 Elias Bachaalany 创建。它提供 30+ 个虚拟表,涵盖函数、交叉引用、字符串、类型、导入、反汇编和反编译。使用你的编码智能体中的 /idasql 技能即可完全无头工作——智能体在后台为你运行 IDA——或者打开 IDA 的界面,与你的编码智能体协作共同进行逆向工程。无需 IDAPython。无需脚本。只需 SQL。
为什么选择 SQL? SQL 是每个 AI 智能体都已经掌握的通用查询语言。IDASQL 与智能体无关:Claude、ChatGPT、Copilot、Cursor、自定义智能体,或者完全没有智能体。任何能够发出 SQL 查询的工具都可以分析二进制文件。
IDASQL 支持同时分析、交叉引用以及在一个或多个数据库之间传输注释。你能做什么,仅受限于你的想象力和所用模型的能力。
IDA Pro 已经拥有自己的数据库格式,用于描述函数、字符串、交叉引用、类型等。IDASQL 将这些内部结构映射到 实时 SQL 虚拟表。无需单独的导出或索引步骤——查询直接针对 IDA 的数据库执行,更改会实时反映。
| 模式 | 启动方式 | 适用场景 |
|---|---|---|
| 独立 CLI | idasql -s binary.i64 -i | 直接 SQL、脚本、流水线 |
| IDA 插件 | 从 IDA 的 CLI 下拉菜单中选择 idasql | GUI 内使用 SQL,实时数据库 |
| 技能工作流 | 在你的编码 CLI 中使用 /idasql:connect | AI 驱动的分析——智能体自主发出 SQL 查询 |
| You / Agent --> Natural language or SQL |
|
/idasql skills (LLM translates intent to SQL)
|
IDASQL --> IDA database(s)
|
Results --> LLM summarizes & reasons
<inline><p><b>本项目仅供教育和研究目的。请负责任地使用。</b></p></inline>```
$ idasql -s WerFaultTool.exe.i64 -q "SELECT * FROM funcs LIMIT 5"
Opening: WerFaultTool.exe.i64...
Database opened successfully.
+------+-------------------------------------------------+------+----------+-------+
| addr | name | size | end_addr | flags |
+------+-------------------------------------------------+------+----------+-------+
| 16 | WerFaultTool.AboutForm::.ctor | 13 | 29 | 4096 |
| 32 | WerFaultTool.AboutForm::Dispose | 30 | 62 | 4096 |
| 64 | WerFaultTool.AboutForm::InitializeComponent | 295 | 359 | 4096 |
| 400 | WerFaultTool.WerFaultGUI::.ctor | 936 | 1336 | 4096 |
| 1344 | WerFaultTool.WerFaultGUI::CreateDynamicControls | 231 | 1575 | 4096 |
+------+-------------------------------------------------+------+----------+-------+
5 row(s)
一条命令。即时结果。无需编写脚本。
在安装 IDASQL CLI 和插件之后,启动你最喜欢的编码智能体,并通过提示开始逆向工程。IDASQL 完全以无头模式运行——你的智能体负责编排 IDA Pro:启动、分析、反编译、注释、保存——或者托管在 IDA GUI 内部,让你与智能体实时协作。
打开你最喜欢的编码智能体(例如 Claude Code)并输入:``` /idasql:connect Please open sample_malware.exe in the background and let's analyze it together.
该智能体在后台以无头模式启动 IDASQL。从此时起,即可与数据库自然对话。例如:```
/idasql:annotations Fully annotate the function I'm looking at, also use the decompiler skill.
模型自主推理出理解该函数的最佳方法,对其进行完整逆向工程并添加注释。
完成后,让智能体保存并关闭:``` /idasql:connect Please save all databases and shut down IDASQL.
### 使用多个数据库
您可以同时使用两个或更多数据库。提示您的智能体:```
/idasql:connect In this folder, there are many *.exe files. Please use parallel agents to open IDASQL in the background and report how many functions each has.
然后跟进:``` Tell me, how many strings all these databases have in common?
该代理可同时处理所有数据库。您可以在它们之间进行交叉引用、比较和转移注释。
### 使用 IDA UI
以上所有操作在 IDA GUI 中同样有效。要将您的代理与打开的 IDA 会话配合使用:
1. 在 IDA 的 `idasql>` 提示符中,输入: ```
.http start
现在 IDASQL 与你的 IDA 界面已经连接并协同工作。
IDASQL 技能让你的编码代理能够通过自然语言完全控制 IDA 数据库。
allthingsida/idasql-skills 市场安装。ida.exe,macOS/Linux 上为 ida)idasql --version 应能在命令行中正常工作在 Claude Code 中运行:```text /plugin marketplace add allthingsida/idasql-skills
然后从该市场安装 `idasql` 插件。有关 Codex 及其他安装路径,请参阅 [idasql-skills README](https://github.com/allthingsida/idasql-skills#installation)。
#### 技能
| 技能 | 描述 |
|-------|-------------|
| `connect` | 连接到 IDA 数据库:CLI、HTTP 服务器、会话引导、技能路由、全局契约。 |
| `disassembly` | 查询 IDA 反汇编:函数、段、指令、块、操作数、图形。 |
| `data` | 查询 IDA 字符串、字节和二进制数据:搜索、重建、字节模式。 |
| `xrefs` | 分析 IDA 交叉引用:调用者、被调用者、导入项、数据引用、grep 搜索。 |
| `decompiler` | 反编译 IDA 函数:伪代码、ctree AST、局部变量、标签。 |
| `annotations` | 编辑 IDA 数据库:注释、重命名、类型、书签、枚举/结构体渲染。 |
| `types` | IDA 类型系统:创建/修改/应用结构体、联合体、枚举、typedef、parse_decls。 |
| `debugger` | IDA 调试器:断点、字节修补、条件、补丁清单。 |
| `storage` | 通过 netnode_kv 在 IDA 数据库中进行持久化键值存储。 |
| `idapython` | 通过 idasql 执行 IDAPython:代码片段、沙箱、输出捕获。 |
| `functions` | 完整的 idasql SQL 函数参考目录。 |
| `analysis` | 分析 IDA 二进制文件:分类、安全审计、加密/网络检测、多表查询。 |
| `resource` | 重建 IDA 二进制文件资源:递归注释、结构恢复、类型重建。 |
| `ui-context` | 捕获实时 IDA UI 上下文:屏幕、选中区域、控件焦点、地址锚点。 |
#### 示例提示词```
/idasql:analysis analyze this binary; tell me the most called functions.
/idasql:data find functions that reference "password" strings and rank by xrefs.
/idasql:xrefs show callers of CreateFileW and summarize error handling.
/idasql:data identify suspicious hardcoded URLs and the functions that reference them.
/idasql 技能可在你的编码 CLI 中驱动分析 -- 无需 IDAPython 脚本。
idasql v0.0.18 - SQL interface to IDA databases
Usage: idasql -s [-q ] [-f ] [-i] [--export ]
Options: -s IDA database (.idb/.i64) OR raw binary (.exe/.dll/firmware/etc.) — raw binaries trigger fresh idalib analysis and string-list rebuild — legacy 32-bit .idb files upgrade to .i64 and require an explicit reopen --token Auth token for HTTP/MCP server mode (if server requires it) -q Execute SQL query or semicolon-separated script -f Execute SQL from file -i Interactive REPL mode -w, --write Save database on exit (persist changes) --export Export tables to SQL file (local mode only) --export-tables=X Tables to export: * (all, default) or table1,table2,... --http [port] Start HTTP REST server (default: 8080, local mode only) --bind Bind address for HTTP/MCP server (default: 127.0.0.1) --mcp [port] Start MCP server (default: random port, use in -i mode) Or use .mcp start in interactive mode -h, --help Show this help --version Show version
Examples: idasql -s test.i64 -q "SELECT name, size FROM funcs LIMIT 10" idasql -s test.i64 -q "SELECT * FROM binary; SELECT COUNT(*) FROM funcs;" idasql -s test.i64 -f queries.sql idasql -s test.i64 -i idasql -s test.i64 --export dump.sql idasql -s test.i64 --http 8080 idasql -s sample.exe --http # raw PE: idalib auto-analyzes, then serves SQL (default port 8080) idasql -s firmware.bin -q "SELECT * FROM binary" idasql -s test.i64 --mcp 9000
Thank you for using IDA. Have a nice day!
Legacy 32-bit `.idb` inputs are upgraded by idalib to a sibling `.i64`. When that
happens, idasql exits before serving SQL, returns exit code `3`, and prints one
JSON object to stdout with `status:"upgraded"` and `reopen_with`. Repeat the same
operation with `-s <reopen_with>`.
</details>
### 从源码构建
#### 先决条件
- CMake 3.20+
- C++20 编译器
- IDA SDK 9.0+(设置 `IDASDK` 环境变量)```bash
cmake -S . -B build -DIDASQL_WITH_MCP=ON -DIDASQL_BUILD_EXAMPLES=OFF
cmake --build build --config Release
有用的 CMake 开关:
| 开关 | 默认值 | 说明 |
|---|
IDASQL_WITH_MCP | ON | 通过 fastmcpp 构建 MCP 服务器支持。如需更小/离线构建,或不需要 --mcp / .mcp 时,可禁用。 |
IDASQL_BUILD_CLI | ON | 构建独立的 idasql 命令行工具。 |
IDASQL_BUILD_PLUGIN | ON | 构建 IDA 插件。 |
IDASQL_BUILD_EXAMPLES | ON | 构建 examples/ 下的示例程序。 |
说明:
--http,或在 REPL/插件 CLI 中使用 .http start。PRAGMA idasql.enable_idapython = 1; 按会话启用。IDASQL_WITH_MCP=ON 会获取 fastmcpp;OFF 则移除 MCP 支持以及 --mcp / .mcp 命令。XSQL_WITH_THINCLIENT 被强制为 ON,HTTPLIB_USE_OPENSSL_IF_AVAILABLE 被强制为 OFF,因为 IDASQL 使用本地明文 HTTP。30+ 个虚拟表,涵盖函数、字符串、类型、交叉引用、反汇编、反编译等。
| 表 | 说明 |
|---|---|
funcs | 函数 - 名称、地址、大小、结束地址、标志(INSERT/UPDATE/DELETE) |
segments | 段 - 名称、起始/结束地址、权限、类别(INSERT/UPDATE/DELETE) |
names | 命名位置 - 地址、名称、标志(INSERT/UPDATE/DELETE) |
entries | 入口点 - 导出/程序/TLS 回调(序号、地址、名称) |
imports | 导入 - 模块、名称、地址、序号 |
xrefs | 交叉引用 - 从/到地址、类型、is_code |
blocks | 基本块 - 起始/结束地址、func_addr、大小 |
fchunks | 函数分块 - 带属主的分割/尾部块 |
instructions | 反汇编 - 地址、助记符、操作数、itype、func_addr(UPDATE 操作数 format_spec / DELETE) |
instruction_operands | 规范化指令操作数 - opnum、文本、类型、值;按 addr 和 func_addr 优化 |
heads | 所有头部项(代码 + 数据)- 优化的地址查找/范围导航 |
| 表 | 说明 |
|---|---|
strings | 字符串 - 地址、内容、长度、类型 |
bytes | 原始字节 - value/word/dword/qword 可写(UPDATE 打补丁,DELETE 还原)、original_value、is_patched(通过 WHERE is_patched = 1 快速枚举补丁) |
| 表 | 说明 |
|---|---|
pseudocode | 通过 Hex-Rays 反编译的伪代码 |
ctree | Hex-Rays ctree AST 节点 |
ctree_lvars | Hex-Rays 反编译得到的局部变量 |
ctree_call_args | 每个调用点的 Hex-Rays 调用参数详情 |
ctree_labels | Hex-Rays ctree 标签(goto 目标) |
| 表 | 说明 |
|---|---|
types | 类型库 - 结构体、联合体、带成员的枚举(INSERT/UPDATE/DELETE) |
types_members | 结构体/联合体成员详情(INSERT/UPDATE/DELETE) |
types_enum_values | 枚举成员值(INSERT/UPDATE/DELETE) |
types_func_args | 函数类型参数详情 |
local_types | 本地类型库条目 |
| 表 | 说明 |
|---|---|
comments | 注释 - 地址、常规注释与可重复注释(INSERT/UPDATE/DELETE) |
bookmarks | 书签 - 槽位、地址、描述(INSERT/UPDATE/DELETE) |
breakpoints | 断点 - 地址、类型、是否启用、条件(完整 CRUD) |
hidden_ranges | 折叠/隐藏范围 - 起始/结束、描述、页眉、页脚 |
| 表 | 说明 |
|---|---|
grep | 统一实体搜索表(pattern、name、kind、addr、ordinal、parent_name、full_name) |
| 表 | 说明 |
|---|---|
binary | 数据库摘要/概览 - 处理器、位数、地址范围、计数 |
db_info | 数据库元数据键值对 |
ida_info | IDA 分析信息键值对 |
problems | IDA 分析问题/警告 |
signatures | FLIRT 签名状态 |
fixups | 修复/重定位条目 |
mappings | 地址空间映射 |
| 表 | 说明 |
|---|---|
netnode_kv | 持久化键值存储(netnode) |
| 表 | 说明 |
|---|---|
disasm_calls | 调用图 - 每个函数的调用者/被调用者对 |
disasm_loops | 循环检测 - 头块与回边 |
| 函数 | 说明 |
|---|---|
decompile(addr) | 反编译指定地址处的函数(返回伪代码) |
disasm_at(addr) | 指定地址处的规范反汇编列表 |
get_ui_context_json() | UI 上下文 JSON — 在 GUI 插件中实时生效;在 CLI/idalib 下为“不适用”桩实现 |
使用 grep 表对命名函数、标签、段、类型和成员进行可组合的 SQL 搜索。```sql
-- Search anything starting with "Create"
SELECT name, kind, printf('0x%X', addr) as addr
FROM grep
WHERE pattern = 'Create%'
LIMIT 20;
-- Search anywhere in name (plain text performs a contains search) SELECT name, kind, full_name FROM grep WHERE pattern = 'File' AND kind IN ('function', 'import') LIMIT 20;
-- Find struct members SELECT name, parent_name, full_name FROM grep WHERE pattern = 'dw%' AND kind = 'member';
-- Pagination SELECT name, kind, full_name FROM grep WHERE pattern = 'Create%' ORDER BY kind, name LIMIT 20 OFFSET 20;
## 集成
### HTTP REST API
用于简单集成的无状态 HTTP 服务器。无协议开销。```bash
idasql -s database.i64 --http 8080
输入内容为空,没有可翻译的文本。请提供 chunk 33 的实际 Markdown 内容。```bash curl http://localhost:8080/status curl -X POST http://localhost:8080/query -d "SELECT name FROM funcs LIMIT 5" curl -X POST http://localhost:8080/query -d "SELECT * FROM binary; SELECT COUNT(*) FROM funcs;"
所有 `/query` 响应均使用标准脚本信封 — 单条语句 = 包含一个条目的数组:```
{
"success": true,
"statement_count": <N>,
"results": [
{ "statement_index": 0, "success": true, "columns": [...], "rows": [...], "row_count": <N>, "elapsed_ms": <ms>, "error": null },
...
],
"row_count_total": <N>,
"elapsed_ms_total": <ms>,
"first_error_index": null
}
默认情况下是快速失败(fail-fast);传入 continue_on_error=true(例如 ?continue_on_error=1)即可忽略之前的失败,运行每一条语句。results[i].error 是每条语句失败的权威信息;first_error_index 指向最早失败的索引,若没有失败则为 null。当切分器失败时(例如未闭合的引号),响应为 success:false、statement_count:0、results:[],并附带顶层 parse_error。
对于多个数据库,请分别运行独立的实例:```bash idasql -s malware.i64 --http 8080 idasql -s kernel.i64 --http 8082
Endpoints: `/status`, `/help`, `/query`, `/shutdown`
#### 从 REPL 启动 HTTP 服务器
从 REPL 或 IDA 插件 CLI 中以交互方式启动 HTTP 服务器:```
idasql -s database.i64 -i
idasql> .http start
HTTP server started on port 8142
URL: http://127.0.0.1:8142
...
Press Ctrl+C to stop and return to REPL.
在 IDA 插件中(非阻塞):``` idasql> .http start HTTP server started on port 8142 idasql> .http stop HTTP server stopped
服务器使用随机端口(8100-8199),以避免与 `--http` 冲突。
### 自动启动(固定)
`.pin` 在 IDB(netnode `$ idasql config`)中持久化存储服务器偏好,以便
**IDA 插件在打开该数据库时自动启动** HTTP 或 MCP 服务器——
非常适合多实例场景,每个数据库都能保持稳定、已知的端口。```
idasql> .pin set http 8080 # pin HTTP at 127.0.0.1:8080 (autostart on)
idasql> .pin set mcp 0.0.0.0 9500 # bind override + port (port optional; omit or 0 = fresh random port each launch)
idasql> .pin list # show pinned config
idasql> .pin off http # disable autostart but keep host/port
idasql> .pin clear all # remove all pins
固定后,重新打开数据库会自动启动服务器——你会在加载时于 IDA 输出窗口中看到此信息:``` IDASQL v0.0.18: Query engine initialized IDASQL CLI: Installed IDASQL: autostart -> IDASQL HTTP server: http://127.0.0.1:8099 Type '.http stop' to stop the server.
`.pin`(或 `.pin list`)显示两个服务的当前配置:```
idasql> .pin
Autostart pins:
http 127.0.0.1:8099 (autostart: on)
mcp (not set)
.pin 命令本身
在 CLI 和插件中均可用(CLI 仅读取/写入 pin)。.http start / .mcp start 在未显式指定端口时复用已固定的主机/端口。.pin 更改仅在以 -w/--write 启动时持久保存
(与任何其他 IDB 编辑一样)。对于支持 MCP 的客户端(Model Context Protocol,一种 AI 工具集成标准):
--mcp 和 .mcp 在使用 -DIDASQL_WITH_MCP=ON 构建时可用,该选项默认开启。使用 -DIDASQL_WITH_MCP=OFF 构建可省略 MCP 支持。```bash
idasql -s database.i64 --mcp idasql -s database.i64 --mcp 9500 # specific port
idasql -s database.i64 -i .mcp start
配置你的 MCP 客户端:```json
{
"mcpServers": {
"idasql": { "url": "http://127.0.0.1:<port>/sse" }
}
}
工具:idasql_query(直接 SQL 查询或分号分隔的脚本)
IDASQL 是一个工具家族的一员,该家族通过相同的 SQL 接口暴露不同的二进制分析和调试信息平台,所有工具都构建在共享的 libxsql 虚拟表框架之上。你在一个工具上学会的查询在很大程度上可以沿用到其他工具——例如,相同的 SELECT name, size FROM funcs ORDER BY size DESC LIMIT 10 在任何地方都能运行。
逆向工程平台
调试信息与编译器数据
核心
简而言之:只要你保留声明并遵守许可证条款,你就可以阅读、构建、评估、基准测试、打包和使用未经修改的 idasql,包括商业用途。你可以在许可证的贡献用途规则范围内分叉或修补它,以准备错误修复、优化、功能、测试或文档改进,以便回馈上游。
未经 Elias Bachaalany 事先书面许可,你不得维护偏离原版的私有分支、移植、重新命名、克隆、API 兼容替代品、竞争性实现,或将 idasql 用作 AI 输入来重建或改进衍生实现。在许可证定义的范围内,并非从 idasql 复制、实质性衍生或大量借鉴的独立实现不受禁止。
许可请求:请在 allthingsida/idasql/issues 打开 GitHub issue。
如果 idasql 对某个分发的项目有实质性影响,请保留人类来源:在 README/文档中以及适用时的“关于/致谢”UI 中显著标注 idasql 和 Elias Bachaalany。许可证包含一个示例/FAQ 部分,介绍常见的允许用途和需要许可的用途。第三方依赖(libxsql、IDA SDK 及其传递依赖)仍受其各自许可证的约束。
请参阅完整的 Human-Origin Source License v1.0。