工具

E9Patch 静态二进制重写工具

面向 x86-64 Linux ELF 可执行文件和共享库的静态二进制重写工具,无需恢复控制流即可插入插桩代码,并生成可直接替换原文件的二进制,方法源自 PLDI 2020 论文 Binary Rewriting without Control Flow Recovery。前端 e9tool 用一套基于反汇编属性的匹配语言选择指令,再通过内置跳板、调用以 e9compile.sh 编译的 C/C++ 函数或手写的插件跳板进行修补;后端 e9patch 接收 JSON-RPC 命令,便于其他工具调用。可选模式包括借助启发式控制流恢复获得更快的重写结果,或借助 SIGILL 回退实现完全的修补覆盖。

使用条件与局限

  • 审阅时最新版本为 v1.0.1,发布于 2026-06-22,提供 amd64 Debian 软件包;此前 1.0.0 的候选版本一直发布到 rc10(2025-04-16),v1.0.0 于 2026-03-01 发布。所审阅的 master 提交(2026-06-28)比 v1.0.1 多一个提交,修复了跳板模板条目为空时的未定义行为,其 VERSION 文件为 1.0.1。
  • build.sh 在检查 gcc、g++、make、binutils、xxd、markdown 和 zlib 头文件后构建 e9patch 与 e9tool,并提示对应的 Debian/Ubuntu 软件包名;Zydis 与 libdw 以源码形式随附在 contrib 目录下。修补函数需用 e9compile.sh 以 gcc 和独立环境(freestanding)编译选项编译。README 面向 x86_64 Linux;源码中另有 PE 处理代码和一个自称概念验证的 Windows 示例,但使用指南未作说明。
  • 输入为用户自己的 ELF 可执行文件或共享库,默认输出到 a.out 或 a.so。指南指出内置的线性反汇编器可能错误处理代码与数据混杂的二进制,因此支持通过 --use-disasm 和 --use-targets 读入其他分析工具生成的 CSV 文件。CFR 模式基于启发式,稳健性较低;在 -100 模式下,被重写的程序自行安装 SIGILL 处理函数时会以 ENOSYS 失败。
  • GPL-3.0 许可证,examples/stdlib.c 等个别文件按其文件头声明采用 MIT。README 中关于可扩展性、速度和开销的说法(包括重写超过 100 MB 的网页浏览器)未经测试,其列出的下游项目也未审阅。本次未重写任何二进制。

关于此条目

类型
工具
类别
调试与动态分析
关联
基础工具
目标
二进制

来源复核于

说明已依据一手来源复核;这不代表已运行验证、经过安全审计或确认兼容。

一手来源

  1. README.md GitHub · GJDuck/e9patch · 修订 682ab1f
  2. doc/e9tool-user-guide.md GitHub · GJDuck/e9patch · 修订 682ab1f
  3. doc/e9patch-programming-guide.md GitHub · GJDuck/e9patch · 修订 682ab1f
  4. build.sh GitHub · GJDuck/e9patch · 修订 682ab1f
  5. e9compile.sh GitHub · GJDuck/e9patch · 修订 682ab1f
  6. examples/win64_demo.c GitHub · GJDuck/e9patch · 修订 682ab1f
  7. examples/stdlib.c GitHub · GJDuck/e9patch · 修订 682ab1f
  8. contrib GitHub · GJDuck/e9patch · 修订 682ab1f
  9. LICENSE GitHub · GJDuck/e9patch · 修订 682ab1f
  10. https://github.com/GJDuck/e9patch/releases/tag/v1.0.1
  11. https://github.com/GJDuck/e9patch/compare/v1.0.1...682ab1f7f0480aa45edf1fd94457e5ee2dd01043