第1章 软件逆向工程概述 1
1.1逆向工程的概念和基本方法 1
1.2软件逆向工程的应用 3
1.3软件逆向工程的合法性 3
1.4初识工具 4
1.5逆向分析并修改Hello World程序 6
1.6思考与练习 11
第2章x86与x64体系结构 12
2.1 x86基本概念 12
2.1.1字节序 12
2.1.2权限级别 13
2.2 IA-32内存模型与内存管理 14
2.2.1内存模型 14
2.2.2不同操作模式下的内存管理 15
2.3 IA-32寄存器 17
2.3.1通用寄存器 17
2.3.2 EFLAGS寄存器 18
2.3.3指令指针寄存器 19
2.3.4段寄存器 19
2.4 IA-32数据类型 20
2.4.1基本数据类型 20
2.4.2数值数据类型 21
2.4.3指针类型 21
2.5函数调用、中断与异常 22
2.5.1栈 22
2.5.2栈帧与函数调用连接信息 23
2.5.3函数调用过程 23
2.5.4调用惯例 25
2.5.5中断与异常 25
2.6 IA-32指令集 26
2.6.1指令一般格式 27
2.6.2指令分类及常用指令功能 27
2.7 x64体系结构简介 36
2.8思考与练习 36
第3章ARM体系结构 38
3.1 ARM基本特性 38
3.1.1 ARM的处理器模式 38
3.1.2处理器状态 39
3.1.3内存模型 40
3.2 ARM寄存器与数据类型 40
3.2.1 ARM寄存器 40
3.2.2数据类型 42
3.3 ARM指令集 43
3.3.1分支指令 44
3.3.2数据处理指令 45
3.3.3状态寄存器访问指令 48
3.3.4加载存储指令 48
3.3.5异常生成指令 51
3.4思考与练习 52
第4章PE文件格式 54
4.1 PE文件格式 54
4.1.1基地址与相对虚拟地址 55
4.1.2 PE32基本结构 56
4.2导入地址表与导出地址表 62
4.2.1导入地址表 62
4.2.2导出地址表 67
4.3基址重定位 70
4.4运行时压缩和PE工具简介 72
4.5思考与练习 74
第5章DLL注入 75
5.1 Windows系统编程基础 75
5.1.1数据类型 75
5.1.2 Unicode和字符编码 76
5.1.3常用Windows核心API简介 78
5.1.4制作用于注入的DLL 81
5.2 DLL注入的概念 83
5.3 DLL注入的基本方法 84
5.3.1远程线程创建 84
5.3.2修改注册表 86
5.3.3消息钩取 86
5.4 DLL卸载 89
5.5通过修改PE装载DLL 91
5.6代码注入 97
5.7思考与练习 100
第6章API钩取 101
6.1 API钩取的基本原理 101
6.2调试方式的API钩取 102
6.3修改IAT实现API钩取 106
6.4修改API代码实现API钩取 110
6.5思考与练习 114
第7章 代码混淆技术 115
7.1理论上的安全性 115
7.2数据混淆 116
7.2.1常量展开 116
7.2.2数据编码 117
7.2.3基于模式的混淆 117
7.3控制流混淆 119
7.3.1组合使用函数内联与外联 119
7.3.2通过跳转破坏局部性 119
7.3.3不透明谓词 120
7.3.4基于处理器的控制流间接化 121
7.3.5插入无效代码 122
7.3.6控制流图扁平化 123
7.3.7基于操作系统机制的控制流间接化 124
7.4思考与练习 125
第8章Android应用程序逆向分析 126
8.1 Android应用逆向分析概述 126
8.2静态逆向分析的方法与工具 127
8.2.1 APKTool 129
8.2.2 dex2jar 129
8.2.3 jd-gui 129
8.2.4 JEB 130
8.3 Android应用程序逆向实例 131
8.4思考与练习 142
第9章ROP攻击 143
9.1 ROP攻击的发展 143
9.2 ROP攻击的变种 147
9.2.1非ret指令结尾的ROP攻击 147
9.2.2 JOP攻击 149
9.3思考与练习 150
参考文献 151