GJDuck/e9patch
GitHub: GJDuck/e9patch
E9Patch 是一款无需源码和控制流恢复的 x86_64 Linux ELF 二进制静态重写工具,可在秒级完成对大型复杂程序的指令级插桩与补丁。
Stars: 1096 | Forks: 68
E9Patch - A Powerful Static Binary Rewriter
E9Patch 是一个强大的 `x86_64` Linux ELF 二进制文件静态重写工具。
E9Patch 具有:
* *可扩展*:E9Patch 可以可靠地重写大型/复杂的二进制文件,包括网页浏览器(大小超过 100MB)。
* *兼容性好*:重写后的二进制文件是原始文件的直接替代品,无需额外的依赖项。
* *速度快*:E9Patch 可以在几秒钟内重写大多数二进制文件。
* *低开销*:性能和内存开销都很低。
* *可编程*:E9Patch 的设计使其可以轻松集成到其他项目中。
有关更多信息,请参阅 [E9Tool 用户指南](https://github.com/GJDuck/e9patch/blob/master/doc/e9tool-user-guide.md)和 [E9Patch 程序员指南](https://github.com/GJDuck/e9patch/blob/master/doc/e9patch-programming-guide.md)。
*静态二进制重写* 接受一个输入二进制文件(ELF 可执行文件或共享对象),并生成一个应用了某些补丁/修改的输出二进制文件。
打补丁后的二进制文件可以作为原始文件的直接替代品使用。
## 发布
预构建的 E9Patch 二进制文件可以在此处下载:
* [https://github.com/GJDuck/e9patch/releases](https://github.com/GJDuck/e9patch/releases)
## 构建
构建 E9Patch 非常简单:只需运行 `build.sh` 脚本。
这将自动构建两个工具:
1. `e9patch`:二进制重写器后端;以及
2. `e9tool`:E9Patch 的线性反汇编前端。
## 用法示例
E9Patch 通过 E9Tool 前端使用。
例如,要为 `xterm` 中的所有 `xor` 指令添加指令打印插桩,我们可以使用以下命令:
```
$ ./e9tool -M 'asm=/xor.*/' -P print xterm
```
这将生成一个修改后的 `xterm` 版本,写入到 `a.out` 文件中。
修改后的 `xterm` 可以正常运行,但会将每条执行的 `xor` 指令的汇编字符串打印到 `stderr`:
```
$ ./a.out
xorl %ebp, %ebp
xorl %ebx, %ebx
xorl %eax, %eax
xorl %edx, %edx
xorl %edi, %edi
...
```
有关支持的选项和模式的完整列表,请参阅:
```
$ ./e9tool --help
```
## 项目
其他一些使用 E9Patch 的项目包括:
* [RedFat](https://github.com/GJDuck/RedFat):基于[低脂指针 (low-fat pointers)](https://github.com/GJDuck/LowFat)的二进制加固系统。
* [E9AFL](https://github.com/GJDuck/e9afl):自动将 [AFL](https://github.com/google/AFL) 插桩插入二进制文件中。
* [E9Syscall](https://github.com/GJDuck/e9syscall):通过对 `libc.so` 进行静态二进制重写来实现系统调用拦截。
* [Hopper](https://github.com/FuzzAnything/hopper):自动为库生成模糊测试用例。
* [EnvFuzz](https://github.com/GJDuck/EnvFuzz):程序环境模糊测试。
* [RFF](https://github.com/dylanjwolff/RFF):用于并发测试的灰盒模糊测试。
* [AutoTrace](https://github.com/GJDuck/AutoTrace):简单的基于源代码行的追踪。
## 文档
E9Patch 是一个底层工具,旨在可集成到其他项目中。
欲了解更多信息,请参阅以下文档:
* [E9Patch 程序员指南](https://github.com/GJDuck/e9patch/blob/master/doc/e9patch-programming-guide.md)
* [E9Tool 用户指南](https://github.com/GJDuck/e9patch/blob/master/doc/e9tool-user-guide.md)
## 错误
可以在此处报告错误:
* [https://github.com/GJDuck/e9patch/issues](https://github.com/GJDuck/e9patch/issues)
## 版本
与 PLDI'2020 论文中评估的原始原型相比,当前版本的 E9Patch 有了显著改进。
具体来说:
* 当前版本实现了多项新的优化,可以生成速度显著更快的二进制文件,有时可提高 2 倍。
要启用新的优化,请向 E9Tool 传递 `-O2` 选项。
* *物理页面分组 (Physical Page Grouping)* 空间优化的实现也已得到改进。
* 补丁覆盖率也略有提高。
* 实现了许多新功能(请参阅文档)。
## 许可证
本软件已根据 GNU 公共许可证 (GPL) 第 3 版发布。
某些特定文件根据 MIT 许可证发布(请查看文件前言)。
## 出版物
有关更多信息,请参阅我们的 PLDI'2020 论文:
* Gregory J. Duck, Xiang Gao, Abhik Roychoudhury, [Binary Rewriting without Control Flow Recovery](https://comp.nus.edu.sg/~gregory/papers/e9patch.pdf), Programming Language Design and Implementation (PLDI), 2020.
* [PLDI'2020 Youtube 演讲视频](https://www.youtube.com/watch?v=qK2ZCEStoG0)
请按如下方式引用我们的论文:
@inproceedings{e9patch,
author = {Duck, Gregory J. and Gao, Xiang and Roychoudhury, Abhik},
title = {Binary rewriting without control flow recovery},
year = {2020},
publisher = {Association for Computing Machinery},
url = {https://doi.org/10.1145/3385412.3385972},
doi = {10.1145/3385412.3385972},
booktitle = {Programming Language Design and Implementation (PLDI)}
}
## 致谢
这项工作部分得到了可信赖软件系统国家卓越研究中心的支持,该中心由国家研究基金会 在国家网络安全研发 计划下资助。标签:E9Patch, Linux ELF, TLS配置检查, x86_64, 二进制修改, 二进制分析, 二进制安全, 二进制插桩, 云安全监控, 云安全运维, 云资产清单, 代码修补, 可配置连接, 客户端加密, 客户端加密, 底层安全, 插桩工具, 无源码修改, 程序分析, 逆向工程, 静态二进制重写, 静态分析