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

我们可以这样理解,CLR是托管程序运行的环境,就像Windows是普通的PE程序的运行环境一样。
在Windows中,整个CLR系统的实现基本其实就是几个关键的DLL,比如mscorwks.dll、mscorjit.dll,它们共同的特点就是前缀均为mscor。

在win32中,可执行文件在开始运行时,有操作系统载入到内存中,然后运行文件中的.text代码,结束时有操作系统负责卸载。而在.NET下,这个过程却不大一样。用PE结构查看工具(这里使用PEiD)载入一个实例文件,观察导入表,可以发现整个表只引入了一个mscoree.dll中的一个方法:_CorExeMain。而这个方法,真是该可执行文件在win32意义上的入口点。

和win32程序一样,.NET可执行程序在运行初始,首先有Windows将PE载入内存,然后跳至_CorExeMain中执行。分水岭就在这,当代码跳至_CorExeMain中之后,程序运行进入了.NET的初始化阶段,经过一番准备工作,.NET框架便正式接管程序的运行了。

*********************************************************************

JIT:即时编译(Just In-Time
compile),这是.NET运行可执行程序的基本方式,也就是在需要运行的时候,才将对应的IL代码编译为本机指令。传入JIT的是IL代码,输出的是本机代码,所以部分加密软件通过挂钩JIT来进行IL加密,同时又保证程序正常运行。同解释执行的代码相比,JIT的执行效率要高很多。

说到这,我们先来了解下IL代码是从哪一个步骤得到的。

MSIL是将.NET代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一个.NET程序时,编译器将源代码翻译成Microsoft
中间语言
(MSIL),它是一组可以有效地转换为本机代码且独立于CPU的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。

也就是说,MSIL是一个中间语言,是由编译器编译而来的,属于第一个步骤(编译)的产物。

而当我们需要执行时,再将MSIL通过JIT即时编译成所需的机器指令来执行。

下面我们来看看MSIL的样子:

我们先用vs2012编写一个简单的控制台程序,hello world。

然后打开ildasm,具体步骤是这样的

输入命令后出现

我们将编译好的exe程序拖拽进ildasm中。

我们将程序进行转储,也就是传说中的dump

选择一些选项,然后保存

我们用记事本将保存的il文件打开,文件内容如下:


MSIL:微软中间语言(Microsoft Intermediate
Language),也被称作MSIL汇编。别看.NET框架很智能,其实它只认IL。无乱程序采用什么高级语言编写,都将被编译器编译为IL并保存在PE文件中。虽被称作汇编,但相比win32汇编语言,IL可谓是名副其实的高级语言:它支持面向对象,通常不直接操作内存地址,以堆栈机的方式运行。由于运行完全受.NET监控,因此IL属于托管(Managed)代码,与之对应的是本机代码,被称为非托管代码。

元数据:描述.NET程序运行说必需的一切信息的数据,包括版本、类型的各个成员(方法、字段、属性、事件)等。一个文件要称为有效的.NET可执行程序,必须包含正确的元数据定义。

我们来看看对应的hello world对应的元数据

// =============== CLASS MEMBERS DECLARATION ===================

.class private auto ansi beforefieldinit '观察导入表'.Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// 代码大小 17 (0x11)
.maxstack 8
.language '{3F5162F8-07C6-11D3-9053-00C04FA302A1}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}'
.line 13,13 : 13,47 'd:\\Pro\\CLR和JIT的理解\\观察导入表\\Program.cs'
IL_0000: ldstr "hello world!"
IL_0005: call void [mscorlib]System.Console::WriteLine(string)
.line 14,14 : 13,31 ''
IL_000a: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
IL_000f: pop
.line 15,15 : 9,10 ''
IL_0010: ret
} // end of method Program::Main .method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// 代码大小 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: ret
} // end of method Program::.ctor } // end of class '观察导入表'.Program // =============================================================

上面的代码中,首先通过.class关键字定义了Program类,于是编译器会在PE文件中保存Program类的元数据。接着,定义了Program类的两个方法.ctor和Main,元数据中也会体现这种隶属关系。

public hidebysig static void 限定了Main方法中的执行方式为公共、静态、无返回值(hidebysig暂时不讨论),这些限定也将被保存在元数据中。

Main方法中调用了System.Console的静态方法WirteLine用于输出字符串,元数据中必须体现这种调用。

以上内容来自:《微软.NET程序的加密与解密》,学习这些内容只是为了能更好的理解所学的C#内容,暂时不涉及逆向的问题。

原文;http://www.cnblogs.com/tk091/archive/2012/09/01/2666810.html

【转】CLR和JIT的理解、.NET反汇编学习的更多相关文章

  1. 什么是.NET CLI CLR IL JIT GC,它们是如何工作的

    参考网址: https://cloud.tencent.com/developer/article/1432891 1:什么是.NET? NET 是 Microsoft 的用以创建 XML Web 服 ...

  2. CLR和JIT

    在使用IDE进行编译的时候,这个过程具体的叫法是,使用编译器面向CLR来生成代码.对于不同的开发语言,使用的的编译器也不一样,但是生成的代码都一样. “无论选用哪一个编译器,结果都是一个托管模块.” ...

  3. 用Windbg来看看CLR的JIT是什么时候发生的

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Windbg来看看CLR的JIT是什么时候发生的.

  4. C#中IL, CTS, CLR, CLS, JIT含义

    1. IL/MSIL  (Microsoft Intermediate Language) 微软中间语言 (IL是MSIL的缩写,译为中间语言) 2. CTS  (Common Type System ...

  5. IDA反汇编学习

    1 转自:http://www.cnblogs.com/vento/archive/2013/02/09/2909579.html IDA Pro是一款强大的反汇编软件,特有的IDA视图和交叉引用,可 ...

  6. 《深入理解计算机系统》学习总结 Chap7

    第七章 链接 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行.链接可以执行于编译时,也就是在源代码被翻译成机器代码时:也可以执行于加载时,也就 ...

  7. 关于闭包的理解(JS学习小结)

    前言: 啊啊啊,看书真的很痛苦啊,还是好想做项目写代码才有意思,不过我现在缺的确是将知识体系化,所以不论看书多么痛苦都一定要坚持坚持啊,这才是我现在最需要的进步的地方,加油! 因为现在期末啦,下周一也 ...

  8. 深入理解Java虚拟机 - 学习笔记 1

    Java内存区域 程序计数器 (Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里,字节码解释器工作时就是通过 ...

  9. 深入理解Java虚拟机---学习感悟以及笔记

    一.为什么要学习Java虚拟机?       这里我们使用举例来说明为什么要学习Java虚拟机,其实这个问题就和为什么要学习数据结构和算法是一个道理,工欲善其事,必先利其器.曾经的我经常害怕处理内存溢 ...

随机推荐

  1. jsp+servlet实现文件的上传和下载

    实现文件的上传和下载首先需要理解几个知识,这样才可以很好的完成文件的上传和下载: (1):上传文件是上传到服务器上,而保存到数据库是文件名 (2):上传文件是以文件转换为二进制流的形式上传的 (3): ...

  2. POJ 1328 Radar Installation【贪心】

    POJ 1328 题意: 将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量. 分析: 贪心法 ...

  3. NodeMCU入门(1):刷入At固件,透传数据到TcpServer和Yeelink平台

    准备工作 1. NodeMCU  LUA ESP8266 CP2102  WIFI Internet Development Board,仔细看背面可以看出自带cp2102模块,可以通过普通的手机充电 ...

  4. BZOJ1191 [HNOI2006]超级英雄Hero 二分图匹配

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1191 题目概括 有m个题目,有n个解决方案:对于每一个题目,有两种解决方案可用. 每种解决方案只能 ...

  5. 076 Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)

    1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...

  6. Web轻量级扫描工具Skipfish

    Web轻量级扫描工具Skipfish 1. Skipfish 简介 2. Skipfish 基本操作 3.身份认证 一. Skipfish 简介 Skipfish是一款主动的Web应用程序安全侦察工具 ...

  7. 001.Docker简介概述

    一 简介 Docker最初是dotCloud公司的一个内部项目,诞生于 2013 年初,由google公司开源的Go语言开发. Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移 ...

  8. 前端解读面向切面编程(AOP)

    前言 面向对象(OOP)作为经典的设计范式,对于我们来说可谓无人不知,还记得我们入行起始时那句经典的总结吗-万事万物皆对象. 是的,基于OOP思想封装.继承.多态的特点,我们会自然而然的遵循模块化.组 ...

  9. [漏洞分析]thinkphp 5.x全版本任意代码执行分析全记录

    0x00 简介 2018年12月10日中午,thinkphp官方公众号发布了一个更新通知,包含了一个5.x系列所有版本存在被getshell的高风险漏洞. 吃完饭回来看到这个公告都傻眼了,整个tp5系 ...

  10. 用postcss cli运行postcss

    一.验证autoprefixer插件1.新建项目 新建文件夹postcss: 在postcss目录中,新建package.json文件,新建css文件夹: 在css文件夹新建outfile.css,i ...