编辑推荐
逆向工程是一种分析目标系统的过程。
本书专注于软件逆向工程,即研究编译后的可执行程序。本书是写给初学者
的一本经典指南。全书共分为12个部分,共102章,涉及软件逆向工程相关
的众多技术话题,堪称是逆向工程技术百科全书。全书讲解详细,附带丰富
的代码示例,还给出了很多习题来帮助读者巩固所学的知识,附录部分给出
了习题的解答。
本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者
阅读,也适合专业的程序开发人员参考。
“... 谨向这本出色的教程致以个人的敬意!”
—— Herbert Bos,阿姆斯特丹自由大学教授,《Modern Operating Systems (4th Edition)》作者
“... 引人入胜,值得一读!”
—— Michael Sikorski,《Practical Malware Analysis》的作者
内容简介
逆向工程是一种分析目标系统的过程,旨在于识别系统的各组件以及组件间关系,以便于通过其它形式、或在较高的抽象层次上,重建系统的表征。
本书专注于软件的逆向工程,是写给初学者的一本经典指南。全书共分为12个部分,共102章,涉及X86/X64、ARM/ARM-64、MIPS、Java/JVM等重要话题,详细解析了Oracle RDBMS、Itanium、软件狗、LD_PRELOAD、栈溢出、ELF、Win32 PE文件格式、x86-64(第、critical sections、syscalls、线程本地存储TLS、地址无关代码(PIC)、以配置文件为导向的优化、C++ STL、OpenMP、SHE等众多技术话题,堪称是逆向工程技术百科全书。除了详细讲解,本书来给出了很多习题来帮助读者巩固所学的知识,附录部分给出了习题的解答。
本书适合对逆向工程技术、操作系统底层技术、程序分析技术感兴趣的读者阅读,也适合专业的程序开发人员参考。
作者简介
Dennis Yurichev,乌克兰程序员,安全技术专家。读者可以
通过https://yurichev.com/联系他,并获取和本书相关的更多
学习资料。
目录
第一部分 编码模式
第1章 CPU简介 3
1.1 指令集的作用 3
第2章 最简函数 5
2.1 x86 5
2.2 ARM 5
2.3 MIPS 5
2.3.1 MIPS指令集与寄存器名称 6
第3章 Hello,world! 7
3.1 x86 7
3.1.1 MSVC 7
3.1.2 GCC 9
3.1.3 GCC:AT&T;语体 9
3.2 x86-64 11
3.2.1 MSVC-x86-64 11
3.2.2 GCC-x86-64 12
3.3 GCC的其他特性 12
3.4 ARM 13
3.4.1 Keil 6/2013——未启用优化功能的ARM模式 14
3.4.2 Thumb模式下、未开启优化选项的Keil 15
3.4.3 ARM模式下、开启优化选项的Xcode 15
3.4.4 Thumb-2模式下、开启优化选项的Xcode(LLVM) 16
3.4.5 ARM64 18
3.5 MIPS 19
3.5.1 全局指针Global pointer 19
3.5.2 Optimizing GCC 19
3.5.3 Non-optimizing GCC 21
3.5.4 栈帧 23
3.5.5 Optimizing GCC: GDB的分析方法 23
3.6 总结 24
3.7 练习 24
3.7.1 题目1 24
3.7.2 题目2 24
第4章 函数序言和函数尾声 25
4.1 递归调用 25
第5章 栈 26
5.1 为什么栈会逆增长? 26
5.2 栈的用途 27
5.2.1 保存函数结束时的返回地址 27
5.2.2 参数传递 28
5.2.3 存储局部变量 29
5.2.4 x86:alloca()函数 29
5.2.5 (Windows)SEH结构化
异常处理 31
5.2.6 缓冲区溢出保护 31
5.3 典型的栈的内存存储格式 31
5.4 栈的噪音 31
5.5 练习题 34
5.5.1 题目1 34
5.5.2 题目2 34
第6章 printf()函数与参数调用 36
6.1 x86 36
6.1.1 x86:传递3个参数 36
6.1.2 x64:传递9个参数 41
6.2 ARM 44
6.2.1 ARM模式下传递3个参数 44
6.2.2 ARM模式下传递8个参数 46
6.3 MIPS 50
6.3.1 传递3个参数 50
6.3.2 传递9个参数 52
6.4 总结 56
6.5 其他 57
第7章 scanf() 58
7.1 演示案例 58
7.1.1 指针简介 58
7.1.2 x86 58
7.1.3 MSVC+OllyDbg 60
7.1.4 x64 62
7.1.5 ARM 63
7.1.6 MIPS 64
7.2 全局变量 65
7.2.1 MSVC:x86 66
7.2.2 MSVC:x86+OllyDbg 67
7.2.3 GCC:x86 68
7.2.4 MSVC:x64 68
7.2.5 ARM: Optimizing Keil 6/2013
(Thumb模式) 69
7.2.6 ARM64 70
7.2.7 MIPS 70
7.3 scanf()函数的状态监测 74
7.3.1 MSVC:x86 74
7.3.2 MSVC:x86:IDA 75
7.3.3 MSVC:x86+OllyDbg 77
7.3.4 MSVC:x86+Hiew 78
7.3.5 MSVC:x64 79
7.3.6 ARM 80
7.3.7 MIPS 81
7.3.8 练习题 82
第8章 参数获取 83
8.1 x86 83
8.1.1 MSVC 83
8.1.2 MSVC+OllyDbg 84
8.1.3 GCC 84
8.2 x64 85
8.2.1 MSVC 85
8.2.2 GCC 86
8.2.3 GCC: uint64_t型参数 87
8.3 ARM 88
8.3.1 Non-optimizing Keil 6/2013
(ARM mode) 88
8.3.2 Optimizing Keil 6/2013
(ARM mode) 89
8.3.3 Optimizing Keil 6/2013
(Thumb mode) 89
8.3.4 ARM64 89
8.4 MIPS 91
第9章 返回值 93
9.1 void型函数的返回值 93
9.2 函数返回值不被调用的情况 94
9.3 返回值为结构体型数据 94
第10章 指针 96
10.1 全局变量 96
10.2 局部变量 98
10.3 总结 100
第11章 GOTO语句 101
11.1 无用代码Dead Code 102
11.2 练习题 102
第12章 条件转移指令 103
12.1 数值比较 103
12.1.1 x86 103
12.1.2 ARM 109
12.1.3 MIPS 112
12.2 计算绝对值 115
12.2.1 Optimizing MSVC 115
12.2.2 Optimizing Keil 6/2013: Thumb
mode 116
12.2.3 Optimizing Keil 6/2013: ARM
mode 116
12.2.4 Non-optimizng GCC 4.9
(ARM64) 116
12.2.5 MIPS 117
12.2.6 不使用转移指令 117
12.3 条件运算符 117
12.3.1 x86 117
12.3.2 ARM 118
12.3.3 ARM64 119
12.3.4 MIPS 119
12.3.5 使用if/else替代条件运算符 120
12.3.6 总结 120
12.3.7 练习题 120
12.4 比较最大值和最小值 120
12.4.1 32位 120
12.4.2 64位 123
12.4.3 MIPS 125
12.5 总结 125
12.5.1 x86 125
12.5.2 ARM 125
12.5.3 MIPS 126
12.5.4 不使用转移指令 126
第13章 switch()/case/default 128
13.1 case陈述式较少的情况 128
13.1.1 x86 128
13.1.2 ARM: Optimizing Keil 6/2013
(ARM mode) 133
13.1.3 ARM: Optimizing Keil 6/2013
(Thumb mode) 133
13.1.4 ARM64: Non-optimizing GCC
(Linaro) 4.9 134
13.1.5 ARM64: Optimizing GCC
(Linaro) 4.9 134
13.1.6 MIPS 135
13.1.7 总结 136
13.2 多个case从句 136
13.2.1 x86 136
13.2.2 ARM: Optimizing Keil 6/2013
(ARM mode) 140
13.2.3 ARM: Optimizing Keil 6/2013
(Thumb mode) 141
13.2.4 MIPS 143
13.2.5 总结 144
13.3 case从句多对一的情况 145
13.3.1 MSVC 145
13.3.2 GCC 147
13.3.3 ARM64: Optimizing
GCC 4.9.1 147
13.4 Fall-through 149
13.4.1 MSVC x86 149
13.4.2 ARM64 150
13.5 练习题 151
13.5.1 题目1 151
第14章 循环 152
14.1 举例说明 152
14.1.1 x86 152
14.1.2 x86:OllyDbg 155
14.1.3 x86:跟踪调试工具tracer 156
14.1.4 ARM 157
14.1.5 MIPS 160
14.1.6 其他 161
14.2 内存块复制 161
14.2.1 编译结果 161
14.2.2 编译为ARM模式的
程序 162
14.2.3 MIPS 163
14.2.4 矢量化技术 164
14.3 总结 164
14.4 练习题 165
14.4.1 题目1 165
14.4.2 题目2 165
14.4.3 题目3 166
14.4.4 题目4 167
第15章 C语言字符串的函数 170
15.1 strlen() 170
15.1.1 x86 170
15.1.2 ARM 174
15.1.3 MIPS 177
15.2 练习题 178
15.2.1 练习题1 178
第16章 数学计算指令的替换 181
16.1 乘法 181
16.1.1 替换为加法运算 181
16.1.2 替换为位移运算 181
16.1.3 替换为位移、加减法的
混合运算 182
16.2 除法运算 186
16.2.1 替换为位移运算 186
16.3 练习题 186
16.3.1 题目2 186
第17章 FPU 188
17.1 IEEE 754 188
17.2 x86 188
17.3 ARM、MIPD、x86/x64 SIMD 188
17.4 C/C++ 188
17.5 举例说明 189
17.5.1 x86 189
17.5.2 ARM: Optimizing Xcode
4.6.3 (LLVM) (ARM mode) 193
17.5.3 ARM: Optimizing Keil 6/2013
(Thumb mode) 193
17.5.4 ARM64: Optimizing GCC
(Linaro) 4.9 194
17.5.5 ARM64: Non-optimizing GCC
(Linaro) 4.9 195
17.5.6 MIPS 195
17.6 利用参数传递浮点型数据 196
17.6.1 x86 196
17.6.2 ARM + Non-optimizing
Xcode 4.6.3 (LLVM)
(Thumb-2 mode) 197
17.6.3 ARM + Non-optimizing Keil
6/2013 (ARM mode) 198
17.6.4 ARM64 + Optimizing GCC
(Linaro) 4.9 198
17.6.5 MIPS 199
17.7 比较说明 200
17.7.1 x86 200
17.7.2 ARM 216
17.7.3 ARM64 219
Optimizing GCC (Linaro) 4.9—float 220
17.7.4 MIPS 220
17.8 栈、计算器及逆波兰表示法 221
17.9 x64 221
17.10 练习题 221
17.10.1 题目1 221
17.10.2 题目2 221
第18章 数组 223
18.1 简介 223
18.1.1 x86 223
18.1.2 ARM 225
18.1.3 MIPS 228
18.2 缓冲区溢出 229
18.2.1 读取数组边界以外的内容 229
18.2.2 向数组边界之外的地址赋值 231
18.3 缓冲区溢出的保护方法 234
18.3.1 Optimizing Xcode 4.6.3 (LLVM)
(Thumb-2 mode) 236
18.4 其他 238
18.5 字符串指针 238
18.5.1 x64 239
18.5.2 32位ARM 240
18.5.3 ARM64 241
18.5.4 MIPS 242
18.5.5 数组溢出 242
18.6 多维数组 245
18.6.1 二维数组举例 246
18.6.2 以一维数组的方式访问
二维数组 247
18.6.3 三维数组 248
18.6.4 更多案例 251
18.7 二维字符串数组的封装格式 251
18.7.1 32位ARM 253
18.7.2 ARM64 254
18.7.3 MIPS 254
18.7.4 总结 255
18.8 本章小结 255
18.9 练习题 255
18.9.1 题目1 255
18.9.2 题目2 258
18.9.3 题目3 263
18.9.4 题目4 264
18.9.5 题目5 265
第19章 位操作 270
19.1 特定位 270
19.1.1 x86 270
19.1.2 ARM 272
19.2 设置/清除特定位 274
19.2.1 x86 274
19.2.2 ARM + Optimizing Keil 6/2013
(ARM mode) 277
19.2.3 ARM + Optimizing Keil 6/2013
(Thumb mode) 278
19.2.4 ARM + Optimizing Xcode (LLVM)
+ ARM mode 278
19.2.5 ARM:BIC指令详解 278
19.2.6 ARM64: Optimizing GCC(Linaro)
4.9 278
19.2.7 ARM64: Non-optimizing GCC (Linaro) 4.9 279
19.2.8 MIPS 279
19.3 位移 279
19.4 在FPU上设置特定位 279
19.4.1 XOR操作详解 280
19.4.2 x86 280
19.4.3 MIPS 282
19.4.4 ARM 282
19.5 位校验 284
19.5.1 x86 286
19.5.2 x64 289
19.5.3 ARM + Optimizing Xcode 4.6.3
(LLVM) + ARM mode 291
19.5.4 ARM + Optimizing Xcode 4.6.3
(LLVM)+ Thumb-2 mode 292
19.5.5 ARM64 + Optimizing GCC 4.9 292
19.5.6 ARM64 + Non-optimizing
GCC 4.9 292
19.5.7 MIPS 293
19.6 本章小结 295
19.6.1 检测特定位(编译阶段) 295
19.6.2 检测特定位(runtime阶段) 295
19.6.3 设置特定位(编译阶段) 296
19.6.4 设置特定位(runtime阶段) 296
19.6.5 清除特定位(编译阶段) 296
19.6.6 清除特定位(runtime阶段) 297
19.7 练习题 297
19.7.1 题目1 297
19.7.2 题目2 298
19.7.3 题目3 301
19.7.4 题目4 301
第20章 线性同馀法与伪随机函数 304
20.1 x86 304
20.2 x64 305
20.3 32位ARM 306
20.4 MIPS 306
20.4.1 MIPS的重新定位 307
20.5 本例的线程安全改进版 309
第21章 结 构 体 310
21.1 MSVC: systemtime 310
21.1.1 OllyDbg 311
21.1.2 以数组替代结构体 312
21.2 用malloc()分配结构体的空间 313
21.3 UNIX: struct tm 315
21.3.1 Linux 315
21.3.2 ARM 317
21.3.3 MIPS 319
21.3.4 数组替代法 320
21.3.5 替换为32位words 322
21.3.6 替换为字节型数组 323
21.4 结构体的字段封装 325
21.4.1 x86 325
21.4.2 ARM 329
21.4.3 MI
逆向工程权威指南 电子书 下载 mobi epub pdf txt