第一部分 基 础篇 2
第1章 微软.NET框架基本原理 2
1.1什么是.NET 2
1.2编写第一个.NET程序 3
1.2.1.NET开发环境 3
1.2.2程序的编译 5
1.3逆向第一个.NET程序 8
1.3.1用ildasm反编译.NET程序 8
1.3.2反编译的结果:MSIL与元数据 10
1.3.3用ilasm进行再编译 11
1.4程序的运行:CLR与JIT 12
1.5小结 16
第2章 MSIL中间语言 17
2.1 MSIL语言基础 17
2.1.1 IL程序基本结构 17
2.1.2 2.0版IL支持的新特性 19
2.1.3一个完整的代码示例 21
2.2 MSIL的运行机制:堆栈机 23
2.3 MSIL指令 25
2.3.1流程控制指令 25
2.3.2算术指令 27
2.3.3参数、局部变量与字段寻址指令 32
2.3.4方法调用 34
2.3.5类与值类型操作指令 37
2.3.6向量操作指令 39
2.4小结 42
第3章 PE结构扩展与元数据 43
3.1.NET对PE结构的扩展 43
3.2元数据及其结构 46
3.2.1什么是元数据 46
3.2.2元数据的存储形式(1):堆 47
3.2.3元数据的存储形式(2):表 49
3.2.4元数据的Signature 58
3.3元数据的标识及其解码 60
3.4元数据的验证 63
3.5小结 65
第二部分 分析篇 68
第4章 静态分析技术 68
4.1静态反编译软件 68
4.1.1 Reflector的使用 68
4.1.2 Dis#的使用 72
4.1.3其他反编译软件 75
4.2代码修改技术 78
4.3代码复用技术 80
4.4混合编译程序的静态分析 82
4.5.NET程序本地化技术 86
4.5.1基础知识 86
4.5.2利用可视化工具的本地化 88
4.5.3利用MSIL的本地化 89
4.6小结 91
第5章 动态调试技术 92
5.1.NET动态调试的分类 92
5.2混合模式调试 93
5.2.1 GuiDbg的应用 94
5.2.2 PeBrowseDbg的应用 99
5.3本地调试 104
5.3.1 O11yDbg的应用 105
5.3.2 WinDbg的应用 109
5.4小结 116
第三部分 保护篇 118
第6章 强名称保护 118
6.1给程序签署强名称 118
6.1.1什么是强名称 118
6.1.2单个程序集的签署 119
6.1.3引用有强名称的程序集 123
6.2强名称的去除和替换 125
6.2.1去除和替换强名称的原理 125
6.2.2利用工具的自动实现 126
6.3代码与强名称的结合 128
6.4小结 131
第7章 名称混淆 132
7.1名称混淆的基本原理 132
7.2手动实现名称混淆 133
7.3名称混淆的局限性 139
7.4常见名称混淆形式 140
7.5反名称混淆的一般方法 143
7.6小结 145
第8章 流程混淆 146
8.1流程混淆的基本原理 146
8.2常见流程混淆的方式:基于跳转的混淆 148
8.2.1代码块的易位 149
8.2.2连续跳转 151
8.2.3跳转表 153
8.2.4逻辑跳转 154
8.2.5 switch跳转 157
8.3流程混淆的扩展:语法混淆 160
8.3.1让堆栈溢出 160
8.3.2利用高级语言不支持的语法 161
8.3.3利用高级语言间的语法差异 166
8.3.4利用反编译引擎的缺陷 167
8.3.5插入无效指令编码 170
8.4反流程混淆的一般方法 171
8.5小结 173
第9章 辅助保护手段 174
9.1用户字符串编码 174
9.1.1一般编码 175
9.1.2使用强名称的编码 176
9.2给程序集添加错误元数据 180
9.2.1 #GUID堆大小错误 180
9.2.2 TypeDef的Extends项错误 181
9.2.3利用PE结构 182
9.2.4添加多个Module 184
9.3打包 186
9.4特殊的.NET属性 189
9.5利用系统特性 192
9.6小结 193
第10章 壳保护 194
10.1什么是程序集整体保护 194
10.2纯.NET实现的压缩壳 195
10.3基于Win32的壳 201
10.4挂钩内核的壳 205
10.5什么是基于每个方法的保护 216
10.5.1常见的挂钩形式 217
10.5.2更进一步的保护 222
10.5.3实现方式 223
10.5.4一般分析方法 225
10.6小结 226
第11章 其他保护方式 227
11.1许可证保护 227
11.1.1许可证机制简介 227
11.1.2.NET许可证机制的扩展 231
11.1.3一般分析方法 236
11.2算法的运用 237
11.2.1.NET提供的算法空间 238
11.2.2对称算法的.NET实现 239
11.2.3非对称算法的.NET实现 243
11.2.4数字签名的.NET实现 247
11.3虚拟机保护 248
11.4编译为本地代码 250
11.5动态方法委托调用 254
11.6小结 260
第四部分 扩展篇 262
第12章 非托管API 262
12.1非托管API综述 262
12.2宿主API 263
12.3合成API 267
12.4强名称API 271
12.5元数据API 273
12.6分析API 283
12.7小结 293
第13章 MONO、SSCLI与.NET内核调试 294
13.1 MONO简介 294
13.2 SSCIL简介 300
13.3.NET框架内核调试 306
13.4小结 309
第14章 Win64平台上的.NET 310
14.1 64位编程的一般性问题 310
14.2 C++编程的改变 311
14.2.1汇编级的改变 313
14.2.2.NET编程的改变 317
14.3 64位PE结构 317
14.4 64位.NET程序调试 320
14.5小结 327
附录A 元数据表 328
参考文献 340