商家名称 | 信用等级 | 购买信息 | 订购本书 |
C++反汇编与逆向分析技术揭秘(作者钱林松) | |||
C++反汇编与逆向分析技术揭秘(作者钱林松) |
《C++反汇编与逆向分析技术揭秘》:深度揭秘软件逆向分析技术的流程与方法,理论与实践完美结合,由安全领域资深专家亲自执笔,看雪软件安全网站创始人段钢等多位安全领域专家联袂推荐。
“工欲善其事,必先利其器”。我经常对课题组的研究生说:“学习知识要把握事物本质(即夯实基础),基础牢固了,学习任何技术都能事半功倍,反之亦然。”这是一本能为程序员(尤其是C++程序员)打牢基础的专业书籍,它将引导你一步一步去深入探究和分析程序的本质,从而逐渐让你在专业上感到踏实和自信,并在这个领域有豁然开朗的感觉。本书非常适合那些想通过反汇编与逆向分析等技术手段探究C++应用底层奥秘的人,当然,你还要能耐得住寂寞!
——彭国军 武汉大学计算机学院副教授
我与老钱相识已经相当长时间了,他给我的印象是为人简单、厚道、仗义。他的书一如他的为人,用简单、精炼、易懂的语言诠释了程序世界里晦涩难懂的反汇编与逆向分析技术,是一本不可多得的好书。
——霄建云 中南民族大学计算机科学学院副院长
随着互联网技术的不断发展,以及互联网应用的不断暴增和普及,计算机系统的安全保护在今天已经成为一个重要的课题。有一群默默无闻的工作者,他们的职业是“病毒分析”,一个合格的病毒分析人员必须具备过硬的软件逆向技术。本书是一本可以给病毒分析人员系统而全面的指导的专业书籍,对反汇编与逆向分析技术进行了深入且全面的讲解,对有志于从事软件安全相关工作的人来说,本书将对他们大有裨益,值得推荐。
——蠕辉 金山网络安全副总监
一口气读完本书的初稿,细细回味,有几点突出的感受:第一,视角独特、内容丰富,是作者多年实践和教学经验的结晶;第二,深入浅出、重视基础,不适合走马观花式地阅读,而是要慢慢研读;第三,内容严谨、语言精炼,从中可以看出作者对逆向分析技术之精通和写作本书的良苦用心。如果你想系统且深入地学习反汇编与逆向分析技术,本书是非常不错的选择,强烈推荐!
——单海波 安全技术专家/《微软,NET程序的加密与解密》一书的合著者
软件逆向工程主要是通过研究和分析现有的软件产品来发现其规律,从而改进并超越现有产品的过程。通过逆向工程技术,研究人员可以学习他人的编程技术和技巧,窥探商业软件的秘密,或开发与其兼容的软件。同时,利用逆向工程技术可以对现有软件进行改造,可以在没有源代码的情况下修改目标程序的二进制代码,扩展程序的功能。掌握一定的逆向技术,对程序员和安全工作者十分有好处。但由于技术比较复杂,初学者往往不知从何入手,既不知道学习的方向,又缺少经验和有效的分析工具,大都事倍功半。本书是学习逆向工程技术的一个很好的选择,它从软件逆向技术的基础开始讲解,逐步深入,在注重阐述逆向技术理论的同时,又结合生动的案例分析,深入浅出地向读者展示了软件逆向技术的精髓和实用技巧,能够帮助读者快速深入逆向工程技术的核心领域,获得宝贵的知识和经验。诚然,要深入理解并熟练应用逆向工程技术,需要大家的勤奋与毅力,这个过程可能有时是枯燥的,但是当你的功力达到一定水平的时候,你会在软件分析的过程中产生一种直觉,看到目标的汇编代码,就能知道它们的作用和隐藏在其中的奥秘。这时,你会发现逆向工程是一门优雅的数码艺术展现形式,它的精神是“自由”。
——段钢看雪软件安全网站创始人
钱林松,资深安全技术专家、软件开发工程师和架构师,从事计算机安全和软件开发工作12年,实践经验极其丰富。尤其精通软件逆向分析技术,对C/C++技术和Windows的底层机制也有非常深入的研究。武汉科锐软件技术有限公司创始人,教学经验丰富,多年来,为国内计算机安全领域培养和输送了大量的人才。活跃于看雪软件安全网站,有较高的知名度和影响力。
前言
第一部分 准备工作
第1章 熟悉工作环境和相关工具 / 2
1.1 调试工具Microsoft Visual C++ 6.0和OllyDBG / 2
1.2 反汇编静态分析工具IDA / 5
1.3 反汇编引擎的工作原理 / 11
1.4 本章小结 / 16
第二部分 C++反汇编揭秘
第2章 基本数据类型的表现形式 / 18
2.1 整数类型 / 18
2.1.1 无符号整数 / 18
2.1.2 有符号整数 / 18
2.2 浮点数类型 / 20
2.2.1 浮点数的编码方式 / 21
2.2.2 基本的浮点数指令 / 23
2.3 字符和字符串 / 26
2.3.1 字符的编码 / 27
2.3.2 字符串的存储方式 / 28
2.4 布尔类型 / 29
2.5 地址、指针和引用 / 29
2.5.1 指针和地址的区别 / 30
2.5.2 各类型指针的工作方式 / 31
2.5.3 引用 / 34
2.6 常量 / 35
2.6.1 常量的定义 / 36
2.6.2 #define和const的区别 / 37
2.7 本章小结 / 38
第3章 认识启动函数,找到用户入口 / 40
3.1 程序的真正入口 / 40
3.2 了解VC++ 6.0的启动函数 / 40
3.3 main函数的识别 / 44
3.4 本章小结 / 46
第4章 观察各种表达式的求值过程 / 47
4.1 算术运算和赋值 / 47
4.1.1 各种算术运算的工作形式 / 47
4.1.2 算术结果溢出 / 82
4.1.3 自增和自减 / 83
4.2 关系运算和逻辑运算 / 85
4.2.1 关系运算和条件跳转的对应 / 85
4.2.2 表达式短路 / 86
4.2.3 条件表达式 / 88
4.3 位运算 / 92
4.4 编译器使用的优化技巧 / 94
4.4.1 流水线优化规则 / 97
4.4.2 分支优化规则 / 101
4.4.3 高速缓存(cache)优化规则 / 101
4.5 一次算法逆向之旅 / 102
4.6 本章小结 / 109
第5章 流程控制语句的识别 / 110
5.1 if语句 / 110
5.2 if…else…语句 / 112
5.3 用if构成的多分支流程 / 115
5.4 switch的真相 / 119
5.5 难以构成跳转表的switch / 128
5.6 降低判定树的高度 / 133
5.7 do/while/for的比较 / 137
5.8 编译器对循环结构的优化 / 143
5.9 本章小结 / 148
第6章 函数的工作原理 / 149
6.1 栈帧的形成和关闭 / 149
6.2 各种调用方式的考察 / 152
6.3 使用ebp或esp寻址 / 155
6.4 函数的参数 / 158
6.5 函数的返回值 / 160
6.6 回顾 / 163
6.7 本章小结 / 165
第7章 变量在内存中的位置和访问方式 / 166
7.1 全局变量和局部变量的区别 / 166
7.2 局部静态变量的工作方式 / 169
7.3 堆变量 / 173
7.4 本章小结 / 177
第8章 数组和指针的寻址 / 178
8.1 数组在函数内 / 178
8.2 数组作为参数 / 181
8.3 数组作为返回值 / 185
8.4 下标寻址和指针寻址 / 189
8.5 多维数组 / 193
8.6 存放指针类型数据的数组 / 199
8.7 指向数组的指针变量 / 201
8.8 函数指针 / 204
8.9 本章小结 / 206
第9章 结构体和类 / 207
9.1 对象的内存布局 / 207
9.2 this指针 / 212
9.3 静态数据成员 / 217
9.4 对象作为函数参数 / 219
9.5 对象作为返回值 / 226
9.6 本章小结 / 231
第10章 关于构造函数和析构函数 / 233
10.1 构造函数的出现时机 / 233
10.2 每个对象都有默认的构造函数吗 / 243
10.3 析构函数的出现时机 / 245
10.4 本章小结 / 254
第11章 关于虚函数 / 256
11.1 虚函数的机制 / 256
11.2 虚函数的识别 / 261
11.3 本章小结 / 268
第12章 从内存角度看继承和多重继承 / 269
12.1 识别类和类之间的关系 / 270
12.2 多重继承 / 292
12.3 虚基类 / 298
12.4 菱形继承 / 299
12.5 本章小结 / 307
第13章 异常处理 / 308
13.1 异常处理的相关知识 / 308
13.2 异常类型为基本数据类型的处理流程 / 314
13.3 异常类型为对象的处理流程 / 323
13.4 识别异常处理 / 329
13.5 本章小结 / 341
第三部分 逆向分析技术应用
第14章 PEiD的工作原理分析 / 344
14.1 开发环境的识别 / 344
14.2 开发环境的伪造 / 353
14.3 本章小结 / 356
第15章 “熊猫烧香”病毒逆向分析 / 357
15.1 调试环境配置 / 357
15.2 病毒程序初步分析 / 358
15.3 “熊猫烧香”的启动过程分析 / 360
15.4 “熊猫烧香”的自我保护分析 / 366
15.5 “熊猫烧香”的感染过程分析 / 369
15.6 本章小结 / 379
第16章 调试器OllyDBG的工作原理分析 / 380
16.1 INT3断点 / 380
16.2 内存断点 / 385
16.3 硬件断点 / 390
16.4 异常处理机制 / 396
16.5 加载调试程序 / 402
16.6 本章小结 / 406
第17章 反汇编代码的重建与编译 / 407
17.1 重建反汇编代码 / 407
17.2 编译重建后的反汇编代码 / 410
17.3 本章小结 / 411
参考文献 / 412