逆向工程
文章的开始,先有必要辨别一个单词“crack”。对于(网络)黑客来说,“hack”是褒义词,“crack”则是贬义词,“hack”指那些寻找网络漏洞并进行恶意攻击的行为。但对(软件)黑客来说,“crack”只是个中性词,泛指对程序修改的行为。有时候他们更喜欢称自己为“逆向工程”学者――一个褒义词,而不是“破解者cracker”;当然,在软件作者眼里,“破解”肯定属于贬义。
逆向工程(Reverse Engineering)定义为:“the process of analyzing a subject system to identify the system's components and their interrelationships and create representations of the system in another form or at a higher level of abstraction.” (Source: Chikofsky and Cross)
如果认为:
“源代码 → 编译器 → 可执行程序”的过程是“顺向工程”的话;
“可执行程序 → 反编译器或人工反编译 → 源代码”的过程就是逆向工程。
一、逆向工程历史及分类
逆向工程的起源自然是在编译器技术的发展以后。据说在最早期,程序员之间互相交流、传阅源代码是极其普通的事情。后来,随着商业利益的驱使,源代码交流开始减少,源代码作为公司或个人的产权,被加以严密保护。于是崇尚自由的Hacker精神,导致部分的程序员转去研究如何“将编译后的二进制代码反推,得到源代码”。这个活动一直延续了下来。期间,“自由精神”的驱使,也使部分人产生了“人人都能自由使用每个软件”的想法,逐渐的,“软件破解”浮上了水面。更随着盗版商的加入,“软件破解”也被商业软件公司描述的越来越邪恶。
按逆向工程包括的内容可以分为3类:
1. 软件使用限制的去除,或软件功能的添加
-
按照计算机类别,可以分为个人微型计算机、小型机、中型机、大型机等;
-
按照操作平台或处理器类型,可以分为windows、MAC、UNIX,x86,risc等
-
按照限制类型,可以分为软件使用时间限制,软件功能模块限制、软件运行条件限制(软件狗等)、软件注册限制等;
-
可以是软件功能限制的去除,也可以是软件功能的添加。
2. 软件源代码的再获得
-
按照计算机类别,可以分为个人微型计算机、小型机、中型机、大型机等;
-
按照操作平台,可以分为windows、MAC、UNIX等
-
按照软件层次,可以分为普通应用层软件与操作系统源等。
3. 硬件的复制、模拟
由此观之,一般所谓的“软件破解”只是逆向工程中非常初级的一小部分。
二、逆向工程应用
坦白地讲,现在的逆向工程,真实目的就是为了再利用。据此,个人可以学习别人的编程技术及技巧,公司可以窥探别人的商业软件秘密,或开发与之兼容的软件;(二进制代码层面的)Debug自然也是其中重要的目的之一。
据说,著名的杀毒软件AVP代码写的实在太有条理,因此很容易被分析后“再利用”。有心人不仅可以将其病毒特征库改头换面后再推出,也可以利用逆向工程得到AVP某些模块的源代码,加入自己开发的产品中。
在《看雪精华》(www.pediy.com)中,收录了一篇文章,讲述如何利用逆向工程知识为一个多媒体播放软件去除“静音”bug的过程。
《Windows图形编程》(Feng Yuan著,机械工业出版社)一书中,作者花费了2个章节,约100多页的文字来介绍如何探索windows系统的GDI/DirectDraw内部数据结构,以及如何自制一个apispy来帮助研究。利用类似的方法,你可以自行探索操作系统的奥秘,而不需要别人的讲解。不过,由此产生的副作用是系统上的很多bug被发现和利用,最有名的就是“堆栈溢出攻击”。
利用逆向工程技术还可以使我们对一些软件进行改造。《程序员杂志》2003.07有文章《编程扩展“记事本”功能》,介绍的就是一例。作者是采用CreateRemoteThread函数远程钩入目标程序进程内,达到其目的。而另一些人可能更喜欢直接修改目标程序的一些二进制代码,从而利用附加的Dll(动态运行库)。后面一种方法叫做SMC(Self Modifying Code)。我看到有人这样为Netscape添加按钮执行“密码保护”功能;有人为filemon添加了“打开最近文档”功能……但最著名的,还是改造W32Dasm――一个著名的反汇编工具活动。通过协作,目前的W32Dasm已经能支持中文字符串,能识别VB程序的引入表,能直接对反汇编程序补丁,能添加注释等等,而这一切都是在没有源代码情况下,直接在二进制代码层面完成。
三、微言
笔者无意卷入“逆向工程”是否合法的无聊讨论中去。只是每次想到这个问题就不由想起庄子的一句话――“窃钩者诛,窃国者侯”。
著名的反编译器提供商datarescue出品的IDA Pro,提供对30多个家族、几十种处理器的支持,它支持windows平台上几乎所有的编译器。Datarescue的客户绝大部分是公司。看情况,datarescue活的蛮好,显然她的客户不会少。那么,那么多公司买IDA Pro做什么?
下面摘录datarescue公司主页(www.datarescue.com)提供的培训课程目录之部分;课程标价为每人每天1000美金。
逆向工程简介(1-2天)
本课程目的是对逆向工程的目标、技术及使用工具作一简明。
1.逆向工程目的
-
程序验证:包括编译器错误、病毒分析、特罗伊木马分析等等;
-
二进制代码转译:重编译以移植、动态翻译、静态翻译;
-
提供对早期软件的支持。
2.方法与工具
-
调试器:编译器附带调试器(visual studio, borland's td),第三方调试器;
-
反汇编工具:IDA Pro,其他反汇编工具;
-
实时监视器及嗅探器:文件和注册表监视工具、系统呼叫监视器、处理器监视器、内存监视器、网路嗅探器等;
-
可执行程序重构工具:程序重构、引入表重建、可执行程序压缩/解压缩工具。
3.windows平台反汇编器的常见问题
-
如何找到感兴趣的目标代码?
-
如何认出程序的编译器类型?
-
如何识别高级语言的函数结构
-
如何识别高级语言的数据结构
……
四、结论
一个“逆向工程”大师,也许具有如下特征:
-
永远保存好奇心,崇尚自由。这能促使探索;也能抵抗商业利欲的侵袭;有了它,枯燥的代码世界才有了生气。
-
勤奋与毅力:“让我们搞清楚作为一名Cracker最需要具备的基本条件,其实那并不是扎实的汇编功底和编程基础。你可以完全不懂这些,Cracking的秘诀就是勤奋+执着!记住并能做到这两点,你一样可以变得优秀。”
-
精通至少一门编程语言,不仅仅是代码,更重要的是编程思想。快速应用开发(RAD)工具也许是容易学的,但你要明白隐藏在它背后的机制。
-
扎实的汇编功底和系统编程的知识。
-
逆向工程的终极网站woodmann上列出那些大师的名字:Matt Pietrek,Jeffrey Richter,John Robbins……他们的专著是每个程序员都应该阅读的:《Windows95系统程式设计大奥秘》、《Windows核心编程》、《应用程序调试技术》……
总之,逆向工程应是一门优雅的艺术,而不是低层次者手中粗陋的工具;逆向工程的目的是学习与再利用;它的精神是“自由”。
转自---------看雪论坛