klemmm/indyresolve

GitHub: klemmm/indyresolve

结合 DynamoRIO 动态追踪与 Binary Ninja 静态分析,自动解析二进制文件中间接跳转和调用的目标地址并回注到反编译视图中。

Stars: 9 | Forks: 1

# IndyResolve ![Demo](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/ecf6a7934f181219.gif) 在静态逆向工程分析二进制文件时,间接跳转或调用(vtable、函数指针、switch 表)往往令人十分头疼。 IndyResolve 是我编写的一个快速工具,旨在弥补动态分析和静态分析之间的差距。它使用 DynamoRIO 客户端在运行时追踪间接调用/跳转,并利用 Binary Ninja 插件来导入这些数据。它将解析出的目标地址直接修补到 Medium Level IL (MLIL) 中,从而让你的反编译结果更具实际意义,并且能够正常进行交叉引用。 ## 工作原理 该项目分为两部分: 1. **DynamoRIO 客户端 (`indyresolve.c`)**:你需要在它之下运行目标二进制文件。它会挂钩间接分支,查明它们的跳转目标,并在线程退出时将这些映射关系转储到 JSON 文件中。它能够智能地区分模块内部调用和外部库调用。 2. **Binary Ninja 插件 (`indyresolve.py`)**:你需要在 Binary Ninja 内部运行此插件。它会读取 JSON 文件,找到未解析的 MLIL 指令,并将其目标变量强制设置为常量值(如果该分支在运行时跳转到了多个位置,则设置为一组值)。它还会添加注释并关联间接分支。 ## 安装 首先,安装 DynamoRIO 并将 `DYNAMORIO_HOME` 环境变量设置为 DynamoRIO 的路径。 ``` export DYNAMORIO_HOME=/path/to/dynamorio ``` 然后,编译该项目: ``` mkdir build cd build cmake .. make ``` 这会构建 libindyresolve.so(DR 客户端)以及一个可用于测试的演示可执行文件。 你还需要将 `indyresolve.py` 文件复制到你的 Binary Ninja 插件文件夹中(在 Linux 上默认为 `$HOME/.binaryninja/plugins/`) ## 使用说明 ### 1. 追踪二进制文件(动态分析) 使用编译好的客户端,在 DynamoRIO 下运行你的目标可执行文件: ``` $DYNAMORIO_HOME/bin64/drrun -c /path/to/libindyresolve.so -- ./your_target ``` 当程序运行结束后,你应该会在当前目录中看到新生成的 JSON 文件(例如,/full/path/to/your_target.json)。如果拥有写入权限,客户端还会在各自加载的库文件夹中为每个加载的库创建 JSON 文件。 你可以多次运行程序(例如提供不同的用户输入),JSON 结果会被合并(而不是被覆盖)。如果想从零开始并“忘记”之前的运行结果,只需手动删除这些 JSON 文件即可。 ### 2. 导入到 Binary Ninja(静态分析) * 在 Binary Ninja 中打开目标二进制文件。 * 前往 Plugin -> Import indirect call database * 选择由 DynamoRIO 客户端生成的 .json 文件。 该插件将遍历二进制文件并更新分析结果。对于每一个间接调用或跳转,它都会设置用户自定义的数据流、注释以及用户分支,从而将跳转/调用点连接到它们的目标地址。 如果代码跳转到了外部库,请右键单击该指令并选择“Follow indirect external call/jump”。如果你在另一个 Binary Ninja 标签页中打开了该库,它会立即切换标签页并直接跳转到目标函数。 ## 测试 仓库中包含一个简单的 demo.c。如果你构建了这个项目,它就会被编译为 demo 程序。在 drrun 下运行它,然后在 Binary Ninja 中加载它,并导入生成的 JSON 文件,你会看到那个间接的 `f()` 调用被完美地解析了出来。 ## nginx 完整演示 nginx 因包含大量间接控制转移(包括对外部库的调用)而闻名。 以下是对 nginx 进行追踪并解析一系列间接控制转移(最终落入 `ngx_http_image_filter_module.so` 模块中)的完整演示。 https://github.com/user-attachments/assets/70dc73fd-236c-4ec6-aefe-f145e98b3b78 ## 改进建议 * 增加对其他架构或系统的支持(目前仅在 x86_64 / Linux 上进行了测试) * 增加对 Ghidra 等工具的支持 * 通过移除 clean-calls 来提升 DR 客户端的性能 * 尝试使用其他的插桩框架(如 QBDI 等)
标签:Bash脚本, Binary Ninja, DAST, DBI, DynamoRIO, MLIL, URL提取, Vtable分析, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 代码混淆, 动态二进制插桩, 反编译, 客户端加密, 恶意软件分析, 控制流分析, 插件, 逆向工具, 逆向工程, 间接调用, 静态分析