描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111689911
这是一部系统讲解反汇编与逆向分析技术原理、流程、方法和实用技巧的著作。
本书第1版出版于2011年,10年来畅销不衰,成为反汇编与逆向工程领域的标志性著作,被数十万安全工程师和C++工程师奉为瑰宝。在全球学术界和企业界都享有盛誉,故第2版得到了全球15位安全技术专家的倾力推荐。第2版在技术、工具和案例等方面做了大量的更新和补充。
通过本书,你将掌握以下知识或技能:
?逆向分析技术的工具和原理;
?逆向分析技术的流程和方法;
?逆向分析技术的精髓和实用技巧;
?软件调试的技术原理,以及代码运行时的内存表现;
?C++语法的实现机制和反汇编表现形式;
全书共18章,分为三个部分:
第1部分 准备工作 (第1章)
简单地介绍了编译器、调试器和反汇编静态分析工具的使用方法以及反汇编引擎的工作原理;
第二部分C++反汇编揭秘(第2~13章)
以多种编译器为例解析了每个C/C++知识点的汇编表现形式,通过整理反汇编代码梳理流程和脉络,讲解了调试和识别各种C/C++语句的方法,并且深入剖析各知识点的底层机制;
第三部分 逆向分析技术应用(第14~18章)
通过对PEiD、调试器 OllyDbg、木马、勒索病毒等实际应用的逆向分析,带领读者领路逆向分析技术的魔力,并加深对所学理论知识的理解。
序一
序二
序三
前言
部分 准备工作
第1章 熟悉工作环境和相关工具2
1.1 安装Visual Studio 20192
1.2 安装GCC6
1.3 调试工具OllyDbg12
1.4 调试工具x64dbg14
1.5 调试工具WinDbg15
1.6 反汇编静态分析工具IDA17
1.7 反汇编引擎的工作原理22
1.8 本章小结27
第二部分 C++反汇编揭秘
第2章 基本数据类型的表现形式30
2.1 整数类型30
2.1.1 无符号整数30
2.1.2 有符号整数31
2.2 浮点数类型32
2.2.1 浮点数的编码方式33
2.2.2 基本的浮点数指令35
2.3 字符和字符串43
2.3.1 字符的编码43
2.3.2 字符串的存储方式44
2.4 布尔类型45
2.5 地址、指针和引用46
2.5.1 指针和地址的区别46
2.5.2 各类型指针的工作方式47
2.5.3 引用56
2.6 常量60
2.6.1 常量的定义60
2.6.2 #define和const的区别62
2.7 本章小结65
第3章 认识启动函数,找到用户入口66
3.1 程序的真正入口66
3.2 了解VS2019的启动函数66
3.3 main函数的识别70
3.4 本章小结71
第4章 观察各种表达式的求值过程72
4.1 算术运算和赋值72
4.1.1 各种算术运算的工作形式72
4.1.2 算术结果溢出130
4.1.3 自增和自减131
4.2 关系运算和逻辑运算136
4.2.1 关系运算和条件跳转的对应136
4.2.2 表达式短路137
4.2.3 条件表达式141
4.3 位运算149
4.4 编译器使用的优化技巧152
4.4.1 流水线优化规则155
4.4.2 分支优化规则158
4.4.3 高速缓存优化规则159
4.5 一次算法逆向之旅159
4.6 本章小结164
第5章 流程控制语句的识别165
5.1 if语句165
5.2 if…else…语句168
5.3 用if构成的多分支流程174
5.4 switch的真相180
5.5 难以构成跳转表的switch196
5.6 降低判定树的高度201
5.7 do、while、for的比较206
5.8 编译器对循环结构的优化214
5.9 本章小结220
第6章 函数的工作原理221
6.1 栈帧的形成和关闭221
6.2 各种调用方式的考察222
6.3 使用ebp或esp寻址226
6.4 函数的参数230
6.5 函数的返回值232
6.6 x64调用约定235
6.7 本章小结238
第7章 变量在内存中的位置和访问方式239
7.1 全局变量和局部变量的区别239
7.2 局部静态变量的工作方式247
7.3 堆变量252
7.4 本章小结256
第8章 数组和指针的寻址257
8.1 数组在函数内257
8.2 数组作为参数266
8.3 数组作为返回值270
8.4 下标寻址和指针寻址276
8.5 多维数组282
8.6 存放指针类型数据的数组288
8.7 指向数组的指针变量290
8.8 函数指针296
8.9 本章小结299
第9章 结构体和类300
9.1 对象的内存布局300
9.2 this指针305
9.3 静态数据成员311
9.4 对象作为函数参数314
9.5 对象作为返回值322
9.6 本章小结329
第10章 构造函数和析构函数331
10.1 构造函数的出现时机331
10.2 每个对象是否都有默认的构造函数353
10.3 析构函数的出现时机355
10.4 本章小结375
第11章 虚函数377
11.1 虚函数的机制377
11.2 虚函数的识别383
11.3 本章小结389
第12章 从内存角度看继承和多重继承391
12.1 识别类和类之间的关系392
12.2 多重继承418
12.3 抽象类426
12.4 虚继承428
12.5 本章小结443
第13章 异常处理445
13.1 异常处理的相关知识445
13.2 异常类型为基本数据类型的处理流程451
13.3 异常类型为对象的处理流程459
13.4 识别异常处理464
13.5 x64异常处理475
13.5.1 RUNTIME_FUNCTION结构476
13.5.2 UNWIND_INFO结构476
13.5.3 UNWIND_CODE结构478
13.5.4 特定于语言的处理程序478
13.5.5 x64 FuncInfo的变化479
13.5.6 还原x64的try…catch481
13.6 本章小结484
第三部分 逆向分析技术应用
第14章 PEiD的工作原理分析486
14.1 开发环境的识别486
14.2 开发环境的伪造494
14.3 本章小结497
第15章 调试器OllyDbg的工作原理分析498
15.1 INT3断点498
15.2 内存断点503
15.3 硬件断点507
15.4 异常处理机制513
15.5 加载调试程序519
15.6 本章小结522
第16章 大灰狼远控木马逆向分析523
16.1 调试环境配置523
16.2 病毒程序初步分析524
16.3 启动过程分析525
16.4 通信协议分析532
16.5 远控功能分析536
16.6 本章小结551
第17章 WannaCry勒索病毒逆向分析552
17.1 tasksche.exe勒索程序逆向分析552
17.1.1 病毒初始化552
17.1.2 加载病毒核心代码558
17.1.3 病毒核心代码562
17.2 mssecsvc.exe蠕虫程序逆向分析569
17.2.1 蠕虫病毒代码初始化569
17.2.2 发送漏洞攻击代码573
17.3 永恒之蓝MS17-010漏洞原理分析577
17.3.1 漏洞1利用分析577
17.3.2 漏洞2利用分析583
17.3.3 漏洞3利用分析584
17.4 本章小结586
第18章 反汇编代码的重建与编译587
18.1 重建反汇编代码587
18.2 编译重建后的反汇编代码590
18.3 本章小结591
参考文献592
“时下的IDE很多都是极其优秀的,拜其所赐,职场上的程序员多出十几倍,但是又有多少人能理解程序内部的机制呢?”
—侯捷
随着软件技术的发展及其在各个领域的广泛应用,对软件进行逆向分析,通过阅读其反汇编代码推断数据结构、体系结构和程序设计思路的需求越来越多。逆向分析技术能帮助我们更好地研究和学习先进的软件技术,特别是当我们非常想知道某个软件的某些功能是如何实现的而手头又没有合适的资料时。
如果能够利用逆向技术去研究一些一流软件的设计思想和实现方法,那么我们的软件技术水平将会得到极大的提升。目前,国内关于逆向分析技术的资料实在不多,大中专院校的计算机相关专业对此技术也没有足够的重视。
有很多人认为研究程序的内部原理会破坏“黑盒子”的封装性,但是如果我们只是在别人搭建好的平台上做开发,那么始终只能使用别人提供的未开源的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章讲解了反汇编代码的重建与编译。通过这部分内容
评论
还没有评论。