由于Win32程序内存寻址使用的是相对简单的平坦寻址模式,并且Win32程序大量调用系统提供的API,而Win32平台上的调试器如SoftICE等恰好有针对API设置断点的强大功能,因而这些特点都给动态跟踪破解带来极大的方便。
因为程序的作者用的是高级语言,Windows又是提倡“透明 ”,不希望程序员知道底层的操作 , 而只提供给他们高层的接口, 而相当多的高级函数调用某个一定的底层函数,所以解密者经常在底层函数上下断点。所以在Windows中,只要Windows的函数被使用,想对任何寻找蛛丝马迹的人隐藏什么东西是比较困难的。
为什么要对软件进行动态分析呢?这主要是因为:
1、许多软件在整体上完成的功能,一般要分解成若干模块来完成,而且后一模块在执行时,往往需要使用其前一模块处理的结果,这一结果我们把它叫中间结果。如果我们只对软件本身进行静态地分析,一般是很难分析出这些中间结果的。而只有通过跟踪执行前一模块,才能看到这些结果。另外,在程序的运行过程中,往往会在某一地方出现许多分支和转移,不同的分支和转移往往需要不同的条件,而这些条件一般是由运行该分支之前的程序来产生的。如果想知道程序运行到该分支的地方时,到底走向哪一分支,不进行动态地跟踪和分析是不得而知的。
2、有许多软件在运行时,其最初执行的一段程序往往需要对该软件的后面各个模块进行一些初始始化工作,而没有依赖系统的重定位。
3、有许多加密程序为了阻止非法跟踪和阅读,对执行代码的大部分内容进行了加密变换,而只有很短的一段程序是明文。加密程序运行时,采用了逐块解密,逐块执行和方法,首先运行最初的一段明文程序,该程序在运行过程中,不仅要完成阻止跟踪的任务,而且还要负责对下一块密码进行解密。显然仅对该软件的密码部分进行反汇编,不对该软件动态跟踪分析,是根本不可能进行解密的。
逆向工程
对于(网络)黑客来说,“hack”是褒义词,“crack”则是贬义词,后者指那些寻找网络漏洞并进行恶意攻击的行为。
对于(软件)黑客来说,“crack”只是个中性词,泛指对程序修改的行为,更喜欢称自己为“逆向工程”学者。
-
逆向工程(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)
-
-
-
“源代码 → 编译器 → 可执行程序”的过程是“顺向工程”的话;
-
“可执行程序 → 反编译器或人工反编译 → 源代码”的过程就是逆向工程。
将逆向工程包括的内容可以分为3类:
1.软件使用限制的去除,或软件功能的添加
(1) 按照计算机类别,可以分为个人微型计算机、小型机、中型机、大型机等;
(2) 按照操作平台或处理器类型,可以分为windows、MAC、UNIX,x86,risc等
(3) 按照限制类型,可以分为软件使用时间限制,软件功能模块限制、软件运行条件限制(软件狗等)、软件注册限制等
(4) 可以是软件功能限制的去除,也可以是软件功能的添加。
2.软件源代码的再获得或二进制代码水平的Debug
(1) 按照计算机类别,可以分为个人微型计算机、小型机、中型机、大型机等;
(2) 按照操作平台,可以分为windows、MAC、UNIX等
(3) 按照软件层次,可以分为普通应用层软件与操作系统源等。
3.硬件的复制、模拟
由此观之,一般所谓的“软件破解”只是逆向工程中非常初级的一小部分。
坦白地讲,现在的逆向工程,真实目的就是为了再利用。据此,个人可以学习别人的编程技术及技巧,公司可以窥探别人的商业软件秘密,或开发与之兼容的软件;(二进制代码层面的)Debug自然也是其中重要的目的之一。
据说,著名的杀毒软件AVP代码写的实在太有条理,因此很容易被分析后“再利用”。有心人不仅可以将其病毒特征库改头换面后再推出,也可以利用逆向工程得到AVP某些模块的源代码,加入自己开发的产品中。
成为一个“逆向工程”大师,应该具有如下特征:
1.永远保存好奇心,崇尚自由。这能促使探索;也能抵抗商业利欲的侵袭;有了它,枯燥的代码世界才有了生气。
2.勤奋与毅力:“让我们搞清楚作为一名Cracker最需要具备的基本条件,其实那并不是扎实的汇编功底和编程基础。你可以完全不懂这些,CRACKING的秘诀就是勤奋+执着!记住并能做到这两点,你一样可以变得优秀。”
3.精通至少一门编程语言,不仅仅是Coding,更重要的是编程思想。RAD工具也许是容易学的,但你要明白隐藏在它背后的机制。
4.扎实的汇编功底和系统编程的知识。
5.能发现“美丽”。是的,你能在枯燥的二进制代码中见到美,那是数学和对称的美丽。卓越的编译器优化能力,简洁而又高效的代码,都能使你领略到她的存在。