请输入您要查询的百科知识:

 

词条 微软.NET程序的加密与解密
释义

本书是软件安全主题网站——看雪学院《加密与解密》1软件安全系列丛书的第三本,主要介绍代码保护与加密解密技术在微软。NET框架中的应用。全书分为基础篇、分析篇、保护篇和扩展篇四大部分,内容涉及。NET框架基础、元数据与MSIL、.NET程序与内核调试、主流代码保护及其逆向技术、非托管API应用、64位。NET程序调试等。

图书信息

作 者:单海波,王坤峰,李晓峰 编著

出 版 社:电子工业出版社

出版时间:2008-12-1

页 数:356页

开 本:16开

ISBN 9787121075520

分类: 图书 >> 计算机/软件安全 >>软件安全

定价:¥49.00元

宣传语

软件安全主题网站——看雪学院《加密与解密》软件安全系列丛书的第三本。

介绍代码保护与加密解密技术在微软.NET框架中的应用。

内 容 简 介

本书是软件安全主题网站——看雪学院《加密与解密》软件安全系列丛书的第三本,主要介绍代码保护与加密解密技术在微软.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

文摘

第一部分 基础篇

第1章 微软.N ET框架基本原理

了解.NET框架的程序运行原理及代码编写方法是学习.NET加密与解密的基础。本章不去长篇大论“什么是.NET”,因为大多数编程书籍已将这个问题解释得很清楚了,从加密与解密的角度帮助读者了解.NET框架才是本章的核心内容。

接下来的内容将以四步走的形式介绍:通过编译第一个.NET程序,学习SDK的基本使用,对.NET程序的运行有感性认识;通过反编译,学习ildasm的使用,掌握.NET逆向的初步技巧;通过修改IL代码并再次编译,对MSIL语言和元数据有初步认识;最后,在以上三步的基础上,理解.NET框架最重要的两个概念:CLR与JIT。

1.1 什么是.NET

.NET是架构于操作系统之上的平台,它是一套虚拟机,其核心功能由一系列运行在用户层(ring3层)的DLL文件实现。相对于读者已经非常熟悉的Win32平台,或是尚未普及的、Win64平台,.NET是既有联系又有区别。联系是指,.NET框架构建在Win32/64平台之上,它的核心程序是一系列运行于用户层的DLL,这就决定了.NET的内核实现仍是基于win32/64;区别是指,传统用户层DLL(如Kernel32.dU、User32.dll等)的主要功能是提供API,而同样是由DLL实现的,NET功能要强大得多,它提供了一套完整的程序开发框架,包括新的编程语言、新的程序运行方式、新的服务等,这些都远远超过API涵盖的范围。从上述区别方面来说,可以将.NET当作一个全新的平台来学习。

如果读者熟悉Java或者虚拟机的概念,那么理解.NET会非常容易。如果读者是个新手,也不用担心,只要把握住以下三个.NET最重要的特性。

(1)统一了编程语言。过去,不同编程语言间的协作总有着或多或少的兼容性问题,使用比较麻烦。.NET则统一了编程语言:无论程序是用c#,还是c++,或是VB编写,最终都被编译为.NET中间语言MSIL(简称IL)。这种统一对程序开发的贡献不言而喻,但同时也方便了软件逆向:无须再分别为每一种语言单独编写反编译器。

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/12/23 19:05:21