摘要
本论文提出逆向编译器或反编译器的编写技术。这些技术基于编译器和优化理论,并以独特的方式应用于反编译;这些技术以前从未被公开发表。
反编译器由几个阶段组成,即被组织成与语言或机器特征相关的几个模块。前端是一个机器依赖的模块,句法分析二进制程序、分析其指令的语义、并且生成该程序的低级中间表示法和每一子程序的控制流向图。通用的反编译机器是一个与语言和机器无关的模块,分析低级中间代码,将它转换成对任何高级语言都可接受的高级表示法,并且分析控制流向图的结构、把它们转换成用高级控制结构表现的图。最后,后端是一个目标语言依赖的模块,生成目标语言代码。
反编译的过程中要使用一些工具:把二进制程序装入内存,对这一程序做句法分析或反汇编,以及反编译或者分析该程序来生成高级语言程序。这个过程借助编译器和库的签名来识别特定的编译器和库子程序。只要在二进制程序中识别出编译器签名,就不去反编译这些编译器启动代码(start-up) 和库子程序:对于前者,从最后的目标程序去掉启动代码的那些例程,反编译器从主(main) 程序入口点开始分析;对于后者,那些子程序用其库函数名代替。
所提出的技术在一个适用于 Intel i80286 体系结构的反编译器(原型) 样机上得以实现,该样机名为 dcc,在 DOS 操作系统下运行,为输入源的.exe 文件或.com 文件产生目标 C 程序。在第 9 章,将反编译输出的程序同它最初的高级语言程序做了采样比较,并且对反编译结果做出一个分析。
第 1 章从编译器角度对反编译做一介绍,第 2 章从 20 世纪 60 年代早期反编译出现开始介绍它的历史概况,第 3 章介绍源二进制程序的静态二进制代码和在运行时间实现程序的动作之间的关系,第 4 章描述前端模块这个阶段,第 5 章详细说明用来分析中间代码的数据优化技术,把中间代码转换成一个更高级的表示法,第 6 章详细说明用来分析控制流向图结构的控制结构转换技术,把控制流向图转换成一个高级控制结构的图,第 7 章描述后端模块,第 8 章介绍反编译工具程序,第 9 章综述 dcc 的实现以及取得的成果,第 10 章给出结论以及这项研究的工作前景。
本论文有些部分已经公开发表或者提交给国际定期刊物。两篇文章在 1993 年出现在第 19 号《拉丁美洲信息会议》(XIX 'Conferencia Latinoamericana de Informatica'):“一个反编译方法学”[CG93] 和“反编译使用的一个结构化的算法”[Cif93]。前一篇文章提出反编译的阶段(如第 1 章第 1.3 节所述)、前端(第 4 章)、控制流分析阶段的初始工作(第 6 章)、以及 dcc 工作实现的说明。后一篇文章提出控制流分析阶段使用的结构化的算法(第 6 章)。一篇刊物文章“二进制程序的反编译”[CG94] 已经被《软件-实践与经验》(Software - Practice & Experience) 接受发表;这篇文章概述建立一个反编译器所使用的技术(第 4,5,6,7 章的摘要)、在反编译过程中如何借助签名生成器工具(第 8 章第 8.2 节)、以及用 dcc 反编译的一个程序样本(第 9 章)。有两篇文章目前正考虑在国际刊物上发表。“子过程之间数据流的反编译”[Cif94a]被提交给《程序语言杂志》(the Journal of Programming Languages),文中完整描述了数据流分析器的优化操作,把低级的中间代码转换成一个高级的表示法。“结构化反编译图”[Cif94b] 被提交给《计算机杂志》(The Computer Journal),文中给出结构化控制流向图的最后的改进方法,以及用 dcc 反编译的一个程序样本。
本论文提出的技术更充分地拓展文献中前人的工作。关于为了确定寄存器参数和寄存器返回值所需要做的子过程寄存器分析、为了清除掉有关栈的指令(即 push 和 pop) 所需要的分析、以及控制结构类集之结构化,过去没有相关的反编译研究文献。这次研究做的创新性工作在第 5,6,8 章描述。第 5 章第 5.2 节、第 5.4 节举例并且描述九种不同类型的优化,将低级中间代码转换成高级表示法。这些优化考虑条件码、子程序调用(即,子过程之间的分析) 和寄存器漏出(spill),清除掉中间指令的所有低级特征(比如条件码和寄存器),而且把高级概念之表达式引入中间表示法。第 6 章第 6.2 节、第 6.6 节举例并且描述将各种不同类型的循环和条件转移包括多分支条件(例如 case 语句) 结构化的算法。在这个领域中前人的工作成果主要集中在循环的结构化,很少文章尝试二路(2-way) 条件分支的结构化,而对于多路条件分支则没有研究说明。本论文提出一个完整的方法,基于一个预先确定的、一般化的高级控制结构集合(类集),对所有类型的结构进行结构化。在第 6 章第 6.4 节给出一个确定一般化的控制结构的集合(类集) 的标准。第 8 章描述反编译程序使用的全部工具,最重要工具是签名生成器(第 8.2 节),它用于在操作系统不共享库的体系结构下确定编译器和库的签名,比如 DOS 操作系统。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论