前言
为什么要写这本书
“时下的IDE很多都是极其优秀的,拜其所赐,职场上的程序员多出十几倍,但是又有多少人能理解程序内部的机制呢?”
——侯捷[1]
随着软件技术的发展及其在各个领域的广泛应用,对软件进行逆向分析,通过阅读其反汇编代码推断数据结构、体系结构和程序设计思路的需求越来越多。逆向分析技术能帮助我们更好地研究和学习先进的软件技术,特别是当我们非常想知道某个软件的某些功能是如何实现的而手头又没有合适的资料时。
如果能够利用逆向技术去研究一些一流软件的设计思想和实现方法,那么我们的软件技术水平将会得到极大的提升。目前,国内关于逆向分析技术的资料实在不多,大中专院校的计算机相关专业对此技术也没有足够的重视。
有很多人认为研究程序的内部原理会破坏“黑盒子”的封装性,但是如果我们只是在别人搭建好的平台上做开发,那么始终只能使用别人提供的未开源的SDK,会一直受牵制。如果我们能够充分掌握逆向分析方法,就可以洞悉各种SDK的实现原理,学习各种一流软件采用的先进技术,取长补短,为我所用。若能如此,实为我国软件产业之幸。
我当初学习逆向技术时完全靠自学,且不说这方面的书籍,就连相关的文档和资料也极度匮乏。在这种条件下,虽然很努力地钻研,但学习进度非常缓慢,花费几天几夜分析一个软件的关键算法是常有的事。如果当初能有一本全面讲解反汇编与逆向分析技术的书,我不仅能节省很多时间和精力,还能少走很多弯路。因为有了这段经历,我斗胆争先,决定将自己多年来在反汇编与逆向分析技术领域的经验和心得整理出来与大家分享,希望更多的开发人员在掌握这项技术后能更好地将其应用到软件开发实践中,从而提高我国软件行业的整体水平。
读者对象
无论大家从事哪个行业,在开始阅读本书之前,都需要具备以下几个方面的基础知识。
- 数据结构的基础知识,如栈结构存取元素的特点等。
- 汇编的基础知识,如寻址方式和指令的使用等。
- C/C++语言的基础知识,如指针、虚函数和继承的概念等。
- 熟悉Visual Studio 2019的常用功能,如观察某变量的地址、单步跟踪等。
具备了上面这些基础知识,就可以根据自己的实际需求学习本书的内容。
如果你是一位软件研发人员,你将通过本书更深入地了解C++语法的实现机制,对产品知其然更知其所以然。在精读反汇编代码后,你的调试水平也会得到质的提升。
如果你是一位反病毒分析人员或者电子证据司法取证分析人员,通过逆向分析恶意软件样本,你可以进行取证分析处理,例如,分析开发者的编写习惯、推断开发者的编程水平,甚至可以进一步判定某病毒样本是否与其他病毒出自同一人之手。
如果你是一位高等院校计算机相关专业的学生(本科或本科以上),你可以通过学习书中的软件逆向分析技术来拓展思路,为未来进军软件研发行业打下基础。
第2版的更新内容
- 重新设计了所有的示例。
- 所有的反汇编代码均使用最新的Visual Studio 2019编译器编译。
- 增加最新的Clang编译器反汇编代码讲解。
- 增加最新的GCC编译器反汇编代码讲解。
- 增加所有主流编译器64位程序反汇编代码讲解。
- 随书文件增加所有示例单独的源码和所有编译器编译后的可执行程序。
- 根据最新编译器删除了一些过时的内容,增加了一些新的内容。
- 增加和更新了病毒分析示例。
本书特色
我结合自己的学习经历和对C++反汇编与逆向分析技术的了解将全书划分为三个部分。
第一部分 准备工作(第1章)
在软件开发过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误。在逆向分析领域,分析者也要利用相关工具分析软件行为,验证分析结果。本书第一部分简单介绍了几款常用的逆向分析辅助工具和软件。
第二部分 C++反汇编揭秘(第2~13章)
评估一位软件开发者的能力,一是看设计能力,二是看调试水平。一般来说,大师级的程序员对软件逆向分析技术都有深入的理解,他们在编写高级语言代码的同时,心里还会浮现对应的汇编代码,在写程序的时候就已经非常了解最终产品的模样,达到了人机合一的境界,所以在调试Bug的时候游刃有余。逆向分析技术重在代码的调试和分析,如果你本来就是一位技术不错的程序员,学习这部分内容就是对你“内功”的锻炼,这部分内容可以帮助你彻底掌握C/C++各种特性的底层机制,不仅能做到知其然,还能知其所以然。这部分以C/C++语法为导向,以各编译器为例,解析每个C/C++知识点的汇编表现形式,通过整理其反汇编代码梳理流程和脉络。这部分内容重在讲方法,授人以渔,不重剑招,但重剑意。
第三部分 逆向分析技术应用(第14~18章)
这是本书的最后一部分,以理论与实践相结合的方式,通过对具体程序的分析来加深大家对前面所学理论知识的理解,从而快速积累实战经验。第14章分析了PE文件分析工具PEiD的工作原理,第15章分析了调试器OllyDbg的工作原理,第16章对大灰狼远控木马进行了逆向分析,第17章对WannaCry勒索病毒进行了逆向分析,第18章讲解了反汇编代码的重建与编译。通过这部分内容的学习,大家可以领略逆向分析技术的魔力。
如何阅读本书
逆向分析技术具有很强的综合性和实践性,要掌握这项技术需要耐心和毅力。建议大家从最简单的程序入手,按照本书安排的顺序逐章阅读,一边看书,一边积极地思考和总结。对于一些理论知识,如果你兴趣不大,在初学阶段可以跳过,待以后需要提高时再回过头来阅读。可以暂时跳过的知识我都在书中做了说明。
随着时间的推移,你会逐渐形成一套分析代码的个人风格和习惯。这样一来,任何软件在你眼中都没有了神秘感。
勘误和支持
由于个人能力有限,书中的疏漏在所难免,还请各位同行和读者多多批评指正。本书的讨论和勘误放在看雪论坛(http://bbs.pediy.com/)的图书项目版块中,我们会在这里发布本书的勘误和其他对大家有用的增值服务。大家也可以在这里发表对本书的意见和建议,更重要的是,大家还能在这里结交到一些志同道合的朋友。同时,也欢迎大家通过QQ(159262378)或E-mail(ollydbg@foxmail.com)联系我。由于平时上网较少,如果回复不及时,还请谅解。
致谢
在本书写作的过程中,我得到过很多同行的指点和帮助,在此表示感谢,感谢唐培、田青、王金龙、吴超、秦颂浩、李常坤、薛晓昊、黄震、何锡宁、刘帅等人(排名不分先后)。还有很多朋友在我写作本书的过程中给予了帮助,在这里一并表示感谢。
特别感谢本书的编辑杨福川、罗词亮和韩蕊,他们花费了许多时间和精力校正本书的各类错误。正是他们的敬业和努力,才使得本书能在保证质量的前提下顺利出版。
钱林松
2021年3月于武汉
[1]著名技术专家和IT教育工作者,尤其精通C++和MFC,计算机图书作家、译者和书评人。