书籍详情
x86汇编与逆向工程:软件破解与防护的艺术

作者:[美]斯蒂芬妮·多马斯,[美]克里斯托弗·多马斯
出版社:机械工业出版社
出版时间:2024-12-01
ISBN:9787111767404
定价:¥99.00
购买这本书可以去
内容简介
本书以软件反汇编技术为中心,首先带领读者从x86的基础知识开始,学习如何读取、编写和构建赋能全球大量计算机的汇编语言;然后介绍如何使用IDA、Ghidra、Olly 等业界最受欢迎的工具对应用程序进行逆向工程;接着介绍如何利用补丁和密钥生成等技术进行软件破解,所有这些都利用了汇编和逆向工程的知识;最后从防御的角度向读者介绍相关技术,使他们能够更好地保护自己的软件。本书将引领好奇的读者深入软件破解和计算机的核心,探索其运作机制。深入学习x86计算机的运行原理,不仅对逆向工程和软件破解来说至关重要,还能帮助读者在代码优化、效率提高、调试、编译器设置调整以及芯片选择等方面成为更出色的开发者。
作者简介
斯蒂芬妮·多马斯(Stephanie Domas)Canonical首席信息安全官(CISO)、英特尔(Intel)前首席安全技术战略师。她在道德黑客、逆向工程和高级漏洞分析方面拥有逾十年经验,作为一位知名行业顾问,她的服务对象涵盖初创企业和行业巨头。她目前致力于使Canonical成为开源界最受信赖的计算伙伴。在英特尔时,她负责全公司的安全技术战略,推动英特尔在安全领域实力、竞争力和收益的不断增长。她是一位充满激情的教育家、战略家、演说家、顾问和安全爱好者。克里斯托弗·多马斯(Christopher Domas)知名硬件安全研究员。他的研究重点在于固件、硬件及处理器的底层安全漏洞利用。他因针对还不存在的问题提出天马行空的解决方案而闻名,其所提解决方案包括全球首个单指令的C语言编译器(M/o/Vfuscator)、能够生成程序控制流图的开发工具集(REpsych),以及在vi文本编辑器里实现的图灵机。
目录
目 录
译者序
前言
关于作者
关于技术撰稿人
关于技术编辑
第1章 反编译和架构 1
1.1 反编译 1
1.1.1 反编译何时有用 1
1.1.2 反编译JIT语言 2
1.1.3 保护JIT语言 3
1.2 实验:反编译 4
1.2.1 技能 4
1.2.2 要点 4
1.3 架构 4
1.3.1 计算机架构 4
1.3.2 汇编 6
1.4 总结 10
第2章 x86汇编:数据、模式、寄存器
和内存访问 11
2.1 x86简介 11
2.2 汇编语法 12
2.3 数据表示 13
2.3.1 数字系统的基数 13
2.3.2 位、字节和字 14
2.3.3 处理二进制数 16
2.4 寄存器 17
2.4.1 x86中的寄存器 18
2.4.2 寄存器的使用 19
2.5 内存访问 20
2.6 寻址模式 23
2.6.1 绝对寻址 23
2.6.2 间接寻址 23
2.6.3 基址加偏移量寻址 24
2.6.4 索引寻址 24
2.6.5 基址–索引寻址 24
2.7 总结 25
第3章 x86 汇编:指令 26
3.1 x86指令格式 26
3.2 x86指令 27
3.2.1 mov 28
3.2.2 inc、dec 30
3.2.3 add、sub 30
3.2.4 mul 30
3.2.5 div 31
3.2.6 and、or、xor 31
3.2.7 not 32
3.2.8 shr、shl 32
3.2.9 sar、sal 32
3.2.10 nop 33
3.2.11 lea 33
3.3 整合所有内容 34
3.4 常见的x86指令错误 35
3.5 总结 36
第4章 构建和运行汇编程序 37
4.1 输出 37
4.1.1 控制引脚 38
4.1.2 由操作系统处理与显卡的交互 39
4.2 系统调用 39
4.2.1 sys_write 39
4.2.2 sys_exit 40
4.2.3 输出字符串 40
4.3 汇编和链接 41
4.3.1 Linux中的汇编与链接 41
4.3.2 编写汇编程序 42
4.4 objdump 45
4.5 实验:Hello World 45
4.5.1 技能 45
4.5.2 要点 46
4.6 ASCII 46
4.6.1 识别ASCII字符串 47
4.6.2 ASCII操作技巧 48
4.7 总结 48
第5章 理解条件码 49
5.1 条件码 49
5.1.1 eflags 49
5.1.2 影响状态标志的操作 52
5.2 总结 55
第6章 分析和调试汇编代码 56
6.1 二进制分析 56
6.1.1 静态分析与动态分析 56
6.1.2 调试 57
6.2 断点 57
6.2.1 软件断点 57
6.2.2 硬件断点 58
6.3 gdb 58
6.4 段错误 63
6.5 实验:鲨鱼模拟器3000 63
6.5.1 技能 64
6.5.2 要点 64
6.6 消除噪声 64
6.7 总结 65
第7章 函数和控制流 66
7.1 控制流 66
7.1.1 指令指针 66
7.1.2 控制流指令 67
7.2 x86中的逻辑结构 70
7.2.1 if(...) {...} 70
7.2.2 if(...) {...} else{...} 71
7.2.3 do {...} while (...); 75
7.2.4 while (...) {...} 76
7.2.5 for (...; ...; ...) {...} 77
7.2.6 switch (...) {...} 79
7.2.7 continue 83
7.2.8 break 84
7.2.9 && 86
7.2.10 || 86
7.3 栈 87
7.3.1 栈是如何工作的 87
7.3.2 x86栈 87
7.4 函数调用与栈帧 91
7.4.1 x86中的函数 91
7.4.2 栈分析 94
7.4.3 调用约定 95
7.4.4 cdecl 96
7.4.5 栈帧 100
7.4.6 宏观程序 105
7.4.7 需要记住的事情 106
7.5 总结 107
第8章 编译器和优化器 108
8.1 寻找目标代码入口点 108
8.2 编译器 110
8.2.1 优化 111
8.2.2 剥离 113
8.2.3 链接 114
8.3 总结 116
第9章 逆向工程:工具和策略 117
9.1 实验:RE Bingo 117
9.1.1 技能 117
9.1.2 要点 118
9.2 基础侦察 118
9.2.1 objdump 118
9.2.2 ltrace和strace 119
9.2.3 strings 122
9.2.4 Dependency Walker 123
9.3 逆向工程的策略 124
9.3.1 寻找感兴趣的区域 124
9.3.2 迭代注释代码 124
9.4 总结 125
第10章 破解:工具和策略 126
10.1 密钥检查器 126
10.1.1 不好的方法 127
10.1.2 合理的方法 127
10.1.3 更好的方法 128
10.1.4 最佳方法 128
10.1.5 其他的建议 129
10.2 密钥生成器 130
10.2.1 为什么要创建密钥生成器 130
10.2.2 密钥生成的原理 130
10.2.3 破解各种类型的密钥检查 131
10.2.4 对抗密钥生成器 132
10.3 实验:密钥生成器 132
10.3.1 技能 132
10.3.2 要点 133
10.4 Procmon 133
10.4.1 示例:Notepad.exe 133
10.4.2 怎样用Procmon辅助逆向工程和破解 136
10.5 Resource Hacker 138
10.5.1 示例 138
10.5.2 小实验:Windows计算器 139
10.6 打补丁 142
10.6.1 打补丁与密钥生成 142
10.6.2 在哪里打补丁 143
10.6.3 nop指令 143
10.7 其他调试器 144
10.7.1 OllyDbg 144
10.7.2 Immunity 144
10.7.3 x86dbg 145
10.7.4 WinDbg 145
10.8 使用Immunity调试工具进行
调试 145
10.8.1 Immunity:汇编代码 146
10.8.2 Immunity:模块 147
10.8.3 Immunity:字符串 147
10.8.4 Immunity:运行程序 149
10.8.5 Immunity:异常 149
10.8.6 Immunity:重写程序 151
10.9 实验:使用Immunity进行破解 153
10.9.1 技能 153
10.9.2 要点 153
10.10 总结 153
第11章 打补丁和高级工具 154
11.1 在010编辑器中打补丁 154
11.2 CodeFusion补丁 156
11.3 Cheat Engine 158
11.3.1 Cheat Engine:打开进程 159
11.3.2 Cheat Engine:查看内存 159
11.3.3 Cheat Engine:字符串引用 161
11.3.4 Cheat Engine:重写程序 161
11.3.5 Cheat Engine:复制字节 163
11.3.6 Cheat Engine:获取地址 163
11.4 实验:破解LaFarge 163
11.4.1 技能 163
11.4.2 要点 164
11.5 IDA 164
11.5.1 IDA:字符串 165
11.5.2 IDA:基本块 167
11.5.3 IDA:函数和变量 168
11.5.4 IDA:注释 168
11.5.5 IDA:路径 170
11.6 IDA补丁 171
11.7 实验:IDA逻辑流程 173
11.7.1 技能 173
11.7.2 要点 173
11.8 Ghidra 174
11.9 实验:使用IDA进行破解 174
11.9.1 技能 174
11.9.2 要点 174
11.10 总结 174
第12章 防御 175
12.1 混淆技术 175
12.1.1 评估混淆技术 177
12.1.2 自动化混淆 177
12.1.3 混淆器 181
12.1.4 攻克混淆器 182
12.2 实验:混淆技术 182
12.2.1 技能 183
12.2.2 要点 183
12.3 反调试 183
12.3.1 IsDebuggerPresent() 183
12.3.2 调试寄存器 184
12.3.3 读时间戳计数器 184
12.3.4 无效CloseHandle()调用 185
12.3.5 目录扫描 185
12.3.6 攻击性反调试 186
12.3.7 攻克反调试技术 186
12.4 实验:反调试 186
12.4.1 技能 186
12.4.2 要点 187
12.5 总结 187
第13章 高级防御技术 188
13.1 防篡改技术 188
13.1.1 哈希 188
13.1.2 签名 189
13.1.3 水印 189
13.1.4 软件守护 189
13.2 加壳技术 190
13.2.1 加壳器是如何工作的 190
13.2.2 这是强大的保护机制吗 191
13.2.3 破解加壳技术 191
13.2.4 PEiD 192
13.3 实验:检测和脱壳 192
13.3.1 技能 193
13.3.2 要点 193
13.4 虚拟化技术 193
13.4.1 代码虚拟化是如何工作的 195
13.4.2 分层虚拟化 195
13.4.3 虚拟化存在的问题 195
13.4.4 这是强大的保护机制吗 196
13.4.5 破解虚拟化技术 196
13.5 加密器/解密器 196
13.5.1 这种保护机制有用吗 197
13.5.2 攻克加密器 197
13.6 总结 197
第14章 检测与预防 199
14.1 循环冗余校验 199
14.2 代码签名 200
14.2.1 如何进行代码签名 200
14.2.2 如何验证已签名的应用
程序 201
14.2.3 代码签名有效吗 201
14.2.4 代码签名与循环冗余校验 202
14.2.5 这是强大的保护机制吗 202
14.3 RASP 202
14.3.1 钩子函数 202
14.3.2 RASP的风险 203
14.3.3 这是强大的保护机制吗 203
14.4 白名单 203
14.4.1 如何运行白名单 204
14.4.2 这是强大的保护机制吗 204
14.5 黑名单 205
14.6 远程认证 205
14.6.1 远程认证示例 206
14.6.2 这是强大的保护机制吗 206
14.7 实验:进程监控 207
14.7.1 技能 207
14.7.2 要点 207
14.8 总结 207
第15章 法律 208
15.1 影响逆向工程的美国法律 208
15.1.1 《数字千年版权法》 208
15.1.2 《计算机欺诈和滥用法案》 208
15.1.3 《版权法》 209
15.1.4 重要法庭判例 210
15.1.5 合理使用 211
15.1.6 DMCA研究免责 211
15.1.7 合法性 212
15.2 总结 212
第16章 高级技术 213
16.1 时间旅行调试 213
16.2 二进制插桩 213
16.3 中间表示 214
16.4 反编译 214
16.5 自动化结构恢复 215
16.6 可视化 215
16.7 去混淆 215
16.8 定理证明器 216
16.9 符号分析 216
16.10 总结 217
第17章 附加话题 218
17.1 栈溢出 218
17.1.1 shellcode 224
17.1.2 栈溢出与栈保护 227
17.2 关联C代码与x86汇编代码 228
17.2.1 在x86代码中使用C函数 228
17.2.2 在C代码中使用x86函数 230
17.2.3 _start与main() 231
17.2.4 标准参数 233
17.2.5 混合使用C语言和汇编
语言 233
17.3 总结 235
结语 236
译者序
前言
关于作者
关于技术撰稿人
关于技术编辑
第1章 反编译和架构 1
1.1 反编译 1
1.1.1 反编译何时有用 1
1.1.2 反编译JIT语言 2
1.1.3 保护JIT语言 3
1.2 实验:反编译 4
1.2.1 技能 4
1.2.2 要点 4
1.3 架构 4
1.3.1 计算机架构 4
1.3.2 汇编 6
1.4 总结 10
第2章 x86汇编:数据、模式、寄存器
和内存访问 11
2.1 x86简介 11
2.2 汇编语法 12
2.3 数据表示 13
2.3.1 数字系统的基数 13
2.3.2 位、字节和字 14
2.3.3 处理二进制数 16
2.4 寄存器 17
2.4.1 x86中的寄存器 18
2.4.2 寄存器的使用 19
2.5 内存访问 20
2.6 寻址模式 23
2.6.1 绝对寻址 23
2.6.2 间接寻址 23
2.6.3 基址加偏移量寻址 24
2.6.4 索引寻址 24
2.6.5 基址–索引寻址 24
2.7 总结 25
第3章 x86 汇编:指令 26
3.1 x86指令格式 26
3.2 x86指令 27
3.2.1 mov 28
3.2.2 inc、dec 30
3.2.3 add、sub 30
3.2.4 mul 30
3.2.5 div 31
3.2.6 and、or、xor 31
3.2.7 not 32
3.2.8 shr、shl 32
3.2.9 sar、sal 32
3.2.10 nop 33
3.2.11 lea 33
3.3 整合所有内容 34
3.4 常见的x86指令错误 35
3.5 总结 36
第4章 构建和运行汇编程序 37
4.1 输出 37
4.1.1 控制引脚 38
4.1.2 由操作系统处理与显卡的交互 39
4.2 系统调用 39
4.2.1 sys_write 39
4.2.2 sys_exit 40
4.2.3 输出字符串 40
4.3 汇编和链接 41
4.3.1 Linux中的汇编与链接 41
4.3.2 编写汇编程序 42
4.4 objdump 45
4.5 实验:Hello World 45
4.5.1 技能 45
4.5.2 要点 46
4.6 ASCII 46
4.6.1 识别ASCII字符串 47
4.6.2 ASCII操作技巧 48
4.7 总结 48
第5章 理解条件码 49
5.1 条件码 49
5.1.1 eflags 49
5.1.2 影响状态标志的操作 52
5.2 总结 55
第6章 分析和调试汇编代码 56
6.1 二进制分析 56
6.1.1 静态分析与动态分析 56
6.1.2 调试 57
6.2 断点 57
6.2.1 软件断点 57
6.2.2 硬件断点 58
6.3 gdb 58
6.4 段错误 63
6.5 实验:鲨鱼模拟器3000 63
6.5.1 技能 64
6.5.2 要点 64
6.6 消除噪声 64
6.7 总结 65
第7章 函数和控制流 66
7.1 控制流 66
7.1.1 指令指针 66
7.1.2 控制流指令 67
7.2 x86中的逻辑结构 70
7.2.1 if(...) {...} 70
7.2.2 if(...) {...} else{...} 71
7.2.3 do {...} while (...); 75
7.2.4 while (...) {...} 76
7.2.5 for (...; ...; ...) {...} 77
7.2.6 switch (...) {...} 79
7.2.7 continue 83
7.2.8 break 84
7.2.9 && 86
7.2.10 || 86
7.3 栈 87
7.3.1 栈是如何工作的 87
7.3.2 x86栈 87
7.4 函数调用与栈帧 91
7.4.1 x86中的函数 91
7.4.2 栈分析 94
7.4.3 调用约定 95
7.4.4 cdecl 96
7.4.5 栈帧 100
7.4.6 宏观程序 105
7.4.7 需要记住的事情 106
7.5 总结 107
第8章 编译器和优化器 108
8.1 寻找目标代码入口点 108
8.2 编译器 110
8.2.1 优化 111
8.2.2 剥离 113
8.2.3 链接 114
8.3 总结 116
第9章 逆向工程:工具和策略 117
9.1 实验:RE Bingo 117
9.1.1 技能 117
9.1.2 要点 118
9.2 基础侦察 118
9.2.1 objdump 118
9.2.2 ltrace和strace 119
9.2.3 strings 122
9.2.4 Dependency Walker 123
9.3 逆向工程的策略 124
9.3.1 寻找感兴趣的区域 124
9.3.2 迭代注释代码 124
9.4 总结 125
第10章 破解:工具和策略 126
10.1 密钥检查器 126
10.1.1 不好的方法 127
10.1.2 合理的方法 127
10.1.3 更好的方法 128
10.1.4 最佳方法 128
10.1.5 其他的建议 129
10.2 密钥生成器 130
10.2.1 为什么要创建密钥生成器 130
10.2.2 密钥生成的原理 130
10.2.3 破解各种类型的密钥检查 131
10.2.4 对抗密钥生成器 132
10.3 实验:密钥生成器 132
10.3.1 技能 132
10.3.2 要点 133
10.4 Procmon 133
10.4.1 示例:Notepad.exe 133
10.4.2 怎样用Procmon辅助逆向工程和破解 136
10.5 Resource Hacker 138
10.5.1 示例 138
10.5.2 小实验:Windows计算器 139
10.6 打补丁 142
10.6.1 打补丁与密钥生成 142
10.6.2 在哪里打补丁 143
10.6.3 nop指令 143
10.7 其他调试器 144
10.7.1 OllyDbg 144
10.7.2 Immunity 144
10.7.3 x86dbg 145
10.7.4 WinDbg 145
10.8 使用Immunity调试工具进行
调试 145
10.8.1 Immunity:汇编代码 146
10.8.2 Immunity:模块 147
10.8.3 Immunity:字符串 147
10.8.4 Immunity:运行程序 149
10.8.5 Immunity:异常 149
10.8.6 Immunity:重写程序 151
10.9 实验:使用Immunity进行破解 153
10.9.1 技能 153
10.9.2 要点 153
10.10 总结 153
第11章 打补丁和高级工具 154
11.1 在010编辑器中打补丁 154
11.2 CodeFusion补丁 156
11.3 Cheat Engine 158
11.3.1 Cheat Engine:打开进程 159
11.3.2 Cheat Engine:查看内存 159
11.3.3 Cheat Engine:字符串引用 161
11.3.4 Cheat Engine:重写程序 161
11.3.5 Cheat Engine:复制字节 163
11.3.6 Cheat Engine:获取地址 163
11.4 实验:破解LaFarge 163
11.4.1 技能 163
11.4.2 要点 164
11.5 IDA 164
11.5.1 IDA:字符串 165
11.5.2 IDA:基本块 167
11.5.3 IDA:函数和变量 168
11.5.4 IDA:注释 168
11.5.5 IDA:路径 170
11.6 IDA补丁 171
11.7 实验:IDA逻辑流程 173
11.7.1 技能 173
11.7.2 要点 173
11.8 Ghidra 174
11.9 实验:使用IDA进行破解 174
11.9.1 技能 174
11.9.2 要点 174
11.10 总结 174
第12章 防御 175
12.1 混淆技术 175
12.1.1 评估混淆技术 177
12.1.2 自动化混淆 177
12.1.3 混淆器 181
12.1.4 攻克混淆器 182
12.2 实验:混淆技术 182
12.2.1 技能 183
12.2.2 要点 183
12.3 反调试 183
12.3.1 IsDebuggerPresent() 183
12.3.2 调试寄存器 184
12.3.3 读时间戳计数器 184
12.3.4 无效CloseHandle()调用 185
12.3.5 目录扫描 185
12.3.6 攻击性反调试 186
12.3.7 攻克反调试技术 186
12.4 实验:反调试 186
12.4.1 技能 186
12.4.2 要点 187
12.5 总结 187
第13章 高级防御技术 188
13.1 防篡改技术 188
13.1.1 哈希 188
13.1.2 签名 189
13.1.3 水印 189
13.1.4 软件守护 189
13.2 加壳技术 190
13.2.1 加壳器是如何工作的 190
13.2.2 这是强大的保护机制吗 191
13.2.3 破解加壳技术 191
13.2.4 PEiD 192
13.3 实验:检测和脱壳 192
13.3.1 技能 193
13.3.2 要点 193
13.4 虚拟化技术 193
13.4.1 代码虚拟化是如何工作的 195
13.4.2 分层虚拟化 195
13.4.3 虚拟化存在的问题 195
13.4.4 这是强大的保护机制吗 196
13.4.5 破解虚拟化技术 196
13.5 加密器/解密器 196
13.5.1 这种保护机制有用吗 197
13.5.2 攻克加密器 197
13.6 总结 197
第14章 检测与预防 199
14.1 循环冗余校验 199
14.2 代码签名 200
14.2.1 如何进行代码签名 200
14.2.2 如何验证已签名的应用
程序 201
14.2.3 代码签名有效吗 201
14.2.4 代码签名与循环冗余校验 202
14.2.5 这是强大的保护机制吗 202
14.3 RASP 202
14.3.1 钩子函数 202
14.3.2 RASP的风险 203
14.3.3 这是强大的保护机制吗 203
14.4 白名单 203
14.4.1 如何运行白名单 204
14.4.2 这是强大的保护机制吗 204
14.5 黑名单 205
14.6 远程认证 205
14.6.1 远程认证示例 206
14.6.2 这是强大的保护机制吗 206
14.7 实验:进程监控 207
14.7.1 技能 207
14.7.2 要点 207
14.8 总结 207
第15章 法律 208
15.1 影响逆向工程的美国法律 208
15.1.1 《数字千年版权法》 208
15.1.2 《计算机欺诈和滥用法案》 208
15.1.3 《版权法》 209
15.1.4 重要法庭判例 210
15.1.5 合理使用 211
15.1.6 DMCA研究免责 211
15.1.7 合法性 212
15.2 总结 212
第16章 高级技术 213
16.1 时间旅行调试 213
16.2 二进制插桩 213
16.3 中间表示 214
16.4 反编译 214
16.5 自动化结构恢复 215
16.6 可视化 215
16.7 去混淆 215
16.8 定理证明器 216
16.9 符号分析 216
16.10 总结 217
第17章 附加话题 218
17.1 栈溢出 218
17.1.1 shellcode 224
17.1.2 栈溢出与栈保护 227
17.2 关联C代码与x86汇编代码 228
17.2.1 在x86代码中使用C函数 228
17.2.2 在C代码中使用x86函数 230
17.2.3 _start与main() 231
17.2.4 标准参数 233
17.2.5 混合使用C语言和汇编
语言 233
17.3 总结 235
结语 236
猜您喜欢



