前言
软件安全是信息安全领域的重要内容,涉及软件的逆向分析、加密、解密、漏洞分析、安全编程及病毒分析等。随着互联网应用的普及和企业信息化程度的不断提升,社会和企业对安全技术人才的需求逐年增加,国内高校对信息安全学科也越来越重视,但在计算机病毒查杀、网络安全、个人信息安全等方面的人才缺口仍然很大。习近平总书记指出,“网络空间的竞争,归根结底是人才竞争”。同时,着重发现、培养、输送信息安全专业人才,已经成为各国信息安全战略的重要组成部分。从就业的角度来看,如果能掌握信息安全相关知识和技能,从业者不但可以提高自身的职场竞争力,而且有机会发挥更大的个人潜力、获得满意的薪酬;从个人成长方面来说,研究信息安全技术有助于掌握许多系统底层知识,是从业者提升职业技能的重要途径。作为一名合格的程序员,在掌握需求分析、设计模式等之外,如果能掌握一些系统底层知识,熟悉整个系统的底层结构,必将获益良多。
本书以软件逆向为切入点,讲述了软件安全领域相关的基础知识和技能。读者阅读本书后,很容易就能在逆向分析、漏洞分析、安全编程、病毒分析等领域进行扩展。这些知识点的相互关联,将促使读者开阔思路,使所学融会贯通,领悟更多的学习方法,提升自身的学习能力。
《加密与解密》从第1版到今天的第4版,能够一直陪伴读者,完全基于广大读者的热情和鼓舞,在此深表谢意。
本书的缘起
在信息社会里,安全技术变得越来越重要,如何普及安全知识是笔者始终关注的一个大问题。正是为了更好地将安全知识普及到社会各个领域的愿望,促成了本书的问世。
依托看雪学院的技术背景,由笔者主编和主导的看雪安全系列书籍,目前已出版发行了《加密与解密——软件保护技术及完全解决方案》(简体版,繁体版)、《加密与解密(第二版)》(简体版,繁体版)、《加密与解密(第三版)》(简体版,繁体版)、《软件加密技术内幕》等;基于电子资料的形式,历年的《看雪论坛精华集》被众多网站转载,保守计算,其下载量已达数百万次,极大地推动了国内安全技术的发展。
这是一本很难写的书。在2000年时,软件安全是一个全新的领域,Windows 95面世之后的6年内,市面上没有一本这方面的书,网上也缺乏相关资料。为了填补国内Windows平台软件安全书籍的空白,笔者与看雪论坛的一流好手努力合作,克服种种困难,于2001年9月推出了国内第一本全面介绍Windows平台软件安全技术的书籍,这就是本书的第1版《加密与解密——软件保护技术及完全解决方案》。这本书一经面世,就得到了广大读者的喜爱和认可,获得了2002年全国优秀畅销书奖(科技类),在全国很多计算机专业书店获得了极佳的销售业绩。2003年,这本书的繁体版在台湾地区发行,受到了台湾读者的热烈欢迎。
2003年6月,以第1版为基础完成了本书的第2版。2008年,完成了本书的第3版。
现在读者看到的这本厚重的图书,包含了当今Windows环境下软件逆向和保护技术的绝大部分内容。从基本的跟踪调试到深层的虚拟机分析,从浅显的逆向分析到中高级软件保护,其跨度之广、内容之深,国内尚无同类出版物能与之比肩。
第4版的变化
《加密与解密(第4版)》以第3版为基础,删除了第3版中的过时内容,补充了大量新的内容,结构更加合理。
1.讲解通俗,突出基础
本书增加了基础部分的篇幅,系统讲解了软件逆向的基本流程,主要内容包括动态分析、静态分析及逆向分析的基础知识,重点讲解了逆向分析必备工具OllyDbg、WinDbg和IDA的用法。初学者通过相关内容的学习,可以轻松入门。
2.案例丰富,覆盖面广
学习逆向的最好方式就是动手实践,在实践中有针对性地学习。本书提供了大量的案例分析,方便读者将理论与实践相结合,通过实际操作提高调试分析能力。
3.新增64位软件逆向技术的相关内容
为了方便理解,书中大多数实例程序是32位的。32位平台和64位平台的差异主要体现在指令集、寄存器长度和调用约定等方面。对有分析基础的读者来说,仅需要一个熟悉过程就可以适应这些差异。新增的64位软件逆向部分系统讲解了64位逆向的基本思路,使读者可以轻松地从32位逆向过渡到64位逆向。
4.加强系统内核相关知识的介绍
掌握系统底层技术是成为技术大牛的必经阶段。本书增加了大量关于系统内核技术的介绍,包括内核基础知识、注入技术、Hook技术及高深的VT技术。另外,对异常处理中的大部分内容进行了重写,更新的内容包括Windows 7/8/10等系统的新特性、x64平台上SEH的具体实现、编译器对SEH的增强实现及SEH安全性等。
5.新增漏洞分析技术的相关内容
随着软件漏洞出现形式的日趋多样化,为了区别于XSS、注入等类型的Web漏洞,将传统的缓冲区溢出、UAF等涉及二进制编码的漏洞统称为二进制漏洞。本书讨论的软件漏洞都属于二进制漏洞。
6.探讨软件保护技术的实施
本书研究了大量极具商业价值的软件保护技术,包括反跟踪技术、外壳编写基础、加密算法变形引擎、虚拟机的设计等。读者完全可以将这些技术应用到自己的软件保护体系中去。
7.新增电子取证技术
电子取证是指对受侵害的计算机系统进行扫描和破解,以及对入侵事件进行重建的过程,融合了计算机和刑侦两个专业领域的知识和经验。在本书中介绍了当前常用的电子取证技术。
预备知识
在阅读本书前,读者应该对x86汇编语言有大致的了解。汇编语言是大学计算机的必修课。这方面的书籍非常多,例如基普·欧文(Kip Irvine)的《汇编语言:基于x86处理器》、王爽的《汇编语言》等。虽然大多数书籍以16位汇编为讲解平台,但对理解汇编指令功能而言依然有益。
熟悉和了解C语言对阅读本书也是很有帮助的——扎实的编程基础是学好逆向的关键。另外,读者需要掌握一些常用的算法和数据结构。
针对特定平台下的软件逆向,需要了解特定平台下程序设计的相关知识。本书主要讨论Windows逆向,需要读者掌握一定的Win32编程知识。不论是研究逆向还是编程,都应该了解Win32编程。Win32编程是API方式的Windows程序设计,学习Windows API能使读者更深入地了解Windows的工作方式。推荐阅读佩措尔德(Charles Petzold)的经典著作《Windows程序设计》,它以C语言为讲解平台。
到此为止,笔者将假设读者没有任何加密与解密方面的经验,并以此为标准组织本书的内容。
适合的读者
本书适合以下读者阅读。
*安全技术相关工作者:研究软件安全的一本不错的技术工具书。
*对逆向调试技术感兴趣的读者:增强逆向调试技能,提高软件的质量。
*对软件保护感兴趣的软件开发人员:更好地保护软件作品。
*相关专业在校学生:掌握相关知识和技能,获得职场竞争力的秘密武器。
*关注个人信息安全、计算机安全技术并想了解技术内幕的读者:解决很多技术疑难问题。
内容导读
大多数人可能认为软件加密与解密是一门高深的学问。造成这种认识的原因是以前这方面的技术资料匮乏,将加密与解密这一技术“神”化了。在这个领域,初学者一般不知从何下手,花费大量的时间和精力不说,甚至要走不少弯路。本书将给对加密与解密感兴趣的读者指明方向,提供捷径。
本书的大部分章节,既相互关联,又彼此独立。读者可以根据自己的情况,选择合适自己的内容来阅读。由于图书厚度限制,本书附录的内容以电子文档的形式放在随书文件中供读者下载。
特别致谢
在本书的编写过程中,有很多朋友付出了智慧和辛勤的劳动,在此一并表示感谢!
首先,感谢我的父母、妻子、女儿对我的大力支持,使我顺利完成本书的编写。
谨对电子工业出版社博文视点公司所有相关人员致以真诚的谢意。感谢电子工业出版社副总编辑、博文视点公司总经理郭立及编辑潘昕所做的大量工作。
特别感谢看雪论坛的各位版主及技术小组的成员对本书的大力支持。
感谢看雪论坛版主团队成员linhanshi、netwind、gjden、Claud、仙果、玩命、cnbragon、piaox、BDomne、zmworm、KevinsBobo、LowRebSwrd、海风月影、菩提、xiaohang、非虫、moonife、pencil、loongzyd、moonife、pencil、莫灰灰、rockinuk、jackozoo、Feisu、humourkyo、hawking、arhat、北极星2003、monkeycz、小虾、MindMac等。
感谢看雪智能硬件小组的gjden、ggggwwww、xdxdxdxd、Gowabby、topofall、儒者立心、mozha、怪才、坐北朝南、Wilson、光棍节、凭栏映影、wooy0ung、南极小虾、阿東、missdiog、猥琐菜鸟、Yale、Fycrlve、沧海一粟、gd菜鸡。
感谢看雪Android安全小组的LowRebSwrd、Claud、darmao、dssljt、DuckyDog、ele7enxxh、FIGHTING安、JoenChen、jltxgcy、jusnic、lody、SANCDAYE、Ov4ns7wp、ThomasKing、万抽抽、王正飞、GeneBlue、foyjog、不知世事、蒋钟庆、MindMac。
感谢看雪iOS安全小组的roysue、zhuliang。
感谢看雪Web安全小组的piaox、ermei、govsb、qq-tianqi、anybaby、webappsec、iheartbeat、猥琐菜鸟。
感谢看雪漏洞分析小组的仙果、wingdbg、BDomne、Keoyo_k0shl、KeenDavid、icepng、TKMoma、君子谬、IronMannn、riusksk、污师、岁月别催。
感谢看雪翻译小组的哆啦咪、cherrir、daemond、freakish、fyb波、Green奇、ghostway、hanbingxzy、hesir、jasonk龙莲、lumou、Logdty、rainbow、skeep、SpearMint、StrokMitream、sudozhange、Vancir、wangrin、xycxmz、zplusplus、梦野间、木无聊偶、南极小虾、敲代码的猫、银雁冰、一壶葱茜、玉林小学生。
感谢CCDebuger对第2章“动态分析技术”和第16章“脱壳技术”的校对。
感谢accessd参与2.3节“MDebug调试器”的编写。
感谢gzgzlxg对第3章“静态分析技术”提出的修改和补充意见。
感谢zmworm对IDA使用的补充建议。
感谢WiNrOOt提供的IDA简易教程。
感谢zwfy为3.3.16节“IDC脚本”提供的Python脚本。
感谢北京建極練科技有限公司CTO段夕华对第4章“逆向分析技术”提出的宝贵修改意见。
感谢LOCKLOSE提供的IDA 7.0中文字符搜索的解决方法。
感谢武汉科锐安全教育的张延清对4.2节“64位软件逆向技术”的编写作出的贡献。
感谢Blowfish对5.1节“序列号保护方式”的编写作出的贡献。
感谢riijj为5.6节“网络验证”提供的实例。
感谢cnbragon参与第6章“加密算法”的编写。
感谢麦洛科菲信息安全培训创始人周扬荣参与第7章“Windows内核基础”的编写。
感谢Hume对第8章“Windows下的异常处理”的编写作出的贡献。
感谢段治华参与第8章“Windows下的异常处理”、第12章“注入技术”和第13章“Hook技术”的编写。
感谢Hying对第9章“Win32调试API”和第19章“外壳编写基础”的编写作出的贡献。
感谢程勋德对第10章“VT技术”和22.2.6节“利用VT技术”的编写作出的贡献。
感谢王勇对11.15节“编写PE分析工具”的编写作出的贡献。
感谢snowdbg参与第14章“漏洞分析技术”的编写。
感谢BDomne对第14章“漏洞分析技术”的校对。
感谢DiKeN对16.10节“静态脱壳”的编写作出的贡献。
感谢afanty对17.1节“防范算法求逆”的编写作出的贡献。
感谢李江涛对17.2.2节“SMC技术实现”的编写作出的贡献。
感谢forgot参与第18章“反跟踪技术”的编写。
感谢15PB信息安全教育的薛亮亮对19.4节“用C++ 编写外壳部分”的编写作出的贡献。
感谢冯典参与第20章“虚拟机的设计”和第21章“VMProtect逆向和还原浅析”的编写。
感谢罗翼对22.2.1节“跨进程内存存取机制”、22.2.2节“Debug API机制”和22.2.3节“利用调试寄存器机制”的编写作出的贡献。
感谢罗巍对22.2.5节“利用Hook技术”的编写作出的贡献。
感谢tankaiha参与第24章“.NET平台加解密”的编写。
感谢宋成广对第24章“.NET平台加解密”的校对。
感谢崔孝晨(hannibal)参与第25章“数据取证技术”的编写。
感谢linhanshi在工具方面提供的帮助。
感谢老罗《矛与盾的较量——CRC实践篇》一文所带来的启发。
感谢Lenus在内存Dump和内存断点方面给予的技术支持。
感谢skylly对第16章“脱壳技术”的脚本制作提供的技术支持。
感谢hnhuqiong提供的ODbgScript脚本教学资料。
感谢VolX提供随书文件中的Aspr2.XX_unpacker.osc脚本。
感谢CoDe_Inject对22.2.4节“利用DLL注入技术”的编写提供的帮助。
感谢dREAMtHEATER在Win32编程和PE格式上的大力支持。
感谢武汉科锐安全教育的Backer为22.2.4节“利用DLL劫持技术”提供的lpk.cpp。
感谢softworm撰写的《Themida的SDK分析》一文。文本收录在随书文件“16.9加密壳”中。
感谢郭春杨对随书文件附录B“在Visual C++ 中使用内联汇编”的编写作出的贡献。
感谢周文雄(小楼)对1.1.2节“软件逆向工程”的编写作出的贡献,以及在Visual Basic 6逆向技术方面提供的支持(相关内容请参考随书文件附录C)。
感谢阎文斌(玩命)参与随书文件附录D“加密算法变形引擎”的编写。
感谢cyclotron对伪编译相关内容的编写作出的贡献。
感谢pll621在扩展PE功能方面具有开拓性的研究。
感谢Fisheep对与浮点指令和信息隐藏技术相关内容的编写作出的贡献。
感谢Sun Bird、JoJo、kvllz、frozenrain、jero、mocha、NWMonster、petnt、sudami、tankaiha、wynney、XPoy、王清、小虾等朋友为术语表的整理所做的工作。
感谢胡勇、黄敏、郭倩茹、朱林峰、万嗣超、高伟超、陈佳林、王强、刘习飞、刘婧、郭泽文、严正华、Sun Bird、JoJo、kvllz等对本书的大力支持。
感谢热心读者和看雪热心会员对《加密与解密(第三版)》中的错误进行的反馈和指正。他们是:AlexLong、AsmDebuger、a王、cnliuqh、ddstrg、epluguo、Fido、giftedboy、Gruuuuubby、hdy981、isiah、jerrysun、junxiong、kan、kangaroo、keagan、kmlch、konyka、linkto、littlewisp、lizaixue、manbug、obaby、pathletboy、Phonax、playsun、ppdo、rootboy、senhuxi、senhuxi、shoooo、smartsl、ucantseeme、usufu、usufu、Xacs、XLSDG、yangjt、ybhdgggset、zhiyajun、zwfy、家有睡神、青枫、清风、嗜血狂君、未秋叶落、轩辕小聪、雪未来白无垢、雨中的鱼等。
同时,要感谢那些参与《加密与解密》前3版及《软件加密技术内幕》组稿的众多看雪论坛一流高手,是他们的参与和奉献让本书得以顺利完成。
在此,还要感谢看雪论坛其他朋友的支持和帮助。是你们提供的帮助,使得笔者能够完成本书。如果以上未提及对您的谢意,在此我表示由衷的感谢!
关于本书配套文件
请读者用微信扫描本书封面勒口上的二维码,按提示获取《加密与解密(第4版)》的随书文件。
随书文件中的软件和实例,经过多方面的检查和测试,绝无病毒。但是,一些加解密工具采用了病毒技术,导致部分代码与某些病毒的特征码类似,可能造成查毒软件的误报,请读者自行决定是否使用。建议将随书文件复制到硬盘中,并去除“只读”属性再进行调试,以免出现一些无法解释的错误。
关于看雪学院
看雪学院(www.kanxue.com)是一个专注于PC、移动、智能设备安全研究及逆向工程的开发者社区,创建于2000年,历经多年的发展,受到了业内的广泛认同,在行业中树立了令人尊敬的专业形象。看雪学院始终关注安全技术领域的最新发展,为IT专业人士、技术专家提供了一个氛围良好的交流与合作平台。多年来,看雪学院培养了大批安全人才,使他们从普通的IT爱好者成长为具有一技之长的安全专才。同时,看雪学院建立了一套行之有效的人才选拔机制,为IT企业输送和推荐了众多优秀人才,在业内形成了很好的口碑。在多年的发展过程中,看雪学院形成了大量有价值的技术资料,经过看雪团队的共同努力,出版了多本深受出版社和广大读者好评、社会影响深远的技术专著。
为了更好地发展看雪学院,2015年11月创建了上海看雪科技有限公司,公司以看雪学院为基础,致力于构建一个PC、移动、智能设备安全研究及逆向工程的开发者社区,为会员提供安全知识在线视频课程和教学服务,同时为企业提供智能设备安全测试服务和相关产品。
意见反馈
我们非常希望能够了解读者对本书的看法。如果您对本书内容有任何问题或有自己的学习心得想要与其他读者分享,欢迎来看雪论坛交流。
技术支持:http://www.kanxue.com
邮件地址:kanxue@pediy.com
段钢
2018年8月于上海