C++反汇编与逆向分析技术揭秘(第2版)
作者简介钱林松资深安全技术专家、软件开发工程师和架构师。从事计算机安全和软件开发工作近20年,实践经验丰富,尤其精通软件逆向分析技术,对C/C++技术和Windows的底层机制也有非常深入的研究。武汉科锐软件技术有限公司(国内知名的安全教育机构)创始人,教学经验丰富,多年来,为国内计算机安全领域培养和输送了大量的人才。活跃于看雪论坛,有较高的知名度和影响力。张延清软件逆向教育专家,看雪论坛技术专家。2004年从事数控机床加工编程,2006年进入游戏编程及C/C++开发与逆向分析领域,2011年就职于武汉科锐软件技术有限公司,任技术总监兼授课老师。创立国内 Android软件逆向分析教育课程体系,该课程体系被多家培训教育机构采用。科锐·安全实训领军者科锐(www.51asm.com)创办自2007年,一直专注于逆向分析人才培养,毕业学员逾千人,广泛就业于各安全企业,从事技术与技术管理工作。科锐通过一套严格的科学考核体系,确保学员对每一个知识点的掌握,从…
查看完整
查看完整
内容简介
这是一部系统讲解反汇编与逆向分析技术原理、流程、方法和实用技巧的著作。
本书第1版出版于2011年,10年来畅销不衰,成为反汇编与逆向工程领域的标志性著作,被数十万安全工程师和C++工程师奉为瑰宝。在全球学术界和企业界都享有盛誉,故第2版得到了全球15位安全技术专家的倾力推荐。第2版在技术、工具和案例等方面做了大量的更新和补充。
通过本书,你将掌握以下知识或技能:
?逆向分析技术的工具和原理;
?逆向分析技术的流程和方法;
?逆向分析技术的精髓和实用技巧;
?软件调试的技术原理,以及代码运行时的内存表现;
查看完整
这是一部系统讲解反汇编与逆向分析技术原理、流程、方法和实用技巧的著作。
本书第1版出版于2011年,10年来畅销不衰,成为反汇编与逆向工程领域的标志性著作,被数十万安全工程师和C++工程师奉为瑰宝。在全球学术界和企业界都享有盛誉,故第2版得到了全球15位安全技术专家的倾力推荐。第2版在技术、工具和案例等方面做了大量的更新和补充。
通过本书,你将掌握以下知识或技能:
?逆向分析技术的工具和原理;
?逆向分析技术的流程和方法;
?逆向分析技术的精髓和实用技巧;
?软件调试的技术原理,以及代码运行时的内存表现;
查看完整
赞誉
序一
序二
序三
前言
部分 准备工作
第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
^ 收 起
序一
序二
序三
前言
部分 准备工作
第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
^ 收 起
作者简介钱林松资深安全技术专家、软件开发工程师和架构师。从事计算机安全和软件开发工作近20年,实践经验丰富,尤其精通软件逆向分析技术,对C/C++技术和Windows的底层机制也有非常深入的研究。武汉科锐软件技术有限公司(国内知名的安全教育机构)创始人,教学经验丰富,多年来,为国内计算机安全领域培养和输送了大量的人才。活跃于看雪论坛,有较高的知名度和影响力。张延清软件逆向教育专家,看雪论坛技术专家。2004年从事数控机床加工编程,2006年进入游戏编程及C/C++开发与逆向分析领域,2011年就职于武汉科锐软件技术有限公司,任技术总监兼授课老师。创立国内 Android软件逆向分析教育课程体系,该课程体系被多家培训教育机构采用。科锐·安全实训领军者科锐(www.51asm.com)创办自2007年,一直专注于逆向分析人才培养,毕业学员逾千人,广泛就业于各安全企业,从事技术与技术管理工作。科锐通过一套严格的科学考核体系,确保学员对每一个知识点的掌握,从而保证教学质量,使每一个毕业学员都能符合企业的用人需求。真正实现以实践为主的实训理念,是我们 终的实训目标。
^ 收 起
^ 收 起
内容简介
这是一部系统讲解反汇编与逆向分析技术原理、流程、方法和实用技巧的著作。
本书第1版出版于2011年,10年来畅销不衰,成为反汇编与逆向工程领域的标志性著作,被数十万安全工程师和C++工程师奉为瑰宝。在全球学术界和企业界都享有盛誉,故第2版得到了全球15位安全技术专家的倾力推荐。第2版在技术、工具和案例等方面做了大量的更新和补充。
通过本书,你将掌握以下知识或技能:
?逆向分析技术的工具和原理;
?逆向分析技术的流程和方法;
?逆向分析技术的精髓和实用技巧;
?软件调试的技术原理,以及代码运行时的内存表现;
?C++语法的实现机制和反汇编表现形式;
全书共18章,分为三个部分:
第1部分 准备工作 (第1章)
简单地介绍了编译器、调试器和反汇编静态分析工具的使用方法以及反汇编引擎的工作原理;
第二部分C++反汇编揭秘(第2~13章)
以多种编译器为例解析了每个C/C++知识点的汇编表现形式,通过整理反汇编代码梳理流程和脉络,讲解了调试和识别各种C/C++语句的方法,并且深入剖析各知识点的底层机制;
第三部分 逆向分析技术应用(第14~18章)
通过对PEiD、调试器 OllyDbg、木马、勒索病毒等实际应用的逆向分析,带领读者领路逆向分析技术的魔力,并加深对所学理论知识的理解。
^ 收 起
这是一部系统讲解反汇编与逆向分析技术原理、流程、方法和实用技巧的著作。
本书第1版出版于2011年,10年来畅销不衰,成为反汇编与逆向工程领域的标志性著作,被数十万安全工程师和C++工程师奉为瑰宝。在全球学术界和企业界都享有盛誉,故第2版得到了全球15位安全技术专家的倾力推荐。第2版在技术、工具和案例等方面做了大量的更新和补充。
通过本书,你将掌握以下知识或技能:
?逆向分析技术的工具和原理;
?逆向分析技术的流程和方法;
?逆向分析技术的精髓和实用技巧;
?软件调试的技术原理,以及代码运行时的内存表现;
?C++语法的实现机制和反汇编表现形式;
全书共18章,分为三个部分:
第1部分 准备工作 (第1章)
简单地介绍了编译器、调试器和反汇编静态分析工具的使用方法以及反汇编引擎的工作原理;
第二部分C++反汇编揭秘(第2~13章)
以多种编译器为例解析了每个C/C++知识点的汇编表现形式,通过整理反汇编代码梳理流程和脉络,讲解了调试和识别各种C/C++语句的方法,并且深入剖析各知识点的底层机制;
第三部分 逆向分析技术应用(第14~18章)
通过对PEiD、调试器 OllyDbg、木马、勒索病毒等实际应用的逆向分析,带领读者领路逆向分析技术的魔力,并加深对所学理论知识的理解。
^ 收 起
比价列表