前 言
软件安全是信息安全领域的重要内容,涉及软件的逆向分析、加密、解密、漏洞分析、安全编程及病毒分析等。随着互联网应用的普及和企业信息化程度的不断提升,社会和企业对安全技术人才的需求逐年增加,国内高校对信息安全学科也越来越重视,但在计算机病毒查杀、网络安全、个人信息安全等方面的人才缺口仍然很大。习近平总书记指出“网络空间的竞争,归根结底是人才竞争”。着重发现、培养、输送信息安全专业人才,已经成为各国信息安全战略的重要组成部分。从就业的角度来看,掌握信息安全相关知识和技能,从业者不但可以提高自身的职场竞争力,而且有机会发挥更大的个人潜力、获得满意的薪酬;从个人成长方面来说,研究信息安全技术有助于掌握许多系统底层知识,是提升职业技能的重要途径。作为一名合格的程序员,除了掌握需求分析、设计模式等,如果能掌握一些系统底层知识,熟悉整个系统的底层结构,必将获益良多。本书以软件逆向为切入点,讲述了软件安全领域相关的基础知识和技能。读者在阅读本书的内容后,很容易就能在逆向分析、漏洞分析、安全编程、病毒分析等领域进行扩展。这些知识点的相互关联,将促使读者开阔思路,使所学融会贯通,领悟更多的学习方法,提升自身的学习能力。
《加密与解密》从第1版到今天的第4版,能够一直陪伴读者,完全基于广大读者的热情和鼓舞,在此深表谢意。
本书的缘起
在信息社会里,安全技术变得越来越重要,如何普及安全知识是作者始终关注的一个大问题。正是为了更好地将安全知识普及到社会各个领域的愿望,促成了本书的问世。依托看雪学院的技术背景,由作者主编和主导的看雪安全系列书籍,目前已出版发行了《加密与解密——软件保护技术及完全解决方案》(简体版,繁体版)、《加密与解密(第二版)》(简体版,繁体版)、《加密与解密(第三版)》(简体版,繁体版)、《软件加密技术内幕》等;基于电子资料的形式,历年发行的《看雪论坛精华》被众多网站转载,保守计算,其下载量已达数百万次,极大地推动了国内安全技术的发展。
这是一本很难写的书,因为在2000年时,软件安全是一个全新的领域,从Windows 95面世以来的6年内,市面上没有一本这方面的书,网上也缺乏相关资料。为了填补国内Windows平台软件安全书籍的空白,作者与看雪论坛的一流好手努力合作,克服种种困难,于2001年9月推出了国内第一本全面介绍Windows平台软件安全技术的书籍,这就是本书的第1版《加密与解密——软件保护技术及完全解决方案》。这本书一经面世,就得到了广大读者的喜爱和认可,获得了2002年全国优秀畅销书奖(科技类),在全国很多计算机专业书店获得了极佳的销售业绩。2003年,本书的繁体版在台湾地区发行,受到了台湾读者的热烈欢迎。
2003年6月,以本书第一版为基础完成了本书的第二版,2008年完成了本书的第三版。
现在读者看到的这本厚重的图书,包含了当今Windows环境下软件逆向和保护技术的绝大部分内容——从基本的跟踪调试到深层的虚拟机分析;从浅显的逆向分析到中高级软件保护,其跨度之广、内容之深,国内至今尚无同类出版物能与之比肩。
第4版的变化
《加密与解密(第4版)》是在第三版的基础上完成的,删除了第三版中的过时内容,补充了大量新的内容,结构更加合理。
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汇编语言有大致的了解。汇编语言是大学计算机的必修课,这方面的书籍非常多,例如《汇编语言:基于x86处理器》、王爽的《汇编语言》等,虽然大多数书籍以16位汇编为讲解平台,但对理解汇编指令功能而言依然有益。
读者如果熟悉和了解C语言,对阅读本书也是很有帮助的,扎实的编程基础是学好逆向的关键。另外,读者需要掌握一些常用的算法和数据结构。
针对特定平台下的软件逆向,需要了解特定平台下程序设计的相关知识。本书主要讨论Windows逆向,需要读者掌握一定的Win32编程知识。不论是研究逆向还是编程,都应该了解Win32编程。Win32编程是API方式的Windows程序设计,学习Windows API能使读者更深入地了解Windows工作方式。推荐阅读Charles Petzold的经典著作《Windows程序设计》,它以C语言为讲解平台。
到此为止,作者将假设你没有任何加密与解密的经验,并以此为标准组织本书的内容。
适合的读者
本书适合以下读者阅读。
- 安全技术相关工作者:研究软件安全的一本不错的技术工具书。
- 对逆向调试技术感兴趣的读者:增强逆向调试技能,提高软件的质量。
- 对软件保护感兴趣的软件开发人员:更好地保护软件作品。
- 相关专业在校学生:掌握的相关知识和技能,获得职场竞争的秘密武器。
- 关注个人信息安全、计算机安全技术并想了解技术内幕的读者:解决很多技术疑难问题。
内容导读
大多数人可能认为软件加密与解密是一门高深的学问。造成这种认识的原因是以前这方面的技术资料缺乏,将加密与解密这一技术“神”化了。在这个领域,初学者一般不知从何下手,于是没有方向,花费大量的时间和精力,甚至要走不少弯路。本书将给对加密与解密感兴趣的读者指明方向,提供捷径。
本书大部分章节既相互关联又彼此独立,因此读者可以根据自己的情况选择合适自己的内容来阅读。
注:附录以电子版形式,放随书配套映像文件提供下载。
附录
附录A:浮点指令
附录B:在Visual C++中使用内联汇编
附录C:Visual Basic程序 //包括《加密与解密》第三版VB部分+《软件加密技术内幕》VB PCODE逆向部分
附录D:.Net平台加解密
特别致谢
在本书的编写过程中,有很多朋友付出了智慧和辛勤的劳动,在此一致表示感谢!
首先,感谢我的父母、妻子、女儿对我的大力支持,使我顺利完成本书的编写!
谨对电子工业出版社博文视点公司所有相关人员致以真诚的谢意!感谢博文视点公司总经理郭立、编辑潘昕所做的大量工作!
特别感谢看雪论坛各位版主及技术小组的成员对本书的大力支持!
感谢版主团队成员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.2节“MDebug调试器”的编写!
感谢gzgzlxg对第3章“静态分析技术”提出的修正和补充意见!
感谢zmworm对工具IDA使用的补充建议!
感谢WiNrOOt提供的IDA简易教程!
感谢北京建極練科技有限公司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”和 第20章“外壳编写基础”的编写作出的贡献!
感谢程勋德对第10章“VT技术”和23.2.6节“利用VT技术”的编写作出的贡献!
感谢王勇对11.15节“编写PE分析工具”的编写作出的贡献!
感谢snowdbg参与14章“漏洞分析技术”的编写作!
感谢BDomne对第14章“漏洞分析技术”的校对!
感谢DiKeN对16.10节“静态脱壳”的编写作出的贡献!
感谢李江涛对17.2.2节“SMC技术实现”的编写作出的贡献!
感谢afanty对17.1节“防范算法求逆”的编写作出的贡献!
感谢forgot参与第18章“反跟踪技术”的编写!
感谢15PB信息安全教育薛亮亮对20.4节“用C++编写外壳部分”的编写作出的贡献!
感谢阎文斌(玩命)参与第19章“加密算法变形引擎”的编写!
感谢罗翼对23.2.1节“跨进程内存存取机制”、23.2.2节“Debug API机制”和23.2.3节“利用调试寄存器机制”的编写作出的贡献!
感谢罗巍对23.2.5节“利用HOOK技术”的编写作出的贡献!
感谢冯典参与第21章“虚拟机的设计”和第22章“VMProtect逆向和还原浅析”的编写!
感谢崔孝晨(hannibal)参与第25章“数据取证技术”的编写!
感谢linhanshi在工具方面提供的帮助!
感谢老罗《矛与盾的较量——CRC实践篇》一文所带来的启发!
感谢Lenus在内存Dump和内存断点方面给予的技术支持!
感谢skylly对第16章“脱壳技术”的脚本制作提供的技术支持!
感谢hnhuqiong提供的ODbgScript脚本教学!
感谢VolX提供了随书文件中的Aspr2.XX_unpacker.osc脚本!
感谢CoDe_Inject对23.2.4节“DLL注入技术”的编写提供的帮助!
感谢dREAMtHEATER在Win32编程和PE格式上的大力支持!
感谢武汉科锐安全教育的Backer为23.2.4节“DLL劫持技术”提供的lpk.cpp!
感谢softworm撰写的《Themida的SDK分析》一文,文本收录在随书文件“16.9 加密壳”目录中。
感谢周文雄(小楼)提供的Visual Basic 6逆向技术支持,相关内容请参考随书文件附录C。
感谢tankaiha对“.Net平台加解密”内容的编写,本章收录在随书文件附录D!
感谢宋成广对“.Net平台加解密”内容的校对!
感谢cyclotron对“伪编译”内容的编写作出的贡献!
感谢郭春杨对附录B“在Visual C++中使用内联汇编”的编写作出的贡献!
感谢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年,历经19年的发展,受到业内的广泛认同,在行业中树立了令人尊敬的专业形象。网站始终关注安全技术领域的最新发展,为IT专业人士、技术专家提供了一个氛围良好的交流与合作空间。多年来,看雪网站培养了大批安全人才,使他们从普通IT爱好者成长为具有一技之长的安全专才。同时,网站建立了一套行之有效的人才选拔机制,为IT企业源源不断输送和推荐了众多优秀人才,在业内形成了很好的口碑。近20年的发展过程中,看雪网站形成了大量有价值的技术资料,经过看雪团队的共同努力,先后出版过数本技术专著,深受出版社和广大读者好评,社会影响深远。看雪网站未来的发展,将更多依靠团队的力量,推出符合用户需求的安全产品,为会员提供安全知识的在线视频课程和教学,同时为企业提供智能设备安全测试等产品和服务。
反馈信息
我们非常希望能够了解读者对本书的看法。如果您对本书内容有任何问题或有自己的学习心得想要与其他读者分享,欢迎来看雪论坛交流。
技术支持:http://www.kanxue.com
邮件地址:kanxue@pediy.com
段 钢
2018年3月于上海