欢迎对本blog相关主题感兴趣的团体或单位转载相关文章,但转载时请注明出处。谢谢!
一、概述
首先应该声明的是,这里讨论的反编译是针对二进制可执行程序进行的静态反向编译操作。虽然对于类似Java Bytecode和MSIL的虚拟机中间代码的反编译与这里讨论的内容有很大相关,但本文还是强调所针对的对象,即编译为本地机器指令码的反编译操作。另外,文中提到的方法主要还是针对过程式语言,比如C和Fortran等,对于面向对象语言编写的程序进行反编译来说,路还有很长。
其实很长一段时间内,有着相当数量的人怀疑反编译的可行性。毕竟编译器在对程序代码进行操作的时候丢弃了大量的源代码信息,例如程序变量名称、高级数据类型声明信息(结构体、数组、类等等)。因此,严格意义上来说,试图从可执行程序逆向恢复出100%的源代码形式是不太可能的。但是反编译的历史几乎和编译理论研究的历史相当,按照澳大利亚昆士兰大学相关描述的说法,第一个反编译器出自1960年。其实从某个角度来讲,当今世界比较前沿的反编译研究更多集中在两个方面:一是对可执行程序进行语义化;一是针对某种相对更高级的语言形式(通常是C语言)进行特性恢复。
二、可执行程序的语义化
首先谈谈语义化操作。我们知道机器在执行程序的时候只能够识别文件中存在的二进制指令,但我们也得承认,对二进制指令进行分析和操作是相当繁琐的。通常的软件逆向分析方法主要基于反汇编操作,即根据体系结构手册中的指令格式描述,将二进制指令一一映射到该体