标题：微软.NET程序的加密与解密
图书信息
作　者：单海波，王坤峰，李晓峰 编著
出 版 社：电子工业出版社
出版时间：2008-12-1
页　数：356页
开　本：16开
ISBN 9787121075520
分类： 图书 >> 计算机/软件安全 >>软件安全
定价：￥49.00元
宣传语
软件安全主题网站——看雪学院《加密与解密》软件安全系列丛书的第三本。
介绍代码保护与加密解密技术在微软.NET框架中的应用。
内 容 简 介
本书是软件安全主题网站——看雪学院《加密与解密》[1]软件安全系列丛书的第三本，主要介绍代码保护与加密解密技术在微软.NET框架中的应用。本书的层次循序渐进，难度深入浅出，且注重实例分析，是软件开发人员了解.NET内核及加密解密技术不可多得的参考书，适合.NET开发人员及加密与解密爱好者阅读。
前 言
自微软2000年6月宣布其.NET战略以来的八年时间内，.NET技术得到了迅猛发展。越来越多的程序员选择在.NET框架上开发程序，越来越多的企业选择.NET作为自己产品的平台。有商业化的产品，就必然有对其进行保护的需求，于是加密与解密的战场再一次从传统的Win32平台扩展至.NET。可以说，.NET发展的这几年，也是.NET程序加密解密技术飞速成长的几年，其间出现了诸多很有特点的保护技术与逆向技术。但也许是受英语语言的限制及缺少资料的影响，国内许多企业和程序员对目前国内外最新的加密解密技术了解甚少，于是在选择适合自己产品的保护方式时往往无从下手；而加密与解密爱好者在学习.NET逆向技术时，也感到缺乏这方面的资料。于是，我认为很有必要写一本专注于.NET程序加密解密与内核调试的书，希望和读者互相交流，共同提高。
本书的由来
在调试程序时经常会有这种体会：分析一个保护方式的最好方法就是了解它的历史。因此，先来谈谈本书的诞生。
2004年经朋友介绍我知道了软件安全主题网站——看雪学院，看着前辈高手们在其论坛（看雪论坛）上发表的一篇篇精华文章，实有相见恨晚之感。此时，.NET框架诞生已近4年，但自己对.NET可谓一无所知，国内对这方面的讨论也很少。偶尔的机会，接触到了.NET程序，并在CodeProject网站上搜索到一篇关于去除强名称的文章，这也成了我步入该领域的入门指南。零零星星地，我开始在看雪论坛里发表一些关于.NET程序加密解密的文章，也认识了一些有着同样兴趣的朋友。
2006年，看雪论坛中关于.NET的讨论渐成气候，大家明显感觉到国内在这方面与国外的差距很大，于是经看雪学院支持，将其论坛里在.NET程序加密解密上起步较早的朋友们集合起来，组成“.NET逆向小组”。小组成立以后，大家畅所欲言，互相交流，这段时间也成为小组每个成员成长进步最快的阶段，谈论的话题也已从简单的MSIL修改与编译的“高层次”深入到.NET内核的挂钩与元数据结构的“低层次”上了。
也就是在这一年，看雪学院组织的《加密与解密》第三版的编写启动了实质性工作，并计划在其中加入一个章节讨论.NET程序的加密与解密。正在西藏支边的我，空闲时间相对较多，于是毛遂自荐，希望负责该章节的编写。想不到看雪学院很爽快地答应下来，这也给了我很大的鼓励。写作过程从开始到结束并不长，原因是这些年已经积累了一些.NET程序加密解密方面的资料，再加上国内外尚没有专门讨论该话题的书籍出现，因此写起来倒也算轻松。唯一遗憾的是，看雪学院只给了50页的版面，因此有许多内容被忍痛割爱、再三精简，还有一些知识点根本没有写进去。2007年，在《加密与解密》第三版一书的.NET章节——.NET平台加解密完稿交付的同时，我就决定：单独写一本讨论.NET软件加密与解密问题的书。
本书从开始编写到出版，前后共经历近两年的时间。这段时间恰是.NET保护技术飞速发展的两年，因此在写作过程中，我不断地修改内容，力争将.NET保护的最新发展囊括进来。一个人的力量总是有限的，于是我又积极地寻求小组成员的帮助，多亏他们无私地将自己的成果奉献出来，才使我得以将精力专注于书籍本身而不是无休止地进行程序分析与调试。所以，读者手中的这本书，内容全面、深浅适宜，是国内众多.NET好手智慧的结晶。
本书的特点
我对这本书的整体结构及包含的内容是下了一番工夫琢磨的。首先，我想书在难度上要由浅入深，既让初次接触.NET的读者有耐心和信心读下去，又要让熟悉.NET高层开发的读者能了解相当底层的知识，总体难度为中等偏上。其次，我非常注意可操作性，这是加密解密书籍的重要特点，读者跟着书中的示例及说明进行操作，便可更加牢固和深入掌握知识点。其三是知识点的完备性，本书基本涵盖了目前.NET程序加密与解密领域的所有知识点并能突出重点，因此既可顺序阅读，也可作为手册随时查阅。
关于加密解密的学习要注意两点：一是知识点的掌握，二是方法的掌握，且后者更重要。读者在阅读本书时，一定要注意体会书中的操作技巧，学会举一反三，方能以不变应万变。
某位大牛说过，技巧与技术是不同的。而本书介绍的都是技巧，因此如何将这些技巧转换为技术，则要靠各位读者自己不懈的努力了。
对读者的要求
本书是针对有一定Win 32和.NET编程和加密解密经验的读者而写的。其中，Win32加密解密的基础知识可以从看雪学院的《加密与解密》第三版中获得，而.NET程序设计的书籍市面上比比皆是，读者可自行选择。
.NET是跨层次的平台，因此对读者的语言要求比较特殊。高层次平台中，读者应熟悉C#或VB.NET等面向.NET的托管程序设计语言；底层调试中，又要求读者熟悉C++、ASM等Win 32编程语言。如果有余力，可以再学习C++/CLI，它是托管与非托管混合编程的语言，对理解.NET平台的底层运行是非常有帮助的。
本书适合以下读者：
希望通过学习.NET框架底层知识，提高自身软件开发水平的.NET程序员；
希望了解.NET加密解密基本原理，以选择合适的.NET保护程序的程序员或公司；
对软件加密与解密感兴趣，并希望了解.NET程序逆向分析技术的读者。
最后，英语虽不是必需，但在这些年的实践中，我深深感到语言的差异严重影响了知识的普及，而且很好地掌握英语会让读者在成长路上如虎添翼，因此建议每一名读者要学好计算机英语。
关于配套下载文件
本书涉及的所有实例和代码文件可以到博文视点主页下载，文件下载：http//broadview.com.cn。大部分代码均在2.0版.NET框架下使用Visual Studio 2005编译，读者也可以选择最新的Visual Studio 2008。代码选择的语言主要为C++和C#，少部分为C++/CLI。
本书配套下载文件中还提供了部分需要使用的逆向分析工具、以前没有提供的工具以及现有工具的最新版。
致谢
感谢看雪学院的大力支持，您是我能写完本书的第一动力。
感谢博文视点的毕宁、顾慧芳两位老师为本书的写作与出版付出的辛勤劳动。
感谢看雪论坛.NET逆向小组的所有同事，特别是inraining、dreaman、rick、tracky、MegaX、Wickg Hu在.NET加密解密核心技术上的无私分享。
感谢家人对我的支持，在生活上为我分担了无数烦恼。
技术支持
虽然我已竭尽全力力求书中的内容及下载文件内容的准确性，但限于水平，错误在所难免。因此，我会在Blog及看雪论坛中发布本书的更正内容，也欢迎各位读者就书中内容及.NET逆向技术发表看法，进行讨论。本书笔者意在抛砖引玉，若能激起大家对.NET软件安全问题的关注和交流，并借此结识更多的朋友，那么投入的时间与精力也就值了。
看雪学院：http://www.pediy.com
作者Blog：http://vxer.cn/blog
单海波 
2008年5月
目 录
第一部分 基 础 篇
第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
第二部分 分 析 篇
第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 OllyDbg的应用 105
5.3.2 WinDbg的应用 109
5.4 小结 116
第三部分 保 护 篇
第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
第四部分 扩 展 篇
第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