本文由月光下的紫眸贡献
逆向编译技术
逆向编译技术
原文:Reverse Compilation Techniques
作者:Cristina Cifuentes
下载:.au/~cristina/dcc.html
翻译:月中人 【】
时间:2007-5-1
摘要
本论文提出逆向编译器或反编译器的编写技术。这些技术基于编译器和优化理论
,并以独特的方式应用于反编译;这些技术以前从未被公开发表。
反编译器由几个阶段组成,即被组织成与语言或机器特征相关的几个模块。前端
是一个机器依赖的模块,句法分析二进制程序、分析其指令的语义、并且生成该程序
的低级中间表示法和每一子程序的控制流向图。通用的反编译机器是一个与语言和机
器无关的模块,分析低级中间代码,将它转换成对任何高级语言都可接受的高级表示
法,并且分析控制流向图的结构、把它们转换成用高级控制结构表现的图。最后,后
端是一个目标语言依赖的模块,生成目标语言代码。
反编译的过程中要使用一些工具:把二进制程序装入内存,对这一程序做句法分
析或反汇编,以及反编译或者分析该程序来生成高级语言程序。这个过程借助编译器
和库的签名来识别特定的编译器和库子程序。只要在二进制程序中识别出编译器签名
,就不去反编译这些编译器启动代码(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年出现
ca'):“一个反编译方法学”[CG93] 和“反编译使用的一个结构化的算法”[Cif93]
。前一篇文章提出反编译的阶段(如第1章第1.3节所述)、前端(第4章)、控制流分析阶
段的初始工作(第6章)、以及dcc工作实现的说明。后一篇文章提出控制流分析阶段使
用的结构化的算法(第6章)。一篇刊物文章“二进制程序的反编译”[CG94] 已经被《
立一个反编译器所使用的技术(第4,5,6,7章的摘要)、在反编译过程中如何借助签名生
成器工具(第8章第8.2节)、以及用dcc反编译的一个程序样本(第9章)。有两篇文章目
前正考虑在国际刊物上发表。“子过程之间数据流的反编译”[Cif94a]被提交给《程
析器的优化操作,把低级的中间代码转换成一个高级的表示法。“结构化反编译图”
向图的最后的改进方法,以及用dcc反编译的一个程序样本。
本论文提出的技术更充分地拓展文献中前人的工作。关于为了确定寄存器参数和
寄存器返回值所需要做的子过程寄存器分析、为了清除掉有关栈的指令(即push和pop
)所需要的分析、以及控制结构类集之结构化,过去没有相关的反编译研究文献。这次
研究做的创新性工作在第5,6,8章描述。第5章第5.2节、第5.4节举例并且描述九种不
page 1
同类型的优化,将低级中间代码转换成高级表示法。这些优化考虑条件码、子程序调
用(即,子过程之间的分析)和寄存器漏出(spill),清除掉中间指令的所有低级特征(
比如条件码和寄存器),而且把高级概念之表达式引入中间表示法。第6章第6.2节、第
6.6节举例并且描述将各种不同类型的循环和条件转移包括多分支条件(例如case语句
)结构化的算法。在这个领域中前人的工作成果主要集中在循环的结构化