2020 · 会议论文
无需控制流恢复的二进制重写
Binary Rewriting without Control Flow Recovery
E9Patch 对 x86-64 二进制进行静态重写:插入跳转到跳板代码的指令,而不移动其他任何指令,从而保留原有跳转目标集合,无需控制流恢复、符号化或调试信息。当五字节跳转放不下时,它通过指令双关、填充以及后继或邻近指令驱逐,使跳转与已有字节重叠,或把邻近指令移入各自的跳板;物理页分组则降低分散跳板带来的内存与文件体积开销。指令位置由独立的前端提供,评测中使用的是基础线性反汇编器。作者评测了 SPEC2006、Ubuntu 16.04 系统二进制以及超过 100 MB 的 Chrome 与 Firefox,并演示了二进制修复和基于低胖指针的堆写加固。
研究范围与局限
这是静态二进制重写与插桩,而非反编译或源码恢复。它依赖前端提供正确的指令位置与长度,假定被修补的代码不会被当作数据读取或自修改,并假定输入本身未使用重叠指令。各项策略都可能失败:约 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 二进制静态重写技术,可用于修补与插桩尚未恢复结构的二进制,与本节的提升及反编译研究互补。
发表与复核详情
- 发表载体
- PLDI 2020
- 发表状态
- 会议论文
- 出版/提交日期
- 2020 年 6 月 11 日
- 日期依据
- ACM 提交的 Crossref 元数据将印刷与在线出版日期均记为 2020-06-11,ACM 论文页面的存档副本显示相同日期。本条目不以论文所印 6 月 15–20 日的 PLDI 会议日期替代。
- DOI
- 10.1145/3385412.3385972
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 论文评测的原型有显著改进,包括新的优化、改进的物理页分组以及略有提高的覆盖率。本次未运行代码或实验。
来源复核于
本合集仅做来源复核,未重新运行论文实验。请通过原始论文或 BibTeX 引用原作者。
相关条目
依据相同的代码仓库或论文标识关联。
- E9Patch 静态二进制重写工具 精选资源
一手来源
- https://dl.acm.org/doi/10.1145/3385412.3385972
- https://web.archive.org/web/20251215175156/https://dl.acm.org/doi/10.1145/3385412.3385972
- https://api.crossref.org/works/10.1145/3385412.3385972
- https://comp.nus.edu.sg/~gregory/papers/e9patch.pdf
- README.md GitHub · GJDuck/e9patch · 修订 682ab1f
- LICENSE GitHub · GJDuck/e9patch · 修订 682ab1f