首页 > 代码库 > 逆向第三课(深入.NET程序运行原理)

逆向第三课(深入.NET程序运行原理)

注:本文适用读者范围,对Windows下的PE文件有一定认识的朋友

 

一、 名词解释

a)        CLR

公共语言运行时(Common LanguageRuntime)CLR.NET框架的核心内容之一,可以把它看为一套标准资源,可以被任何.NET程序使用。它包括:面向对象的编程模型、安全模型、类型系统(CTS)、所有.NET基类、程序执行以及代码管理等。

b)        JIT

即时编译(Just In-Time compile),这是.NET运行可执行程序的基本方式,也就是在需要运行的时候,才将对应的IL代码编译为本机指令。传入JIT的是IL代码,输出的是本机代码,所以部分加密软件通过挂钩JIT来进行IL加密(目前该技术运用得比较成熟的是Rick编写的DNGuard HVM”此款加密保护软件),同时又保证程序正常运行。

c)        元数据:

描述.NET程序运行所必需的一切信息的数据,包括版本、类型的各个成员(方法、字段、属性、事件)等。一个文件要成为有效的.NET可执行程序,必须包含正确的元数据定义。由于元数据被保存在PE文件中,在逆向中成为获取源程序信息的重要来源,因此对元数据的加密也是.NET加密软件的重点

d)        MSIL

微软中间语言(MicroSoft Intermediate Language),也被成为MSIL汇编,通常也叫做IL代码。托管语言在执行时,都是将我们的(C#,VB)编译为MSIL语言,再编译为本地机器语言执行。熟练掌握MSIL语言对逆向.NET程序有着至关重要的作用。

 

二、.NET程序运行流程

         1.我们用PEID打开一个普通的Windows下的非托管PE映像,查看文件的输入表信息,可以看到,一个普通的Windows下的非托管PE映像,程序启动时候会调用很多系统dll中的导入函数。  

技术分享

 

2.我们再用PEID打开一个托管的PE映像,可以很清晰地看到,.NET程序的输入表和Windows下的PE映像的输入表是有非常大的区别的!.NET程序输入表中只存放着”mscoree.dll”中的”_CorExeMain”这个导入函数!意味着.NET程序启动时候将首先执行函数”_corExeMain”,该函数主要进行了以下几个操作:

         a、通过查看PE文件的元数据,找出.NET文件是基于哪个版本创建的

         b、找出操作系统中正确版本的CLR的路径

         c、加载并初始化CLR

 

技术分享

 

 

..NET程序集加载算法总结如下:

         A、用户执行一个.NET程序集

         B、Windows加载器查看AddressOfEntityPoint域,并找到PE映像中的.Text段

         C、位于AddressOfEntityPoint位置上的字节只是一个JMP指令,这个指令跳转到mscoree.dll中的一个导入函数.

         D、将执行控制转移到mscoree.dll中的函数_ CorExeMain中,这个函数将启动CLR并且把执行控制转移到程序集的入口点

E、  JIT开始编译并执行入口点
 

三、CLR与JIT在程序运行中的作用

技术分享

By:凉游浅笔深画眉QQ:381400744

 

2015.03.08

 

逆向第三课(深入.NET程序运行原理)