一提“破解”、“逆向”等词汇,大家定然众口芬芸,莫衷一是,原因就是我们对其概念和历史并不知晓,换言之,我们大多数人现在只知其然,不知其所以然。当然大家最关心的法律问题更是知之甚少了。
软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等[1]。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为软件逆向工程技术。
现实中,人们并不总是完全需要逆向出目标软件的所有功能,如果那样的话将会是一个艰苦而漫长的过程。大多数情况下是意图通过对软件进行逆向,从中获取软件的算法,或破解软件及进行功能扩展等。
软件逆向工程最早是作为软件维护的一部分出现的。早在 20 世纪 60 年代,随着第三代计算机的产生,为了挽救大量运行在即将报废的第二代计算机上的软件,同时也为加速开发第三代计算机上的软件,美国开始研制针对特定软件的专门用途的逆编译工具来进行软件移植,并成功转换了许多优秀软件。这些逆编译工具中大量使用了软件逆向工程中的技术方法。此后软件逆向工程技术逐步被各国所认识,并广泛研究和应用到多个软件技术领域中。
在国外,CMU SEI 成立了专门的再工程中心,致力于通过软件逆向工程进行程序理解技术的标识、增强和实践推广。20 世纪 80 年代,个人计算机兼容市场爆发性发展的很大一部分原因就是对 IBM PC 机的 BIOS 软件进行了逆向工程,而芯片制造商 Cyrix 和 AMD 对 Intel 的微处理器进行逆向工程后,开发出了与之相兼容的芯片。
Chikofs 等人于 1993 年发起的逆向工程会议每年举行一次,研究和讨论软件逆向工程的问题、技术及其支持工具。大量的研究成果都集中在程序理解的辅助工具上,例如,IBM 日本研究员研制的基于知识的代码理解工具 PROMPTER、美国 Yale 大学计算机系研制的对 Pascal 语言进行联机分析和理解的工具 PROUST等。
80 年代后期到 90 年代,关于解决软件逆向工程和软件版权的矛盾基本上有了结果,各国纷纷针对软件逆向工程进行立法,不是约束而是规范该领域的研究工作。根据美国联邦法律,对拥有版权的软件进行逆向工程操作如反汇编,若不是研制新产品与之竞争或获取非法利益,则所进行的逆向操作是合法的[PamelaSamuelson 1990]。日本也立法规定软件逆向工程是合法的,理由是它有利于软件应用人员之间的相互交流[[RohanMishral 997],英国政府 1992 年也修改了于1988 年颁布的软件版权法[[SingletonS 1993],该法律允许为了研究和个人学习目的而对程序逆向工程。从此,逆向工程的研究有了法律保障。
就在 80 年代国外逆编译研究相对沉寂之时,国内关于这方面的研究却如火如荼。如北京大学以杨芙清院士为首开发的“青鸟软件生产线系统”中的青鸟逆向工程工具是其中一项具有实质性的成果。它可以针对 C++语言,采用增量分析技术静态分析源程序代码,用 EER (enhancedentity-relationship)为 C++程序建立概念模型并抽取程序信息,将信息保存在数据库中,按照不同的用户需求组织程序信息,辅助用户理解 C++程序,逆向生成源程序的 OOD (Object Oriented Design)文档,为用户进一步提取构件构架提供帮助。合肥工业大学微机所展开了用手工方法对 UNIX 操作系统进行逆向工程研究。1984 年在国家自然科学基金资助下,研究 DUAL 68000 机器上的 C 语言逆编译系统,开发成功了 68000C 逆编译系统,获国家机电工业部科技进步二等奖。此外,还有北京信息学院、上海交通大学、中科院计算所、辽宁大学、武汉大学、重庆大学、北京控制工程研究所等,其中上海交通大学在 VAX 机上实现了一个 U 语言逆编译系统[HouWY 1992],北京控制工程研究所在 PC 机上实现一个 U 语言逆编译系统〔LiJ1991,但这两个系统均没有达到实用程度。
近几年来,国内许多软件公司相继开展了软件逆向工程的研究,针对网络游戏的外挂产业的日益壮大就是软件逆向工程发展的最好见证。电子工业出版社的《加密与解密》等系统丛书,看雪论坛等都为我国软件逆向工程的发展作出了贡献。
2007 年 1 月 17 日,最高人民法院发布的第一个涉及不正当竞争案件审理的司法解释明确指出:通过自行开发研制或者反向工程等方式获得的商业秘密,将不被认定为反不正当竞争法有关条款规定的侵犯商业秘密行为。这样,从法律上也为从事软件逆向工程开发者扫除了最后一道障碍。可以预见,我国的软件逆向工程必将迎来更加辉煌的明天。
在对软件进行逆向工程研究的时候,一般会依照以下几个大的步骤来完成:
1、研究保护方法,去除保护功能。大部分软件开发者为了维护自己的关键技术不被侵犯,采用了各式各样的软件保护技术,如序列号保护、加密锁、反调试技术、加壳等。要想对这类软件进行逆向,首先要判断出软件的保护方法,然后去详细分析其保护代码,在掌握其运行机制后去除软件的保护。
2、反汇编目标软件,跟踪、分析代码功能。在去除了目标软件的保护后,接下来就是运用反汇编工具对可执行程序进行反汇编,通过动态调试与静态分析相结合,跟踪、分析软件的核心代码,理解软件的设计思路等,获取关键信息。
3、生成目标软件的设计思想、架构、算法等相关文档,并在此基础上设计出对目标软件进行功能扩展等的文档。
4、向目标软件的可执行程序中注入代码,开发出更完善的应用软件
软件逆向工程可以让人们了解程序的结构以及程序的逻辑,深入洞察程序的运行过程,分析出软件使用的协议及通信方式,并能够更加清晰地揭露软件机密的商业算法等。因此逆向工程的优势是显而易见的。
1、由于软件生产技术水平还没有达到人们所期望的程度,所以从头开发软件已经不适应社会对软件需求的不断增长,为了避免重复劳动,提高软件生产的效率和质量,缓解软件危机,必须充分利用和改造现有软件,对现有软件进行再设计、再工程,使软件功能得到大幅提高以满足用户的需要,而再设计(Redesign)
和再工程(Reengineering)都是软件逆向工程的形式之一。再工程是指在现有系统基础上,修改系统并组装成新的形式。
2、目前运行的许多系统由于某些原因,例如其运行环境已改变,或者是根据业务的需要对其功能要进行调整,导致它们必须进行演化才能继续使用。这些系统在经历多年运行之后,包含了众多的知识,包括系统需求、设计决策和业务规则等,通过软件逆向工程将这些软件系统转化为易演化系统,是充分有效地利用这些有用资产的良好途径。软件逆向工程可以从这些系统的程序源代码出发,导出切实可用的信息。
3、在已发布的软件中,许多优秀软件生产厂家出于技术保护等原因没有向用户开放源代码或者不提供源代码,需要用户自己去恢复,此时对软件进行逆向工程研究是最好的方法。
4、现今的商业社会把软件科学纳入一种相对封闭的范畴,为了追求利润,一些软件业的霸主试图进行知识的垄断,它的直接体现就是鼓励普通用户和大多数程序员把软件看成“黑箱”,使得它们不去关心软件的运行机制,把软件的生产变成类似车间加工的一道道流程,却隔断了人们深入研究软件科学的通路。而作为开放源代码的前期工程,软件逆向工程对整个开放源代码工程有着至关重要的作用。
由此我们看出,软件逆向工程为软件技术的发展和相互学习、借鉴提供了一种很有效的技术手段,然而,由于受软件知识产权保护及相关法律法规的限制,软件逆向工程并不能像其它软件技术那样分开、透明地为大家所熟知、了解和广泛交流与应用。另外,软件逆向工程所涉及到的技术很多,它不仅要求逆向工程人员必须熟悉如操作系统、汇编语言、加解密等相关知识,同时还要具有丰富的多种高级语言的编程经验,熟悉多种编译器的编译原理,较强的程序理解和逆向分析能力等,这些都限制了软件逆向工程的发展。
更多关于安全、加密、软件发布相关资讯和产品推荐>>