《有趣的二进制:软件安全与逆向分析》通过逆向工程,揭开人们熟知的软件背后的机器语言的秘密,并教给读者读懂这些二进制代码的方法。理解了这些方法,技术人员就能有效地Debug,防止软件受到恶意攻击和反编译。本书涵盖的技术包括:汇编与反汇编、调试与反调试、缓冲区溢出攻击与底层安全、钩子与注入、Metasploit 等安全工具。
《有趣的二进制:软件安全与逆向分析》适合对计算机原理、底层或计算机安全感兴趣的读者阅读。
目录
- 第1章 通过逆向工程学习如何读懂二进制代码 1
- 1.1 先来实际体验一下软件分析吧 3
- 1.1.1 通过Process Monitor的日志来确认程序的行为 4
- 1.1.2 从注册表访问中能发现些什么 6
- 1.1.3 什么是逆向工程 9
- 专栏:逆向工程技术大赛 10
- 1.2 尝试静态分析 11
- 1.2.1 静态分析与动态分析 11
- 专栏:Stirling与BZ Editor的区别 12
- 1.2.2 用二进制编辑器查看文件内容 13
- 1.2.3 看不懂汇编语言也可以进行分析 14
- 1.2.4 在没有源代码的情况下搞清楚程序的行为 16
- 1.2.5 确认程序的源代码 18
- 1.3 尝试动态分析 20
- 1.3.1 设置Process Monitor的过滤规则 20
- 1.3.2 调试器是干什么用的 23
- 1.3.3 用OllyDbg洞察程序的详细逻辑 24
- 1.3.4 对反汇编代码进行分析 26
- 专栏:什么是寄存器 28
- 1.3.5 将分析结果与源代码进行比较 29
- 专栏:选择自己喜欢的调试器 30
- 1.4 学习最基础的汇编指令 32
- 1.4.1 没必要记住所有的汇编指令 32
- 1.4.2 汇编语言是如何实现条件分支的 33
- 1.4.3 参数存放在栈中 35
- 1.4.4 从汇编代码联想到C语言源代码 37
- 1.5 通过汇编指令洞察程序行为 40
- 1.5.1 给函数设置断点 40
- 1.5.2 反汇编并观察重要逻辑 42
- 专栏:学习编写汇编代码 47
- 第2章 在射击游戏中防止玩家作弊 51
- 2.1 解读内存转储 53
- 2.1.1 射击游戏的规则 53
- 2.1.2 修改4个字节就能得高分 54
- 2.1.3 获取内存转储 58
- 2.1.4 从进程异常终止瞬间的状态查找崩溃的原因 63
- 2.1.5 有效运用实时调试 66
- 2.1.6 通过转储文件寻找出错原因 68
- 专栏:除了个人电脑,在其他计算机设备上运行的程序也可以进行
- 分析吗 74
- 专栏:分析Java编写的应用程序 74
- 2.2 如何防止软件被别人分析 76
- 2.2.1 反调试技术 76
- 专栏:检测调试器的各种方法 77
- 2.2.2 通过代码混淆来防止分析 79
- 专栏:代码混淆的相关话题 80
- 2.2.3 将可执行文件进行压缩 81
- 2.2.4 将压缩过的可执行文件解压缩:解包 86
- 2.2.5 通过手动解包UPX来理解其工作原理 87
- 2.2.6 用硬件断点对ASPack进行解包 91
- 专栏:如何分析.NET编写的应用程序 95
- 第3章 利用软件的漏洞进行攻击 97
- 3.1 利用缓冲区溢出来执行任意代码 99
- 3.1.1 引发缓冲区溢出的示例程序 99
- 3.1.2 让普通用户用管理员权限运行程序 100
- 3.1.3 权限是如何被夺取的 102
- 3.1.4 栈是如何使用内存空间的 104
- 3.1.5 攻击者如何执行任意代码 107
- 3.1.6 用gdb 查看程序运行时的情况 110
- 3.1.7 攻击代码示例 113
- 3.1.8 生成可用作shellcode的机器语言代码 116
- 3.1.9 对0x00的改进 121
- 专栏:printf类函数的字符串格式化bug 125
- 3.2 防御攻击的技术 127
- 3.2.1 地址随机化:ASLR 127
- 3.2.2 除存放可执行代码的内存空间以外,对其余内存空间尽量
- 禁用执行权限:Exec-Shield 130
- 3.2.3 在编译时插入检测栈数据完整性的代码:StackGuard 131
- 3.3 绕开安全机制的技术 134
- 3.3.1 使用libc中的函数来进行攻击:Return-into-libc 134
- 3.3.2 利用未随机化的模块内部的汇编代码进行攻击:ROP 136
- 专栏:计算机安全为什么会变成猫鼠游戏 137
- 第4章 自由控制程序运行方式的编程技巧 139
- 4.1 通过自制调试器来理解其原理 141
- 4.1.1 亲手做一个简单的调试器,在实践中学习 141
- 4.1.2 调试器到底是怎样工作的 141
- 4.1.3 实现反汇编功能 147
- 4.1.4 运行改良版调试器 153
- 4.2 在其他进程中运行任意代码:代码注入 155
- 4.2.1 向其他进程注入代码 155
- 4.2.2 用SetWindowsHookEx劫持系统消息 155
- 4.2.3 将DLL路径配置到注册表的AppInit_DLLs项 162
- 4.2.4 通过CreateRemoteThread在其他进程中创建线程 165
- 4.2.5 注入函数 170
- 4.3 任意替换程序逻辑:API 钩子 174
- 4.3.1 API 钩子的两种类型 174
- 4.3.2 用Detours实现一个简单的API 钩子 174
- 4.3.3 修改消息框的标题栏 177
- 专栏:DLL注入和API钩子是“黑客”技术的代表? 178
- 第5章 使用工具探索更广阔的世界 179
- 5.1 用Metasploit Framework验证和调查漏洞 181
- 5.1.1 什么是Metasploit Framework 181
- 5.1.2 安全漏洞的信息从何而来 181
- 5.1.3 搭建用于测试漏洞的环境 182
- 5.1.4 利用漏洞进行攻击 183
- 专栏:深入探索shellcode 184
- 5.1.5 一个ROP的实际例子 188
- 5.2 用EMET观察反ROP的机制 192
- 5.2.1 什么是EMET 192
- 5.2.2 Anti-ROP的设计获得了蓝帽奖 192
- 5.2.3 如何防止攻击 193
- 5.2.4 搞清楚加载器的逻辑 194
- 5.2.5 DLL的程序逻辑 196
- 5.2.6 CALL-RETN检查 197
- 5.2.7 如何防止误判 200
- 5.2.8 检查栈的合法性 201
- 5.3 用REMnux 分析恶意软件 205
- 5.3.1 什么是REMnux 205
- 5.3.2 更新特征数据库 206
- 5.3.3 扫描目录 206
- 5.4 用ClamAV检测恶意软件和漏洞攻击 208
- 5.4.1 ClamAV的特征文件 208
- 5.4.2 解压缩.cvd文件 209
- 5.4.3 被检测到的文件详细信息 210
- 5.4.4 检测所使用的打包器以及疑似恶意软件的文件 211
- 5.5 用Zero Wine Tryouts分析恶意软件 212
- 5.5.1 REMnux与Zero Wine Tryouts的区别 212
- 5.5.2 运行机制 212
- 5.5.3 显示用户界面 213
- 5.5.4 确认分析报告 214
- 专栏:尝试开发自己的工具 217
- 5.6 尽量减少人工分析:启发式技术 218
- 5.6.1 恶意软件应对极限的到来:平均每天60000个 218
- 5.6.2 启发式技术革命 218
- 5.6.3 用两个恶意软件进行测试 220
- 附录 223
- A.1 安装IDA 224
- A.2 安装OllyDbg 229
- A.3 安装WinDbg 230
- A.4 安装Visual Studio 2010 235
- A.5 安装Metasploit 240
- A.6 分析工具 248
- Stirling / BZ Editor 248
- Process Monitor 249
- Process Explorer 250
- Sysinternals工具 250
- 兔耳旋风 251
- 参考文献 252
后记 254