逆向工程(reverse engineering)大意是根据已有的东西和结果,通过分析来推导出具体的实现方法。比如你看到别人写的某个exe程序能够做出某种漂亮的动画效果,你通过反汇编、反编译和动态跟踪等方法,分析出其动画效果的实现过程,这种行为就是逆向工程;不仅仅是反编译,而且还要推倒出设计,并且文档化,逆向软件工程的目的是使软件得以维护。
“逆向工程”这个词用在软件上时,对不同的人有不同的意思,Chikofsky和Cross为那些用法写了一个研究报告并定义了一个分类系统。报告里说:
逆向工程是这样一个过程:对系统进行分析,在高一级的抽象层次描述系统。它也可被看作“开发周期的逆行”。在这个模式里,实现阶段的输出(源代码形式的)被逆向工程回分析阶段,与传统的瀑布模型正相反。逆向工程只不过是一个检测的过程:软件系统不被修改(否则就成了软件重构)。软件防修改技术被用于防止有版权的软件和软件推动的系统被逆向工程或软件重构。实际应用中出现了两类逆向工程。第一种,软件的源代码可用,但是更高层次的部分几乎没有描述文档或者描述文档不再适用或者丢失。第二种,软件没有可用的源代码,任何能找到它的源代码的努力都被称为逆向工程。大部分人都熟悉这个词的第二种用法。软件的逆向工程可以使用净室技术避免侵犯版权。
软件工程中的黑盒测试与逆向工程有很多相同之处。测试者通常使用API,但是他们的目标是从外部找出漏洞和未归档特性。
逆向工程的其他目的包括:安全审查, 移除版权保护(破解),规避消费电子中的访问限制,定制嵌入式系统(例如引擎管理系统),内部修补或更新,给功能不全的廉价硬件(例如某些显卡芯片组)增加功能,或者仅仅是为了满足好奇心。
这个过程也被称为“逆向编码工程”或RCE。例如,可以用Jad对Java平台的字节码程序进行反编译。一个著名的逆向工程案例就是第一个非-IBM实现的PCBIOS。这个BIOS促始了历史性的IBM PC兼容工业,IBM PC兼容机多年来一直是具有压倒性优势的计算机硬件平台。一个以逆向工程为兴趣的团体的例子就是CORE,Challenge Of Reverse Engineering的缩写,意思是“逆向工程的挑战”。在美国,《千禧年数字版权法案》(Digital Millennium Copyright Act(DMCA))对以文件格式或协议的交互性为目的的逆向工程的某些活动不予禁止,但是在一些关键案例中法官忽视了此法令,因为使用时不受限制是可以接受的,访问时不行。在美国软件逆向工程受到版权法中公平使用例外的保护。Samba软件使运行非Microsoft Windows的系统可以与运行Microsoft Windows的系统共享文件。它是一个经典的软件逆向工程,因为有关Windows文件是如何进行共享的信息并没有公开,Samba项目需要对这些未公开信息进行逆向工程,以便非-Windows计算机模拟Windows文件共享。Wine项目对Windows API做了同样的工作,OpenOffice.org是对Microsoft Office文件格式做逆向工程的一部分。ReactOS项目的目标更为远大,它努力提供Windows操作系统NT分支的二进制兼容性(ABI and API),以便让Windows编写的软件和驱动可以运行在干净的逆向工程GPL开源复本空间中。
软件的逆向工程可以用多种方法实现,主要的三类软件逆向工程是:
1、通过观察信息交换进行分析。主要流行于对协议做逆向工程,它使用总线分析器和数据包嗅探器,例如,为了访问一个总线连接或一个计算机网络连接并揭示其上的通信数据就可以使用这种方法。通过分析总线或网络的活动,做出一个独立的实现用以模拟那些活动。此法对设备驱动的逆向工程特别有用。在进行嵌入式系统的逆向工程时,厂商特意引进的工具有时能产生极大的促进作用,例如JTAG端口或其他的调试法。在Microsoft Windows中,底层的调试器很受欢迎,例如SoftICE。
2、使用反汇编器进行反汇编。仅借助机器码助记符读取和理解已经被编译成原始机器码的程序。此法对任何计算机程序都有效,但是相当耗时,特别是对于不熟悉机器码的人。Interactive Disassembler是一个很受欢迎的反汇编工具。
3、使用反编译器进行反编译。对只有机器码或字节码形式的程序,重建高级语言形式的源代码。这种方法得到的源代码结果不是唯一的。 |