Xevion/idakit
GitHub: Xevion/idakit
idakit 是 IDA Pro 9.x idalib 的地道 Rust 绑定,通过安全的高层封装让开发者能用 Rust 驱动 IDA 内核进行程序分析和自动化处理。
Stars: 0 | Forks: 0
# idakit
适用于 IDA Pro `idalib` (9.x) 的地道 Rust 绑定。
`idakit` 封装了 IDA Pro 内核,因此你可以通过安全的 Rust 来驱动分析过程。它包含两个 crate:
- **`idakit-sys`** —— 原始的 FFI:一个小型的 C++ 外观模式(`facade/idakit_facade.{cpp,H}`),将 C++ SDK 封装为干净的 C ABI 暴露出来,并包含对 `libida.so` / `libidalib.so` 已导出的未混淆(unmangled)符号的直接 `extern "C"` 绑定。
- **`idakit`** —— 地道(符合 Rust 惯用法)的封装层:`Ida::here` 会在当前线程启动内核,供直接、无需闭包的使用;而 `Ida::run` + `Ida::call` 则将其托管在一个专用线程上,适用于 GUI/异步/多线程调用者。`Idb`(打开的数据库)是 `!Send` 的,因此它会一直留在拥有内核的线程上。
## 运行模型
IDA 内核是单线程且线程亲和(thread-affine)的——它必须由初始化它的那个线程来驱动。打开的数据库 `Idb` 是 `!Send + !Sync` 的:读取操作借用 `&Idb` 并返回轻量级的视图(`Func`、`Segment` 等),写入操作则获取 `&mut Idb`,因此借用检查器(borrow checker)会防止读视图的生命周期超过修改操作。
如果你的程序拥有自己的线程——例如脚本、测试或 CLI——`Ida::here` 会在当前线程启动内核,并直接交回数据库。无需内核线程,也无需闭包:
```
let mut idb = idakit::Ida::here()?;
idb.open("/path/to/db.i64").call()?;
for func in idb.functions() {
println!("{:#x} {}", func.ea().get(), func.name().unwrap_or_default());
}
idb.close(false);
```
当当前线程必须保持空闲(例如 GUI 事件循环、异步 runtime),或者当多个线程需要驱动内核时,`Ida::run` 会生成一个专用的内核线程,并在调用线程上运行你的应用;任何线程都可以通过 `Ida::call` 将任务调度到内核上:
```
use idakit::{Ida, Idb};
Ida::run(|ida| {
ida.call(|idb: &mut Idb| -> idakit::Result<()> {
idb.open("/path/to/db.i64").call()?;
for func in idb.functions() {
println!("{:#x} {}", func.ea().get(), func.name().unwrap_or_default());
}
idb.close(false);
Ok(())
})?
})??;
```
内核是一个进程级别的全局对象,因此这两种方式是互斥的:同一时间只能有一个 `Idb` 处于活动状态(在第一个被 drop 之前,第二次调用 `here`/`run` 会返回 `InitError::AlreadyRunning`)。
## 编译说明
你需要自备已授权的 IDA 安装——`idakit` 会链接它,但本项目中绝不会提供该程序。
- **`IDADIR`** —— 你的 IDA 安装目录,包含 `libida.so`(默认为 `~/ida-pro-9.3`)。
- **SDK 头文件** —— 编译过程中会根据公开的 IDA SDK 头文件([`HexRaysSA/ida-sdk`](https://github.com/HexRaysSA/ida-sdk))对外观模式进行编译。它会检测你安装的 IDA 版本,并将匹配的发布标签拉取到本地缓存中(需要 `git`)。无需额外的标志;这些头文件始终会与你链接的 runtime 保持一致。
- **`IDA_SDK_DIR`** *(可选)* —— 指向本地的 SDK 检出版,以跳过拉取过程(用于离线编译、CI)。**`IDA_SDK_CACHE_DIR`** *(可选)* —— 重定向拉取缓存的位置。
数据库必须是 64 位的 `.i64` —— 外观模式在编译时使用了 `__EA64__`。
最低支持的 Rust 版本为 **1.88**。
## 许可证
MIT(指这些绑定代码)。IDA SDK 及 runtime 归 Hex-Rays 专有,不包含在此处,也不会被重新分发;编译过程会根据你的请求从上游仓库获取公开的 SDK 头文件。
标签:IDA Pro, Rust, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 可视化界面, 绑定库, 网络流量审计, 逆向工程, 通知系统, 静态分析