调试有点像捕鱼:相同的情绪、热情和刺激。长时间静静地工作后最终得到的是别人所不能体验的喜悦。
Eugene Kotsuba
调试器具有很长的发展历程。MS-DOS中的第一个调试器是Debug.com,这是一个简单、不好用而且拙劣的普通调试器。现在它仅被用于学习破解和汇编语言。即使是用于这类情形,也很少有人喜欢它。新的调试器如雨后春笋般涌现。但是,与Debug.com相比,它们中的大多数在原理上并没有多少进步,只是界面不同而已。
MS-DOS时代是保护机制开发人员的黄金时代。只要“锁住”键盘、禁止中断并设置追踪标志就能使程序不可能被调试。可用于破解的第一个调试器,AFD PRO,到了80286处理器时代才出现,是AdTec GmbH于1987年编写的。Chris和Rich Williams两年后编写了著名的Turbo Debugger。Serge Pachkovsky编写了第一个仿真调试器(虽然它姗姗来迟,直到1991年才出现)。还有许多其他的古老工具珍藏在黑客的记忆中。保护机制的开发人员对这些工具很反感,但是却经受住了它们的挑战。上面列出的这些调试器仍然允许程序被调试以捕获控制其中的问题,但是它们不能很好地处理与堆栈、键盘和屏幕相关的小伎俩。
当80386处理器出现时,情形有所改善。其中原因是,软件复杂度的快速增加(并且相应地,调试遇到了极大的困难)要求出现与处理器相匹配的更高级的调试器。这些工具终于在386处理器中出现了!从那时开始,黑客已经开始接近保护机制开发人员的脚后跟。
在20世纪80年代后期,NuMega趁热打铁,他们发布了一款卓越的调试器——SoftIce,它现在仍然深受黑客们欢迎。NuMega成为第一个领导面向黑客的商业软件的潮流的公司,而且还手法娴熟地控制了局面。一方面,它的产品并非定位为黑客工具,而是正式地用于程序调试,另一方面,大多数用户马上发现了该软件的另一种不同的应用。
毋庸置疑,NuMega是第一个,也可能是惟一一个合法的黑客公司。当然,一个公司的能力是那些个人黑客所无法比拟的。开发一个功能完善的调试器需要时间,需要不同领域(从硬件到操作系统)的知识的紧密结合,以及众多专业人员的努力。对个人黑客来说,开发一个功能完善的调试器是不可能完成的任务。
从20世纪80年代后期开始的一段时期,黑客和开发人员攻守异位。保护机制的开发人员通常为小公司工作——有时只有数十个雇员,或者只是个人开发者。黑客却有NuMega做他们的后盾。即使破解者没有完备的系统编程领域的知识,也能成功地使用现成的工具。破解军团的力量不断壮大,许多令人生厌和不文明的个人也开始声称他们是“黑客”,这样就逐渐改变了这个词汇的含义。
自然,保护机制的开发人员不愿独自享用失败的苦酒。他们开始加入大企业,并邀请黑客加盟。许多黑客接受了这样的邀请,因为他们并不喜欢新一代的计算机地下世界的氛围。那时没有人怀疑这些公司会成功。在大公司的财力支援下,经验丰富的老一代黑客应该能创建完善的保护机制,破解新手们应该很难对付这些保护机制。劝说每一个能够破解这类保护机制的人不要去破解,反而与开发人员合作,应该说是不难实现的。毕竟对于一个黑客来说,与和没有教养的人为伍以及埋汰开发人员相比,与专业社区和臭味相投的人一起工作总是更有吸引力。
可是,实际情形却大相径庭。许多公司的经理们对黑客心怀疑虑,并不乐意将他们视为忠诚的员工。即使被接受了,黑客们也不会在公司工作太长时间。在公司里,程序员的工作是例行公事,严格按照规章办事,而这些规章都是不怎么了解计算机和程序员的市场人员编写的。
软件复杂度的增长不仅受机器资源的限制,同时也受错误检测和纠错能力的限制。当时程序员中流传着一句笑谈:“程序员用1%的时间写程序,而用99%的时间调试程序”。因此,英特尔在其新产品80386处理器中加入了一些特殊机制,确保从硬件层来控制代码的执行。这意味着可以在一夜之间就写出一个调试器,而且现有的任何保护机制都不能阻止它(因为这些保护机制都是在没人听说过386处理器时开发的,当然不能抵御它的新性能)。
首先对这种情形迅速做出反应的自然是NuMega,它发布了一款支持386处理器的新版调试器。请注意,利用该款处理器的功能的保护机制是几年以后才出现的,与黑客的工具相比,它们在功能上是望尘莫及的。
最终的结果却出乎人们的意料之外。出现了新的操作系统——Windows。从原理上来说,新的体系结构使所有现有的调试器变得毫无用处。自然,任何像样的编译器都不能没有调试器,因此,不可避免地要出现这样的工具。但是,微软拒绝发表编写调试器所需的信息,只是向其系统的用户提供内置于产品中的调试器。这些调试器非常拙劣——速度慢、代码庞大、难以使用并且不适于与可执行代码协同工作。
其他的公司没有任其为所欲为,他们将此上诉到法庭。微软被迫提供相关的文档,使第三方的开发人员有可能开发出编译器和调试器。即使如此,大多数第三方的调试器也没有超越微软所提供的调试器的功能,不能抛开源程序而直接协同可执行文件工作。
NuMega再次出人意料地推出了一款精品。这款新的调试器一出现就赢得了世人的盛赞。它不依赖操作系统,而是直接与硬件打交道,或者更精确地说,它在Windows和计算机硬件之间的层面上运行。其结果是调试操作系统内核都成为可能!这真是一个奇迹,没有人敢于再做这样的尝试。NuMega一直是用于Windows环境的黑客工具的惟一厂商,迅速地对操作系统的所有改进做出反应。
SoftIce给所有的保护机制及其开发人员制造了许多麻烦。它不是一个真正的秘密调试器,且仍然存在一些漏洞,通过这些漏洞可以检测到该调试器,并摆脱其控制。否则的话,在高手的操作下,该调试器能够克服所有的这类局限,并且绕过所有的反调试陷阱。随着一个又一个新版本的发布,SoftIce变得越来越难以抵御,因为改正旧的漏洞比产生新漏洞速度快得多。
渐渐地,反调试技术过时了。Windows的成功使它退出了舞台。此后,一种荒谬的说法流行起来,即在Windows的应用程序层中是可能发现使用调试器的黑客。可是,专业人士对这种说法不屑一顾,并且时不时地在他们的应用程序中设下一些陷阱(只是为了热身和健脑,而不是为了认真地对抗黑客)。
就进行应用程序分析的高级工具的现代水平而言,想要抵御黑客是不可能的。但是,除了黑客,还有另一种严重的威胁。这种威胁来源于一些高级用户,他们读过一些诸如“如何破解程序”之类的常见问题解答(现在每个人都可以随意获得这样的信息)。显然,他们只是寻找合适的对象,用来测试他们的技术。
然而,这些并不意味着我们的前辈开发的技术已经失去了重要性,不再令人感兴趣。我将从头开始介绍它们——从大多数开发人员都为自己的崭新的IBM XT计算机感到自豪的时候开始。
1.1 了解你的需求
本书主要介绍使用调试器的技巧。当你学习本书时,如何选择需要的工具是一种个人偏好。每一个人的爱好都不一样。因此,不要认为我在此说的每一句话都是不可更改的,它们只是建议而已。为了使用本书,你需要如下的工具:
r 一个调试器——SoftIce 3.25或者更高的版本。
r 一个反汇编器——IDA 3.7x或者更高的版本(我推荐3.8,4.x更好)。
r 一个十六进制编辑器——HIEW,任何版本都行。
r 开发软件包——SDK和DDK(后者并不是必需的,但是最好有)。
r 一个操作系统——Windows家族的任何版本(强烈推荐Windows 2000)。
r 一个编译器——任何你最喜欢的C/C++或者Pascal编译器。
更详细地考虑如下的工具:
r SoftIce。SoftIce调试器是黑客的主要工具。也有一些免费的程序(比如微软的Windeb和刘涛涛的TRW),但是SoftIce比所有这些免费工具的功能加起来更好、更健壮。几乎每一个版本的SoftIce都仍然适合我们的需要。我使用3.26版,该版经受住了时间考验,具有很好的稳定性,并且在Windows 2000下工作得很好。当前的4.x版不能很好地与我的视频卡(Matrox Millennium G450)一起工作,还时不时地死机。除此之外,第四版所有的新增功能中,只有支持“帧点删除”(Frame Point Omission,FPO)这一功能在使用通过ESP寄存器直接寻址的局部变量时特别有用。这无疑是一个很有用的特性,当然,如果必须要实现类似操作的话,没有它也可以做到。尽管如此,我还认为它是值得购买的,你不会因此而后悔的(破解并不等同于盗版,诚实依然是人们应该具备的品德)。
r IDA Pro。世界上功能最强大的反汇编器毋庸置疑是IDA。没有IDA也可以进行反汇编,但使用它效果会更好。IDA为浏览所剖析的代码提供了一个方便的工具;它自动识别库函数和局部变量,包括通过ESP直接寻址的局部变量;还支持多种处理器和文件格式。总之,要是不配备它的话,黑客就不成其为黑客。我认为并不需要为它做广告。惟一的问题是如何得到这个IDA。包含该程序的盗版盘是十分罕见的(我见过的最新版本是3.74,不过它显得不够稳定),提供它的Internet网站更少。IDA的开发人员会很快地阻止任何非法的产品销售。获取该软件的惟一可靠的方法就是从开发者(http://www.datarescue.com/idabase)或者正式销售商那里购买。不要忘记eMule。令人遗憾的是,这个反汇编器没有配套的文档资料,只有简短而且不系统的内置的帮助信息。
r HIEW。HIEW不仅是一个十六进制编辑器,其功能还包括一个反汇编器、一个汇编器和一个编码机。虽然它并不能代替IDA,你还是需要购买IDA,但在某些情况下,它会给用户带来意料之外的便利(如果你仅仅是想快速地查看一下目标文件,使用IDA会因为运行缓慢而浪费时间)。不过,HIEW的主要用途不是反汇编,而是进行数据位破解(在二进制文件中进行的“小型外科手术”),其目的通常是去除保护机制中极为重要的部分,缺少了这部分,保护机制就不能发挥功用。
r SDK。软件开发套件(SDK)是软件开发人员的工具包。需要从SDK中得到的主要资料是关于Win32应用程序接口(API)和用于可移植的可执行(PE)文件dumpbin工具的技术文档。如果没有这些文档,无论是黑客还是开发人员都无法工作。至少,你需要知道主要系统函数的原型和用途。这类信息虽然可以从浩如烟海的编程书籍中收集得来,但是没有哪本书能够自夸它所提供的内容的完整性和深度。因此,你迟早还是需要使用SDK。怎样得到SDK呢?SDK是微软开发人员网络(MSDN)的一部分,MSDN按季度以光盘的形式进行发布,也可以通过订阅来购买(可以从官方网站http://msdn.microsoft.com中了解关于订阅条件的更多内容)。MSDN也随Microsoft Visual C++ 6.0编译器一起提供。这个版本虽然不是特别新的,但对于理解本书却已经足够了。
r DDK。驱动程序开发套件(DDK)是驱动程序开发人员的工具包。DDK对黑客有什么用处呢?首先,它有助于弄清楚驱动程序是如何开发、如何工作、如何被破解的。除了基本的文档和大量的例子外,它还包括一个非常有价值的文件ntddk.h,该文件含有大部分未公开结构的定义并且提供了一些注释,这些注释揭示了一些系统操作的不同寻常的细节。与DDK一起提供的一些工具也是有用的。从这些工具中可以找到包括在DDK中的Windeb调试器。这是一个相当不错的调试器,但是它比SoftIce差得太多,因此,本书不考虑它(不过,如果找不到Ice,Windeb也勉强能用)。用于编写驱动程序的微软宏汇编语言(MASM)是很有用的,也可用来编写一些使黑客的生活变得容易些的小程序。最新的DDK版本可以从Microsoft站点免费下载。
r 操作系统。我不想将自己的品味和嗜好强加于人。不过,我还是强烈地建议你安装Windows 2000。我这样建议的原因在于,它是一个性能稳定且运行可靠的操作系统,能够有效地抵御严重的应用程序错误。与黑客工作相关的一件事情,就是在程序的深层所进行的改变经常会使程序出错,并导致被破解的程序出现难以预料的行为。Windows 9x操作系统的表现非常协调一致:频繁地“罢工”并伴随着死机。有时候,一天内就要重新启动计算机数十次!如果重新启动许多次而又不需修复因为故障而遭破坏的磁盘的话(这样的事情会出现,虽然很少见),你会认为自己运气不错。使Windows 2000死机要困难得多——我因为失眠或者疏忽而“成功”地在一个月内做到了不多于两次的死机。更重要的是,Windows 2000允许用户在任何时候加载SoftIce而不需要重新启动系统,这真的很方便!最后要说明的一点是,本书中的所有论述都隐含地采用了Windows 2000,我也很少提及它与其他操作系统的区别。
我已经简略地介绍了相关的工具,下面说明一下应该具备的背景知识。如果不具备这些知识,上述工具将变得毫无用处。我假定读者已经熟悉汇编语言。如果你不使用汇编语言编写程序,那你至少也应该理解什么是寄存器、段、机器指令和其他的相关概念。否则,本书的内容会显得太复杂而难于理解。我建议读者去找一本汇编语言的手册并系统地学习汇编语言。
除了汇编语言,读者至少还应该具备操作系统的一般概念。下载Intel和AMD网站上所有关于处理器的文档资料也是很有用的。
我想预备知识已经够用了。让我们进入正题。






