加密与解密(第4版)
  • 推荐0
  • 收藏6
  • 浏览3.9K

加密与解密(第4版)

段钢 (作者) 

  • 丛  书:安全技术大系
  • 书  号:978-7-121-33692-8
  • 出版日期:2018-10-10
  • 页  数:936
  • 开  本:16(185*260)
  • 出版状态:上市销售
  • 维护人:郭立
纸质版 ¥198.00
本书以软件逆向为切入点,讲述了软件安全领域相关的基础知识和技能。读者阅读本书后,很容易就能在逆向分析、漏洞分析、安全编程、病毒分析等领域进行扩展。这些知识点的相互关联,将促使读者开阔思路,融会贯通,领悟更多的学习方法,提升自身的学习能力。
本书适合安全技术相关工作者、对逆向调试技术感兴趣的人、对软件保护感兴趣的软件开发人员、相关专业在校学生及关注个人信息安全、计算机安全技术并想了解技术内幕的读者阅读。
涵盖32位和64位软件逆向,剖析加密与解密核心技术,从硬件架构、汇编语言、内核编程到调试技术、软件保护、电子取证,探讨软件安全问题与解决之道,带你走进二进制安全的奇妙世界
前言

软件安全是信息安全领域的重要内容,涉及软件的逆向分析、加密、解密、漏洞分析、安全编程及病毒分析等。随着互联网应用的普及和企业信息化程度的不断提升,社会和企业对安全技术人才的需求逐年增加,国内高校对信息安全学科也越来越重视,但在计算机病毒查杀、网络安全、个人信息安全等方面的人才缺口仍然很大。习近平总书记指出,“网络空间的竞争,归根结底是人才竞争”。同时,着重发现、培养、输送信息安全专业人才,已经成为各国信息安全战略的重要组成部分。从就业的角度来看,如果能掌握信息安全相关知识和技能,从业者不但可以提高自身的职场竞争力,而且有机会发挥更大的个人潜力、获得满意的薪酬;从个人成长方面来说,研究信息安全技术有助于掌握许多系统底层知识,是从业者提升职业技能的重要途径。作为一名合格的程序员,在掌握需求分析、设计模式等之外,如果能掌握一些系统底层知识,熟悉整个系统的底层结构,必将获益良多。
本书以软件逆向为切入点,讲述了软件安全领域相关的基础知识和技能。读者阅读本书后,很容易就能在逆向分析、漏洞分析、安全编程、病毒分析等领域进行扩展。这些知识点的相互关联,将促使读者开阔思路,使所学融会贯通,领悟更多的学习方法,提升自身的学习能力。
《加密与解密》从第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月于上海

目录

基础篇
第1章 基础知识 2
1.1 什么是加密与解密 2
1.1.1 软件的加密与解密 2
1.1.2 软件逆向工程 2
1.1.3 逆向分析技术 3
1.2 文本字符 4
1.2.1 ASCII与Unicode字符集 4
1.2.2 字节存储顺序 6
1.3 Windows操作系统 6
1.3.1 Win32 API函数 6
1.3.2 WOW64 9
1.3.3 Windows消息机制 9
1.3.4 虚拟内存 11

调试篇
第2章 动态分析技术 14
2.1 OllyDbg调试器 14
2.1.1 OllyDbg的界面 14
2.1.2 OllyDbg的配置 15
2.1.3 基本操作 16
2.1.4 常用断点 27
2.1.5 插件 35
2.1.6 Run trace 36
2.1.7 Hit trace 37
2.1.8 调试符号 37
2.1.9 加载程序 39
2.1.10 OllyDbg的常见问题 40
2.2 x64dbg调试器 42
2.3 MDebug调试器 44
2.3.1 MDebug的界面 44
2.3.2 表达式 45
2.3.3 调试 45
2.3.4 断点 46
2.3.5 MDebug的其他功能 47
2.4 WinDbg调试器 47
2.4.1 WinDbg的安装与配置 47
2.4.2 调试过程 51
2.4.3 断点命令 51
2.4.4 栈窗口 53
2.4.5 内存命令 55
2.4.6 脚本 56
2.4.7 调试功能扩展 58
2.4.8 小结 59
第3章 静态分析技术 60
3.1 文件类型分析 60
3.2 反汇编引擎 61
3.2.1 OllyDbg的ODDisasm 61
3.2.2 BeaEngine 61
3.2.3 Udis86 61
3.2.4 Capstone 62
3.2.5 AsmJit 63
3.2.6 Keystone 64
3.2.7 小结 64
3.3 静态反汇编 65
3.3.1 IDA Pro简介 65
3.3.2 IDA的配置 66
3.3.3 IDA主窗口 68
3.3.4 交叉参考 69
3.3.5 参考重命名 70
3.3.6 标签的用法 71
3.3.7 格式化指令操作数 71
3.3.8 函数的操作 72
3.3.9 代码和数据转换 72
3.3.10 字符串 73
3.3.11 数组 74
3.3.12 结构体 75
3.3.13 枚举类型 79
3.3.14 变量 80
3.3.15 FLIRT 81
3.3.16 IDC脚本 82
3.3.17 插件 86
3.3.18 IDA调试器 87
3.3.19 远程调试 90
3.3.20 其他功能 93
3.3.21 小结 94
3.4 十六进制工具 94
3.5 静态分析技术应用实例 97
3.5.1 解密初步 97
3.5.2 逆向工程初步 99

解密篇
第4章 逆向分析技术 102
4.1 32位软件逆向技术 102
4.1.1 启动函数 102
4.1.2 函数 103
4.1.3 数据结构 111
4.1.4 虚函数 115
4.1.5 控制语句 117
4.1.6 循环语句 124
4.1.7 数学运算符 125
4.1.8 文本字符串 128
4.1.9 指令修改技巧 130
4.2 64位软件逆向技术 131
4.2.1 寄存器 131
4.2.2 函数 132
4.2.3 数据结构 142
4.2.4 控制语句 145
4.2.5 循环语句 154
4.2.6 数学运算符 158
4.2.7 虚函数 169
4.2.8 小结 193
第5章 演示版保护技术 194
5.1 序列号保护方式 194
5.1.1 序列号保护机制 194
5.1.2 如何攻击序列号保护机制 195
5.1.3 字符串比较形式 197
5.1.4 制作注册机 198
5.2 警告窗口 203
5.3 时间限制 205
5.3.1 计时器 205
5.3.2 时间限制 205
5.3.3 拆解时间限制保护 206
5.4 菜单功能限制 207
5.4.1 相关函数 207
5.4.2 拆解菜单限制保护 208
5.5 KeyFile保护 208
5.5.1 相关API函数 208
5.5.2 拆解KeyFile保护 209
5.6 网络验证 213
5.6.1 相关函数 214
5.6.2 破解网络验证的一般思路 214
5.7 光盘检测 219
5.7.1 相关函数 219
5.7.2 拆解光盘保护 220
5.8 只运行1个实例 221
5.8.1 实现方法 221
5.8.2 实例 222
5.9 常用断点设置技巧 222
第6章 加密算法 223
6.1 单向散列算法 223
6.1.1 MD5算法 223
6.1.2 SHA算法 227
6.1.3 SM3密码杂凑算法 231
6.1.4 小结 231
6.2 对称加密算法 231
6.2.1 RC4流密码 231
6.2.2 TEA算法 233
6.2.3 IDEA算法 236
6.2.4 BlowFish算法 243
6.2.5 AES算法 246
6.2.6 SM4分组密码算法 259
6.2.7 小结 259
6.3 公开密钥加密算法 259
6.3.1 RSA算法 260
6.3.2 ElGamal公钥算法 264
6.3.3 DSA数字签名算法 270
6.3.4 椭圆曲线密码编码学 272
6.3.5 SM2算法 279
6.4 其他算法 279
6.4.1 CRC32算法 279
6.4.2 Base64编码 280
6.5 常见的加密库接口及其识别 281
6.5.1 Miracl大数运算库 281
6.5.2 FGInt 283
6.5.3 其他加密算法库介绍 284
6.6 加密算法在软件保护中的应用 285

系统篇
第7章 Windows内核基础 290
7.1 内核理论基础 290
7.1.1 权限级别 290
7.1.2 内存空间布局 291
7.1.3 Windows与内核启动过程 292
7.1.4 Windows R3与R0通信 294
7.1.5 内核函数 296
7.1.6 内核驱动模块 297
7.2 内核重要数据结构 298
7.2.1 内核对象 298
7.2.2 SSDT 300
7.2.3 TEB 302
7.2.4 PEB 304
7.3 内核调试基础 306
7.3.1 使用WinDbg搭建双机调试环境 306
7.3.2 加载内核驱动并设置符号表 308
7.3.3 SSDT与Shadow SSDT的查看 311
第8章 Windows下的异常处理 313
8.1 异常处理的基本概念 313
8.1.1 异常列表 313
8.1.2 异常处理的基本过程 314
8.2 SEH的概念及基本知识 319
8.2.1 SEH的相关数据结构 319
8.2.2 SEH处理程序的安装和卸载 320
8.2.3 SEH实例跟踪 321
8.3 SEH异常处理程序原理及设计 325
8.3.1 异常分发的详细过程 325
8.3.2 线程异常处理 330
8.3.3 异常处理的栈展开 336
8.3.4 MSC编译器对线程异常处理的增强 342
8.3.5 顶层异常处理 349
8.3.6 异常处理程序的安全性 357
8.4 向量化异常处理 361
8.4.1 向量化异常处理的使用 361
8.4.2 VEH与SEH的异同 362
8.4.3 向量化异常处理的新内容 363
8.5 x64平台上的异常处理 363
8.5.1 原生x64程序的异常分发 364
8.5.2 WOW64下的异常分发 366
8.6 异常处理程序设计中的注意事项 367
8.7 异常处理的实际应用 368
8.7.1 使用SEH对用户输入进行验证 368
8.7.2 SEH在加密与解密中的应用 369
8.7.3 用VEH实现API Hook 371
8.8 本章小结 371
第9章 Win32调试API 372
9.1 调试相关函数简要说明 372
9.2 调试事件 375
9.3 创建并跟踪进程 377
9.4 调试循环体 378
9.5 处理调试事件 379
9.6 线程环境 380
9.7 将代码注入进程 382
第10章 VT技术 384
10.1 硬件虚拟化的基本概念 384
10.1.1 概述 384
10.1.2 相关结构和汇编指令 385
10.1.3 EPT机制 388
10.2 VT技术的应用 389
10.2.1 编译运行ShadowWalker 389
10.2.2 分析Hypervisor 390
10.2.3 检测VT支持情况 392
10.2.4 VMCS的配置 393
10.2.5 EPT的配置 396
10.2.6 开启VT 399
10.2.7 内存隐藏的实现 399
10.3 VT调试方法 401
第11章 PE文件格式 404
11.1 PE的基本概念 405
11.1.1 基地址 405
11.1.2 虚拟地址 406
11.1.3 相对虚拟地址 406
11.1.4 文件偏移地址 407
11.2 MS-DOS头部 407
11.3 PE文件头 408
11.3.1 Signature字段 408
11.3.2 IMAGE_FILE_HEADER结构 409
11.3.3 IMAGE_OPTIONAL_HEADER结构 410
11.4 区块 415
11.4.1 区块表 415
11.4.2 常见区块与区块合并 417
11.4.3 区块的对齐值 419
11.4.4 文件偏移与虚拟地址的转换 419
11.5 输入表 421
11.5.1 输入函数的调用 421
11.5.2 输入表的结构 422
11.5.3 输入地址表 424
11.5.4 输入表实例分析 424
11.6 绑定输入 428
11.7 输出表 429
11.7.1 输出表的结构 430
11.7.2 输出表实例分析 431
11.8 基址重定位 432
11.8.1 基址重定位的概念 432
11.8.2 基址重定位表的结构 433
11.8.3 基址重定位表实例分析 434
11.9 资源 435
11.9.1 资源结构 435
11.9.2 资源结构实例分析 438
11.9.3 资源编辑工具 440
11.10 TLS初始化 440
11.11 调试目录 441
11.12 延迟载入数据 441
11.13 程序异常数据 442
11.14 .NET头部 442
11.15 编写PE分析工具 443
11.15.1 检查文件格式 443
11.15.2 读取FileHeader和OptionalHeader的内容 444
11.15.3 得到数据目录表信息 445
11.15.4 得到区块表信息 446
11.15.5 得到输出表信息 447
11.15.6 得到输入表信息 448
第12章 注入技术 450
12.1 DLL注入方法 450
12.1.1 通过干预输入表处理过程加载目标DLL 450
12.1.2 改变程序运行流程使其主动加载目标DLL 466
12.1.3 利用系统机制加载DLL 484
12.2 DLL注入的应用 491
12.3 DLL注入的防范 491
12.3.1 驱动层防范 491
12.3.2 应用层防范 493
第13章 Hook技术 497
13.1 Hook概述 497
13.1.1 IAT Hook篡改MessageBox消息 497
13.1.2 Inline Hook篡改指定MessageBox消息 499
13.2 Hook的分类 500
13.2.1 Address Hook 501
13.2.2 Inline Hook 511
13.2.3 基于异常处理的Hook 513
13.2.4 不是Hook的Hook 514
13.3 Hook位置的挑选 515
13.4 Hook的典型过程 519
13.4.1 Address Hook的实施过程 519
13.4.2 Inline Hook的实施过程 526
13.4.3 基于异常处理的Hook实施过程 529
13.4.4 二次Hook的注意事项 532
13.4.5 通用Hook引擎的实现 533
13.5 Detour函数的典型用法 533
13.6 Hook中的注意事项 536
13.7 Hook在x64平台上的新问题 541
13.8 Hook技术的应用 543
13.9 Hook的检测、恢复与对抗 544
13.9.1 Hook的检测与恢复 544
13.9.2 Hook的对抗 545
13.10 本章小结 546

漏洞篇
第14章 漏洞分析技术 548
14.1 软件漏洞原理 548
14.1.1 缓冲区溢出漏洞 548
14.1.2 整型溢出漏洞 553
14.1.3 UAF漏洞 555
14.2 Shellcode 555
14.2.1 Shellcode的结构 556
14.2.2 Shellcode通用技术 559
14.2.3 实战Shellcode编写 560
14.3 漏洞利用 566
14.3.1 漏洞利用基本技术 567
14.3.2 漏洞利用高级技术 570
14.4 漏洞样本 572
14.5 样本分析 573
14.5.1 准备工作 573
14.5.2 静态分析 574
14.5.3 动态调试 576
14.5.4 追根溯源 581
14.5.5 小结 585

脱壳篇
第15章 专用加密软件 588
15.1 认识壳 588
15.1.1 壳的概念 588
15.1.2 压缩引擎 589
15.2 压缩壳 589
15.2.1 UPX 589
15.2.2 ASPack 590
15.3 加密壳 590
15.3.1 ASProtect 590
15.3.2 Armadillo 590
15.3.3 EXECryptor 591
15.3.4 Themida 591
15.4 虚拟机保护软件 592
15.4.1 虚拟机介绍 592
15.4.2 VMProtect简介 592
第16章 脱壳技术 594
16.1 基础知识 594
16.1.1 壳的加载过程 594
16.1.2 脱壳机 595
16.1.3 手动脱壳 596
16.2 寻找OEP 596
16.2.1 根据跨段指令寻找OEP 596
16.2.2 用内存访问断点寻找OEP 600
16.2.3 根据栈平衡原理寻找OEP 601
16.2.4 根据编译语言特点寻找OEP 602
16.3 抓取内存映像 603
16.3.1 Dump原理 603
16.3.2 反Dump技术 604
16.4 重建输入表 606
16.4.1 输入表重建的原理 606
16.4.2 确定IAT的地址和大小 607
16.4.3 根据IAT重建输入表 608
16.4.4 用Import REC重建输入表 611
16.4.5 输入表加密概括 614
16.5 DLL文件脱壳 615
16.5.1 寻找OEP 615
16.5.2 Dump映像文件 617
16.5.3 重建DLL的输入表 618
16.5.4 构造重定位表 619
16.6 附加数据 621
16.7 PE文件的优化 623
16.8 压缩壳 626
16.8.1 UPX外壳 626
16.8.2 ASPack外壳 629
16.9 加密壳 633
16.10 静态脱壳 637
16.10.1 外壳Loader分析 637
16.10.2 编写静态脱壳器 641

保护篇
第17章 软件保护技术 644
17.1 防范算法求逆 644
17.1.1 基本概念 644
17.1.2 堡垒战术 645
17.1.3 游击战术 646
17.2 抵御静态分析 647
17.2.1 花指令 647
17.2.2 SMC技术实现 649
17.2.3 信息隐藏 653
17.2.4 简单的多态变形技术 654
17.3 文件完整性检验 655
17.3.1 磁盘文件校验的实现 655
17.3.2 校验和 657
17.3.3 内存映像校验 657
17.4 代码与数据结合 659
17.4.1 准备工作 660
17.4.2 加密算法的选用 661
17.4.3 手动加密代码 661
17.4.4 使 .text区块可写 662
17.5 关于软件保护的若干忠告 663
第18章 反跟踪技术 665
18.1 由BeingDebugged引发的蝴蝶效应 665
18.1.1 BeingDebugged 665
18.1.2 NtGlobalFlag 669
18.1.3 Heap Magic 671
18.1.4 从源头消灭BeingDebugged 676
18.2 回归Native:用户态的梦魇 676
18.2.1 CheckRemoteDebuggerPresent 677
18.2.2 ProcessDebugPort 677
18.2.3 ThreadHideFromDebugger 680
18.2.4 DebugObject 682
18.2.5 SystemKernelDebuggerInformation 686
18.2.6 Native API 688
18.2.7 Hook和AntiHook 693
18.3 真正的奥秘:小技巧一览 696
18.3.1 SoftICE检测方法 696
18.3.2 OllyDbg检测方法 698
18.3.3 调试器漏洞 700
18.3.4 防止调试器附加 701
18.3.5 父进程检测 703
18.3.6 时间差 703
18.3.7 通过Trap Flag检测 704
18.3.8 双进程保护 704
第19章 外壳编写基础 705
19.1 外壳的结构 705
19.2 加壳主程序 706
19.2.1 判断文件是否为PE格式 706
19.2.2 文件基本数据读入 706
19.2.3 附加数据的读取 708
19.2.4 输入表的处理 708
19.2.5 重定位表的处理 711
19.2.6 文件的压缩 713
19.2.7 资源数据的处理 716
19.2.8 区块的融合 720
19.3 用汇编写外壳部分 721
19.3.1 外壳的加载过程 721
19.3.2 自建输入表 722
19.3.3 外壳引导段 723
19.3.4 外壳第2部分 726
19.3.5 将外壳部分添加至原程序 731
19.4 用C++编写外壳部分 734
第20章 虚拟机的设计 739
20.1 虚拟机保护技术原理 739
20.1.1 反汇编引擎 739
20.1.2 指令分类 739
20.2 启动框架和调用约定 740
20.2.1 调度器 740
20.2.2 虚拟环境 741
20.2.3 平衡栈vBegin和vCheckESP 742
20.3 Handler的设计 743
20.3.1 辅助Handler 743
20.3.2 普通Handler和指令拆解 744
20.3.3 标志位问题 745
20.3.4 相同作用的指令 745
20.3.5 转移指令 746
20.3.6 转移跳转指令的另一种实现 747
20.3.7 call指令 748
20.3.8 retn指令 748
20.3.9 不可模拟指令 749
20.4 托管代码的异常处理 749
20.4.1 VC++的异常处理 749
20.4.2 Delphi的异常处理 754
20.5 本章小结 757
第21章 VMProtect逆向和还原浅析 758
21.1 VMProtect逆向分析 758
21.1.1 VMProtect虚拟执行引擎的全景图 758
21.1.2 VMProtect虚拟引擎的基本架构 763
21.1.3 指令分类 763
21.2 VMProtect的还原 765
21.2.1 虚拟执行系统 766
21.2.2 生成完整的字节码流程图 767
21.2.3 给Handler命名并添加语义动作 774
21.2.4 将字节码的低级描述转换为中级描述 775
21.2.5 清除无用的字节码 776
21.2.6 用真值表化简逻辑指令 776
21.2.7 从特征中建立部分寄存器映射信息 779
21.2.8 其他无法确定的寄存器的图着色算法 785
21.2.9 使用DAG匹配生成指令 788
21.2.10 其他问题 791

软件重构篇
第22章 补丁技术 794
22.1 文件补丁 794
22.2 内存补丁 795
22.2.1 跨进程内存存取机制 795
22.2.2 Debug API机制 797
22.2.3 利用调试寄存器机制 800
22.2.4 利用DLL注入技术 803
22.2.5 利用Hook技术 807
22.2.6 利用VT技术 810
22.3 SMC补丁技术 813
22.3.1 单层SMC补丁技术 813
22.3.2 多层SMC补丁技术 814
22.4 补丁工具 816
第23章 代码的二次开发 818
23.1 数据对齐 818
23.2 增加空间 818
23.2.1 区块间隙 818
23.2.2 手动构造区块 819
23.2.3 工具辅助构造区块 820
23.3 获得函数的调用信息 820
23.3.1 增加输入函数 820
23.3.2 显式链接调用DLL 821
23.4 代码的重定位 822
23.4.1 修复重定位表 822
23.4.2 代码的自定位技术 824
23.5 增加输出函数 825
23.6 消息循环 826
23.6.1 WndProc函数 826
23.6.2 寻找消息循环 827
23.6.3 WndProc汇编形式 828
23.7 菜单扩展 829
23.7.1 扩充WndProc 829
23.7.2 扩充Exit菜单的功能 830
23.7.3 扩充Open菜单的功能 830
23.8 DLL扩展 833
23.8.1 扩展接口 833
23.8.2 扩展消息循环 834

语言和平台篇
第24章 .NET平台加解密 838
24.1 .NET概述 838
24.1.1 什么是 .NET 838
24.1.2 基本概念 839
24.1.3 第1个 .NET程序 840
24.2 MSIL与元数据 841
24.2.1 PE结构的扩展 841
24.2.2 .NET下的汇编MSIL 847
24.2.3 MSIL与元数据的结合 849
24.3 代码分析与修改技术 851
24.3.1 静态分析 851
24.3.2 动态调试 853
24.3.3 代码修改 855
24.4 .NET代码保护技术及其逆向 857
24.4.1 强名称 857
24.4.2 名称混淆 859
24.4.3 流程混淆 863
24.4.4 压缩 865
24.4.5 加密 869
24.4.6 其他保护手段 875
24.5 本章小结 876

取证篇
第25章 数据取证技术 878
25.1 硬盘数据的获取和固定 878
25.1.1 硬盘数据的获取 878
25.1.2 电子数据的固定 882
25.2 硬盘的分区和数据恢复 882
25.2.1 分区的解析 884
25.2.2 基于文件系统的数据恢复原理 886
25.3 内存分析 890
25.3.1 内存镜像的获取 891
25.3.2 内存镜像的分析 894
25.4 动态仿真技术 897
25.4.1 仿真专用硬件 897
25.4.2 软件仿真 898
25.5 注册表 900
25.5.1 Hive文件 900
25.5.2 注册表中的时间 901
25.5.3 USB移动存储设备 902
25.6 文件格式 903
25.6.1 文件修复和特征码 903
25.6.2 基于文件的数据恢复技术 904
25.6.3 数据隐藏的分析 906

术语表 909
参考文献 911

读者评论

图书类别

同系列书

  • Android软件安全权威指南

    丰生强 (作者)

    本书从平台搭建和语言基础开始,循序渐进地讲解了Android平台上的软件安全技术,提供了对Windows、Linux、macOS三个平台的支持,涉及与Andro...

     
  • 极限黑客攻防:CTF赛题揭秘

    王新辉 天融信阿尔法实验室 张黎元 郭勇生 (作者)

    CTF在网络安全领域特指网络安全技术人员之间进行技术竞技的一种比赛。CTF代替了以往黑客通过互相发起真实攻击进行技术比拼的方式,题目来自日常工作环境,并将其中的...

    ¥99.00
  • 网页木马攻防实战

    罗诗尧 (作者)

    介绍网页木马发展的历史、网页木马剖析、调试器与脚本语言、缓冲区溢出的概念、shellcode的编写、网马免杀方法、网马实例编写与分析、网页木马的防范等内容。 ...

    ¥48.00
  • 代码优化:有效使用内存(含光盘1张)

    Kris Kaspersky(克瑞丝·凯斯宾革)著 (作者) 谭明金 谭明金 (译者)

    本书主要介绍该书作者对计算机底层有深入的了解,市面上没有很好的这方面的书籍。这本书将和上一本一起组成我们的安全精品系列。 本书关注代码的优化,有效的内存使用。...

    ¥48.00
  • 数据恢复技术(经典重现版)

    戴士剑 (作者)

    数据恢复技术逐渐成为一门常用技术,它通过各种手段把丢失和遭到破坏的数据还原为正常数据。本书通过多个典型实例详细介绍了Windows系统下数据恢复技术的原理和方法...

    ¥99.00

相关图书

最强iOS和macOS安全宝典

Jonathan Levin (作者) 郑旻 (译者)

《最强iOS和macOS安全宝典》以苹果操作系统的安全为主题,主要面向苹果高级用户、系统管理员、安全研究人员和黑客。<br>本书主要分三个部分:第一部分重点介绍...

¥179.00

极限黑客攻防:CTF赛题揭秘

王新辉 天融信阿尔法实验室 张黎元 郭勇生 (作者)

CTF在网络安全领域特指网络安全技术人员之间进行技术竞技的一种比赛。CTF代替了以往黑客通过互相发起真实攻击进行技术比拼的方式,题目来自日常工作环境,并将其中的...

¥99.00

大型互联网企业安全架构

石祖文 (作者)

本书全面阐述了新一代安全理论与安全架构,并结合作者自身经验层层剖析了包括Google 公司在内的各大互联网企业所应用的各种关键安全技术的原理及具体实现。全书分为...

¥55.30

Spring Security实战

陈木鑫 (作者)

Spring Security 是一个强大且高度可定制的安全框架,致力于为Java 应用提供身份认证和授权。 本书通过4 部分内容由浅入深地介绍了Spring...

 

Android软件安全权威指南

丰生强 (作者)

本书从平台搭建和语言基础开始,循序渐进地讲解了Android平台上的软件安全技术,提供了对Windows、Linux、macOS三个平台的支持,涉及与Andro...

 

Kali Linux大揭秘

(美国)Raphael Hertzog,(美国)Jim O'Gorman (作者) 诸葛建伟 (译者)

Kali Linux是设计用于数字取证和渗透测试的操作系统,本书是官方出版的仅有的一本著作。讲述了如何上手、配置、安全加固、自定义、安全评估等概念。<br>在本...

¥59.00