一、什么是.NET?
    微软官方给出的定义是:.NET框架是支持生成和运行下一代运行程序内部Windows的组件。同时,.NET还有很多别的平台上的实现,只要符合计算机制造商协会规定的公共语言基础框架CLI的平台,我们都可以实现.NET的平台。比如说MONO,还有SSCLI。
    在本文中,我们主要的议题还是围绕在第一点,Windows平台的应用。
    首先,.NET是一个面向对象的框架。
    其次,它是个将软件部署和版本控制冲突最小化的代码执行环境。我讲这些涉及到以后加解密中间需要的一些特点。
    第三,它是一个可提高代码执行安全性的代码执行环境,这点后面也会提到。.NET生成中间代码以后,通过即时编译,会比JAVA运行速度快一些。
    最后一点,确保基于.NET的框架代码可以和任何代码集成,这是最大的特色,就是编程语言的统一。
    讲了这么多,还是我们来谈一谈从加解密的角度看,.NET是什么?
    一句话,就是构建于操作系统之上的虚拟机。我们今天谈的.NET包含两个部分,一个是通用语言运行时,也就是CLR。
    图1是一个Windows平台上的.NET框架基本结构示意图,大家可以看到有很多各种不同的编程语言,经过中间整合为元数据,在底层Windows与应用程序中间最大的框就是.NET,两个部分,左边这块是CLR,是它的运行环境,右边是.NET的类库,结构就是这样。
 
.NET程序加解密技术基础——软件安全专家单海波谈.NET程序加解密技术_休闲
图1  Windows系统上的.NET框架结构
 
二、加解密所关注的.NET带来的改变
 
1、PE文件结构的改变
    .NET作为新的平台,肯定引进一些新的技术。我们讨论的是加解密,因此我们有关注的特殊点,第一是在PE结构上带来的一些改变,大家很清楚PE结构是Windows平台上可执行程序的结构,普通的PE文件保存的是机器指令的编码,图2是典型的普通的PE文件示意图。
 
.NET程序加解密技术基础——软件安全专家单海波谈.NET程序加解密技术_微软_02
图2  普通的PE文件
 
    但是.NET下的PE文件,在.NET下叫程序集,其保存的是另外两种数据,叫元数据和MSIL,当然同时还保存其他的数据,但主要是元数据和MSIL,中间语言。
    在.NET下,PE结构中改变最大的属于.text节,它包含.NET的基本结构和数据的比如说CLR头,一些输入表,元数据等,这是.NET对PE文件的最大的改变。
    讲到这里引出.NET中一个非常重要的概念,元数据。什么是元数据?字典上解释为描述数据的数据,用在.NET上也是非常合适的。首先它本身就是一个数据,0101,第二它描述了.NET程序的全部信息,一个.NET程序想正常运行,必须是一个合法的.NET程序,必须包含合法完整的元数据。因此我们说.NET程序是自描述的,运行的时候,程序集本身包含了所有信息,不需要寻找别的依赖性的信息(比如注册表中)。
    但是程序集的这种自描述的性质,使得反编译时的信息更加丰富,结合MSIL的特征,使得反编译的结果近似源代码。如图3所示,左边这张图是一个反编译的图,再看看点击的方法,所有的名称都被显示了出来。所以说元数据还是挺可怕的。
 
.NET程序加解密技术基础——软件安全专家单海波谈.NET程序加解密技术_安全_03
图3  程序集的这种自描述性质使得反编译时信息更加丰富,结合MSIL的特性,使得反编译结果近似原代码
 
    下面简单介绍一下元数据的基本结构,元数据是以数据流的形式保存在文件中,各种有不同的形式,一个是堆,一个是表,流是统称,而堆和表是存在形式。
    图4表示了.NET下的六个元数据堆,第二个流是Blob,所有二进制数据都保存在Blob中,第三个是GUID,每个程序集唯,这个比较简单。第四个流,US代表用户字符串,红色标示的是比较常见的,和加解密关系比较重要的,因为用户字符串中保存了比较关键的信息,。下一个#-,最重要的流,所有的堆存在于这个流中。
.NET程序加解密技术基础——软件安全专家单海波谈.NET程序加解密技术_职场_04
图4  .NET下的6个元数据堆
 
    图5的倒数第二行介绍了所有的元数据堆,也就是.NET的元数据表,从00到44,大家看看这些名称基本上反映了.NET面向框架结构,基本上结构从名称中就可以看出来了。
.NET程序加解密技术基础——软件安全专家单海波谈.NET程序加解密技术_微软_05
图5  .NET的元数据表
 
 
本文主要内容整理自软件安全专家单海波先生在2008中国软件安全峰会上的演讲,欢迎下载本文资料