本书分为两大部分。第1部分结合精心挑选的实例,系统地讨论了黑客代码分析技术,包括调试器与反汇编器等典型分析工具的使用、代码分析的基本过程以及相关疑难问题的处理等。第2部分介绍了程序保护所面临的各种挑战及其相关的反调试、反跟踪、防反汇编以及代码加密解密技术等内容,这实际上是代码分析方面的高级专题。该书在内容上将针对性、实践性与综合性有机地结合在一起,很好地满足了学习代码分析技术的需要。
该书主要是为致力于计算机安全维护而阻止黑客侵袭或者从事安全保护程序开发的人员写的。同时,本书对于深入学习程序和操作系统等计算机内核知识,也有很好的参考价值。
第1部分 精通黑客基本技术
第1章 概述 2
1.1 保护方式分类 2
1.2 保护强度 4
第2章 第一步:热身 6
第3章 第二步:熟练使用反汇编器 11
第4章 第三步:外科手术 17
第5章 第四步:熟练使用调试器 24
5.1 方法0:破解原始密码 25
5.2 方法1:直接在内存中搜索用户输入的密码 37
5.3 方法2:在密码输入函数上设置断点 46
5.4 方法3:针对消息设置断点 49
第6章 第五步:IDA粉墨登场 53
第7章 第六步:结合调试器使用反汇编器 82
第8章 第七步:识别高级语言的关键结构 85
8.1 函数 85
8.2 启动函数 100
8.3 虚函数 104
8.4 构造函数与析构函数 136
8.5 对象、结构体与数组 147
8.6 this指针 164
8.7 new操作符与delete操作符 165
8.8 库函数 169
8.9 函数的参数 173
8.9.1 函数的返回值 255
8.9.2 局部堆栈变量 309
8.9.3 寄存器与临时变量 327
8.9.4 全局变量 338
8.9.5 常量与偏移量 344
8.9.6 文本与字符串 357
8.9.7 IF-THEN-ELSE条件语句 374
8.9.8 SWITCH-CASE-BREAK语句 415
8.9.9 循环语句 433
8.9.10 数学运算符 475
第2部分 提高软件分析难度的技术途径
第9章 概述 500
第10章 反调试技术 502
10.1 调试技术发展简介 502
10.2 调试器的工作原理 503
10.3 实模式与保护模式下的异常处理 505
10.4 黑客如何破除程序的保护机制 505
10.5 程序的保护 506
10.6 如何进行反跟踪 506
10.7 断点的防范 512
第11章 反汇编防范技术 518
11.1 最新操作系统的自修改代码 518
11.2 Windows内存体系结构 519
11.3 使用WriteProcessMemory函数 520
11.4 在堆栈中执行代码 522
11.5 可重定位代码的缺陷 522
11.6 优化编译器的是与非 524
11.7 使用自修改代码保护应用程序 525
11.8 总结 529
第12章 新保护技术讨论与展望 530
说明 531
说起“黑客”,人们会立即想到非法侵入计算机并窃取与破坏资源的计算机高手。这种在英文中称为“cracker”的黑客,满肚子“恶肝疠胆”,说他“黑”名副其实。然而,还有一种英文叫做“hacker”的黑客,却有一副算得上“红”的“侠肝义胆”。他想方设法突破安全保护机制的目的不在于窃取与破坏,而在于寻找和建立防止窃取与破坏的各种有效措施,被冠以黑客的恶名似乎有点儿冤。
不过,撇开人性因素而仅仅从纯粹的技术角度看,两种黑客的行为方式却没有本质上的差别,他们都以代码分析作为技术手段。这或许是在中文中将他们统统称为黑客的根本原因。代码分析技术用在黑客手中就成了所谓的黑客技术。概括地说,黑客技术指的是利用调试器与反汇编器等代码分析工具,跟踪、调试、分析与反汇编程序的机器指令,进而重建程序的算法初始源代码,并据此破除程序保护机制的综合性代码分析技术。
目前,黑客分析技术正方兴未艾。这不仅是因为计算机安全方面存在迫切的现实需要,而且因为代码分析技术为人们深入地学习程序设计技术提供了一条高效率的途径,同时,它还是研究开发高质量与高性能的系统软件(如编译器与操作系统)的有效手段。须知,诸如调试器与微处理器调试功能之类的技术,最初都是为开发高质量的驱动程序这样的软件而提供的。
显然,黑客技术是一门实践性强、覆盖面广的综合性技术。然而,它并不像人们想像的那样神秘莫测而遥不可及。市场上介绍黑客技术的书籍虽然很多,但能够将针对性、实践性与综合性很好地结合在一起的著作却不多见,而这对于学习黑客技术却是至关重要的。
与其他类似书籍相比,本书在内容上类比了几种常用编译器生成的代码形式,不失为“博”;其规模几乎涵盖了高级语言的所有语言要素,算得上“大”;所列举的实例代码短小典型,无愧于“精”;书中对每个知识点知无不言、言无不尽,可谓是“深”。它所具有的“博大精深”的特点,在很大程度上满足了人们学习黑客技术的需要。您不妨去阅读它,理解它,应用它,定知“吾言不虚也”。感谢电子工业出版社为我们引进了一本好著作。然而,我不得不加上一句:For your information only,believe it or not!
本书的作者Kris Kaspersky先生是黑客破译、反汇编与代码优化技术的专栏作家,更是一位涉猎颇多的“杂家”。其研究内容涵盖编译器开发、优化技术、安全机制研究、实时操作系统内核的创建以及反病毒程序的设计等诸多领域。可以认为,正是因为他虽“杂”却“博”、虽“博”却“深”,才能用诙谐而轻松的话语,把严密的科技知识在谈笑间透彻地加以剖析,让读者在轻松愉快之中学习和体验科技的奥妙,这是一种特色、一种方式、一种态度,更是一种境界。
该书的翻译得到王璐、沈鑫剡、胡勇强、伍红兵、龙瑞、魏涛、汪东等同志的大力支持与协助,在此一并致谢。
由于黑客技术涉及的知识非常丰富,本书的实例含有很多的细节内容,加之译者水平有限,译文中必定存在疏漏和不当之处,请读者不吝赐教。
译 者
2004年6月
本书通过展示如何创建与绕过保护环节等方面的内容,向读者开启了一扇通往安全机制这一神秘世界的大门。该书是为喜欢破译难解之谜的人们,以及将业余时间或者上班时间都花在对程序与操作系统进行刨根问底的人们写的,同时,它也是为经常或者偶尔从事保护程序开发的人员,以及想知道如何出色而可靠地阻止无处不在的黑客的人员写的。
黑客底层分析技术,即用调试器与反汇编器开展工作所需要的技能,是本书介绍的主要内容。书中详细介绍了识别与重建源代码的关键结构——函数(包括虚函数)、局部与全局变量、分支、循环、对象及其层次、数学运算符等方面的内容。
选取阅读本书时所需要的工具软件,完全由读者个人的喜好决定。每个人的爱好是很不一样的,因此,请不要把我在下面提到的那些东西看成板上钉钉的事,只管将它们当做一些建议好了。使用本书需要的工具软件包括:
调试器——SoftIce,版本在3.25以上
反汇编器——IDA,版本为3.7x(推荐使用3.8版本,4.x版本更佳)
十六进制编辑器——HIEW,任何版本都行
开发包——SDK与DDK(后者不是必需的,但拥有它的确很好)
操作系统——任何版本的Windows操作系统都行,但强烈推荐使用Windows 2000或者更高的版本
编译器——读者最喜欢的任何C/C++或者Pascal编译器(书中虽然对Microsoft Visual C++、Borland C++、Watcom C、GNU C以及Free Pascal等编译器各自具有的特点都进行了详细描述,但用得最多的只是Microsoft Visual C++ 6.0编译器)
现在,我们来比较详细地介绍一下这些内容:
SoftIce。SoftIce调试器是黑客们使用的主要武器。虽然有一些免费的调试器(比如Microsoft的WINDEB与刘涛涛的TRW)可供使用,但SoftIce比所有这些免费程序提供的功效加在一起还要有效与方便。几乎所有版本的SoftIce都能满足用户的需要,作者使用的是3.26版本。这是一个经受了时间考验的版本,它具有很好的稳定性,并且在Windows 2000下运行良好。该软件的当前版本4.x与我计算机上的电视卡(Matrox Millennium G450)不能在一起很好地运作,大致说来,随着运行时间的推移,它会出现死机。除此以外,在第四个版本的所有新增功能中,只有“参考点省略”(FPO,Frame Point Omission)这一部分功能(参见“局部堆栈变量”一节)才对通过ESP寄存器直接寻址局部变量的程序员特别有用,这无疑是一个很实用的特性,然而,如果一定要实现类似的操作,没有它同样可以做到。去购买SoftIce调试器吧,读者是不会遗憾的。(破译程序的工作与盗版行为可不是一回事,直到今天,从事这类工作的人们都还算得上是诚实的。)
IDA Pro。目前世界上功能最强的反汇编器无疑是IDA。没有IDA固然可以生存,但有了它肯定可以生活得更好。IDA为浏览所剖析的内容提供了一个便利的工具,它自动识别库函数和局部变量(包括通过ESP直接寻址的那些变量),并支持众多的处理器与文件格式。一句话,黑客要是不配备它就不能称为黑客了。但是在我看来,为它大做广告其实是不必要的。惟一的问题是,读者如何才能得到这个IDA工具程序。加进该软件程序的盗版是十分罕见的(我看到过的最新版本是IDA 3.74,不过它显得不够稳定),提供它的Internet网站通常更少。IDA开发人员会迅速阻止任何非授权性质的产品分发企图。获取该软件的惟一可靠途径是从开发人员(http//www.idapro.com)或者正式发行商那里购买。不幸的是,该软件并不提供配套的文档资料(非常简短且不系统的即时帮助信息除外)。
HIEW。HIEW不仅仅是一个十六进制的编辑器,它还将反汇编器、汇编器与编码器的功能集于一身。HIEW虽然不能取代IDA而使用户不必去购买IDA,但在某些情况下,它会带给用户很多的回报。(IDA运行起来很慢,因此,假如用户仅仅是想快速地看一眼待用文件的话,则浪费大量的时间确实是件令人头疼的事情。)不过,HIEW的主要用途不在于反汇编,而在于进行一些细小的修剪——针对二进制文件进行一些小小的外科手术。这样做的目的通常是去除部分保护机制,从而使该工具能够正常地运行。
SDK(软件开发套件——应用程序开发包)。需要从SDK包获得的主要资源是关于Win32 API函数以及用于PE文件的DUMPBIN实用工具等方面的文档资料。没有这些资料,无论是黑客还是开发人员什么都做不了。至少,用户需要通过文档资料来了解主要系统函数的原型和用途。这类信息虽然可以从浩如烟海的编程书籍中收集而来,但是没有哪本书能够宣称它所展示的内容达到了必要的深度和广度,所以说,用户迟早要去使用SDK。怎样去获取SDK呢?SDK是MSDN的一部分,MSDN按季度以光盘的形式进行发布,同时也可以通过征订来分发。(用户可以通过官方网站http//msdn.microsoft.com来了解关于订阅条件方面的内容。)此外,MSDN也随Microsoft Visual C++ 6.0编译器一起提供(这个版本虽然不是特别新,但它对于阅读本书已经足够了)。
DDK(驱动程序开发套件——驱动程序开发包)。黑客使用DDK开发包做什么?它有助于弄清楚,驱动程序是如何开发、工作,以及如何被攻击的吗?除了基本的文档和大量的样例之外,DDK包还包括一个非常有价值的文件NTDDK.h,该文件含有绝大部分非公开结构的定义,它同揭示系统某些非一般性操作细节的注释内容一起加载。随DDK一起提供的一些实用程序也是有用的,其中,WINDEB调试器就是DDK所包括的实用工具之一,这是一个相当好的调试器,但无论从什么角度看,它都难及SoftIce的项背,因此,本书不考虑它的使用。(如果读者找不到SoftIce,WINDEB也凑合能用。)用于编写驱动程序的MASM汇编工具显得十分有用,另外,DDK还有一些使黑客的生活变得稍微容易点儿的小程序。最新的DDK版本可以从Microsoft站点免费下载。不过,要记住一点,用于NT的整个DDK的大小超过了40MB(压缩的),它甚至要求磁盘上存在更多的空间。
操作系统。我无意将自己的品味和嗜好强加于读者,不过,我还是强烈地建议读者安装Windows 2000或者更高的版本。这样做的原因在于它是一个性能非常稳定且运行牢靠的操作系统,能够抵御严重的应用程序错误的破坏。与黑客的工作紧密相关的一件事情是,这种针对程序的核心层所施加的外部干扰使程序非常容易陷入崩溃而出现难以预料的行为。Windows 9x操作系统和崩溃程序的频繁“罢工”表现出“高度一致”的步调,有时候,计算机请求启动高达几十次之多!如果启动频繁发生而读者又不用去修复因为故障而遭到破坏的磁盘的话,那只能说用户运气不错。(这样的事情虽然很少发生,但还是存在发生的必然。)冻结Windows 2000要困难得多,在我睡眠不好或者疏忽大意的时候,我“成功”实施冻结的次数一个月也不会多于两次。而且,Windows 2000允许用户在任何时候加载SoftIce而不用重新启动系统,这实在是太方便了!最后要说明的一点是,本书的所有内容都是基于Windows 2000或者更高版本而展开叙述的,作者也很少提及其他系统所表现出的不同之处。
本书的读者需要事先对汇编语言很熟悉。即使没有用汇编语言编写程序的经历,至少也应该知道诸如寄存器、段、机器指令等概念指的是什么,否则,阅读本书很可能感到太复杂而难于理解。作者的建议是,读者去找一本汇编方面的指南书籍,然后进行系统的学习。
除了汇编语言,读者至少还应该具备操作系统方面的一般概念。
此外,从Intel和AMD站点上下载所有可以获得的关于处理器的文档资料,也是很有用的。
至此,已经准备足够素材,该是起步向前的时候了!