# 无需控制流恢复的二进制重写

> E9Patch 对 x86-64 二进制进行静态重写：插入跳转到跳板代码的指令，而不移动其他任何指令，从而保留原有跳转目标集合，无需控制流恢复、符号化或调试信息。当五字节跳转放不下时，它通过指令双关、填充以及后继或邻近指令驱逐，使跳转与已有字节重叠，或把邻近指令移入各自的跳板；物理页分组则降低分散跳板带来的内存与文件体积开销。指令位置由独立的前端提供，评测中使用的是基础线性反汇编器。作者评测了 SPEC2006、Ubuntu 16.04 系统二进制以及超过 100 MB 的 Chrome 与 Firefox，并演示了二进制修复和基于低胖指针的堆写加固。

- 作者：Gregory J. Duck; Xiang Gao; Abhik Roychoudhury
- 原标题：Binary Rewriting without Control Flow Recovery
- 发表载体：PLDI 2020
- 发表状态：会议论文
- 出版／提交日期：2020 年 6 月 11 日
- 日期依据：ACM 提交的 Crossref 元数据将印刷与在线出版日期均记为 2020-06-11，ACM 论文页面的存档副本显示相同日期。本条目不以论文所印 6 月 15–20 日的 PLDI 会议日期替代。
- DOI：10.1145/3385412.3385972
- 来源复核于：2026-10-19
- 收录于：2026-11-02
- 原始论文：<https://dl.acm.org/doi/10.1145/3385412.3385972>
- PDF：<https://comp.nus.edu.sg/~gregory/papers/e9patch.pdf>
- 代码：<https://github.com/GJDuck/e9patch>
- BibTeX：<https://awesomerea.org/papers/citations/paper-e9patch.bib>
- 目录页面：<https://awesomerea.org/zh/papers/paper-e9patch/>
- 记录 JSON：<https://awesomerea.org/papers/paper-e9patch/record.json>
- 英文版：[English](https://awesomerea.org/papers/paper-e9patch/index.md)

## 研究范围与局限

这是静态二进制重写与插桩，而非反编译或源码恢复。它依赖前端提供正确的指令位置与长度，假定被修补的代码不会被当作数据读取或自修改，并假定输入本身未使用重叠指令。各项策略都可能失败：约 1,050 万个修补位置中有 1,098 个未能修补；仅用基线方法时，跳转指令覆盖率为 72.79%，堆写指令为 81.63%；非 PIE 二进制比 PIE 更难处理。由于 Chrome 的代码段混有数据，需从 ChromeMain 之后开始反汇编；Firefox 的代码则在 libxul.so 中修补。报告的开销（例如对堆写指令插桩后，在 Dromaeo DOM 基准上 Chrome 约 113%、Firefox 约 46%）是用 PLDI 原型测得的，SPEC2006 以 GCC 非 PIE 模式编译；这些数据不代表当前版本。

## 与本合集的关联

补充一种不依赖控制流的剥离符号 x86-64 二进制静态重写技术，可用于修补与插桩尚未恢复结构的二进制，与本节的提升及反编译研究互补。

## 发表与复核说明

Crossref 与 ACM 页面存档给出三位作者、PLDI 2020 论文集及第 151–163 页；ACM 元数据采用句首大写。PDF 为 Gregory J. Duck 在 NUS 页面上提供的 13 页作者版本，仓库 README 亦链接此文件，版本记录以 ACM 页面为准。所审阅的 2026-06-28 仓库提交说明其适用于 x86_64 Linux ELF 可执行文件与共享库，采用 GPL-3.0，部分文件采用 MIT 许可，并说明当前版本相较 PLDI 论文评测的原型有显著改进，包括新的优化、改进的物理页分组以及略有提高的覆盖率。

## 一手来源

1. <https://dl.acm.org/doi/10.1145/3385412.3385972>
2. <https://web.archive.org/web/20251215175156/https://dl.acm.org/doi/10.1145/3385412.3385972>
3. <https://api.crossref.org/works/10.1145/3385412.3385972>
4. <https://comp.nus.edu.sg/~gregory/papers/e9patch.pdf>
5. <https://github.com/GJDuck/e9patch/blob/682ab1f7f0480aa45edf1fd94457e5ee2dd01043/README.md>
6. <https://github.com/GJDuck/e9patch/blob/682ab1f7f0480aa45edf1fd94457e5ee2dd01043/LICENSE>

## 相关条目

- [E9Patch 静态二进制重写工具](https://awesomerea.org/zh/resources/e9patch/index.md) · 精选资源

## 关于此条目

已依据论文及一手来源复核。请通过原始论文或 BibTeX 引用原作者。
原创说明采用 MIT 许可；外部项目、论文与素材保留各自的权利和许可。
