首页 > 代码库 > 逆向第三课(深入.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程序运行原理)