编译器的概念众所周知,它将高级语言编程的程序编译链接成二进制代码,运行于特定的平台上。反编译器刚好相反,它将特定平台的可执行程序,经过一系列转换,得到与源代码功能等效的某种高级语言代码。这种高级语言代码跟最初的源代码可以是不同类型的编程语言。比如,可以将用Fortan编写程序反编译成C语言表示。这一章主要从下面4个方面介绍反编译的相关技术:
1、编译与反编译
2、逆向工程与反编译
3、反汇编与反编译
4、反编译技术介绍
1、 编译与反编译
编译器和反编译器从广义上讲都是程序语言转换程序。前者将高级语言转换为低级语言,而后者将低级语言转换为高级语言。他们的诞生时间也相差不远:前者诞生于上世纪50年代,后者诞生于上世纪60年代。但到日前为止,它们的技术成熟度却相差甚远。前者已经成熟,而后者还存在很多难题尚未解决。
2、软件逆向工程与反编译
1、软件逆向工程简介
软件逆向工程指的是通过一系列技术手段,推导出软件的具体实现过程。比如,在没有源代码的情况下,要想知道某个可执行程序是如何实现的,就必须使用到软件逆向技术了。
软件逆向的应用主要有下面两个方面:
-
- 安全相关的逆向:可以用来逆向恶意软件,如木马、病毒,剖析其原理,做出相应的防御措施;也可以用于逆向非开源软件,审核其安全性。
- 软件开发过程的逆向:实现与专利软件的互操作、开发竞争软件和评估软件的质量及健壮性
2、常用软件逆向工具
软件逆向是一项艰苦卓越的工作,如果没有合适的工具,逆向是不可能实现的。到目前为止,常用的软件逆向工具主要分为反汇编器、调试器和反编译器三大类。
3、字节码反编译和机器码反编译
用高级语言编写的程序经编译器编译后可以生成两种不同类型的可执行程序。一种是由真正机器指令构成的,可直接运行。如C/C++编译生成的可执行文件;另外一种是由虚拟指令构成的,运行这类程序时需要专门的虚拟机平台解释执行,如Java和C#编译生成的可执行文件,就必须安装相应的虚拟机才能够运行。由丁运行时需要虚拟机将这些虚拟的机器指令翻译成真正的机器指令,因此,这些程序的运行速度相对较慢。由于是解释执行,这些程序具有平台无关性,不需任何修改就能移植到其他平台上。
因此,反编译技术可以分为两大类,一种是针对虚拟机进行的反编译,即基于字节码的反编译,另外一种是针对真正机器指令的反编译,即基于机器码的反编译。前者是针对虚拟机的反编译,后者是针对真实的反编译。
以 Microsoft公司的.NFT平台为例。这类程序被编译成一种中间语言--也称为字节码。这种中间语言被称为MSTI(Microsoft Intermediate Language,微软中间语言)。MSTL包含有源代码非常多的信息,如几乎所有符号的名字、所有数据结构的完整定义、所有对象的名字、数据成员和成员函数的名字。
因此,对于这类程序的反编译就显得非常容易。另外,由于最初源代码的符号信息都保留了下来,再加上其他细节信息,这类程序反编译出来的结果非常理想--反编译器生成的高级语言与最初源代码的相似度可以达到90%以上。由于.NET平台的程序的抗反编译能力极差,因此,这类程序在发布之前都进行了代码混淆,以此来添加反编译的难度。如Microsoft公司就在其.NET开发平台—Visual Studio .NET中提供了混淆器。
机器码反编译由于可执行程序中包含源代码的信息很少,反编译难度极大。本文所讨论的反编译技术只针对机器码来进行的,剩下章节不再对此进行说明。
4、反编译的合法性
随着知识产权的越来越受重视,反编译的合法性的讨论日益激烈。反编译支持者和反对者之间的争论目前依旧在进行中,支持方主张反编译工具的使用有利于公平竞争,反对方主张反编译侵犯了版权。
世界知识产权组织在《WIPO知识产权手册:政策、法律与使用》中认定:软件合法用户对软件进行反编译的行为,只要不利用所获取的信息开发相似的软件,并不会作权所有人正常使用软件冲突,也不会对著作权所有人的合法权益造成不合理的损
各国政府基本上都使用此原则对侵权案件进行审理,如美国、欧盟、中国的相关法律部门都认为:只要反编译并非以复制软件为目的,在实施反编译行为的过程中所涉及的复制只是一种中间过渡性的复制,反编译最终所达到的目的是使公众可以获得包含在软件中不受著作权保护的成分,这样的反编译并不会被认为是侵权。