逆向第三课(深入.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

时间: 2024-10-08 19:59:26

逆向第三课(深入.NET程序运行原理)的相关文章

Windows程序运行原理

Windows程序运行原理 1.应用程序,操作系统,硬件之间的关系 这里涉及到消息及消息队列, 操作系统是通过消息机制(Message)来将感知到的事件传递给应用程序的. 操作系统将每个事件都包装成一个称为消息的结构体MSG来传递给应用程序. 操作系统对事件做出反应的过程就叫做消息响应 typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt

java程序运行原理

一.JRE.JDK.JVM 要了解java程序运行原理,首先需要了解知道jre.jdk.jvm这三者是什么,他们之间又有什么联系. JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台.所有的Java 程序都要在JRE下才能运行. JDK(Java Development Kit,java开发工具包)是程序开发者用来来编译.调试java程序用的开发工具包.JDK的工具也是Java程序,也需要JRE才能运行.为了保持JDK的独立性和完整性,在JDK的安装过程

Windows程序设计笔记1:第2章:win32程序运行原理

第2章:win32程序运行原理 内核对象:对象句柄,标示符,进程相关的,只能被1个进程里面的其他线程访问,不透明的,封装过的. 创建进程:返回STARTUPINFO类型的变量对象,包含了父进程传递给子进程的显示信息,   STARTUPINFO是一种类类型,和内含的类型是一样的, STARTUPINFO si={sizeof(&si)}; //初始化startupinfo的大小 ::GetStartupinfo(&si); //调用startupinfo对象 创建进程:CreateProc

.NET 程序运行原理

“Overview of the Common Language Infrastructure”,作者Jarkko Piiroinen - 自己的作品.采用Public domain授权,来自维基共享资源. 右图即为运行图. 最上层即为各种语言,然后经过对应的编译器编译成程序集,也就是 CIL 通用中间语言 最后,再由 CLR 公共语言运行时 编译成机器码 CLI 一个规范 .NET 程序运行原理

QF——iOS程序运行原理

iOS程序的运行原理: 1> main.m 主函数是所有程序的入口函数. 2> 在main函数里是UIApplicationMain函数,开启了一个无限循环,以监听该应用. 该UIApplicationMain函数有4个参数,前两个分别是main函数的参数,第3个参数UIApplication的类名,第4个是应用的代理类名. 2.1> 创建一个UIApplication实例,单例的,一个应用对应一个该对象,代表整个应用程序. 2.2> 再创建一个UIApplication的dele

第二章--Win32程序运行原理 (部分概念及代码讲解)

学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不能被该线程访问. PS:进程A在其地址空间的0x12345678地址处能够有一个数据结构,而进程B能够在其地址空间的0x12345678处存储一个完全不同的数据.彼此不能访问. 2. 在大多数系统中,Windows将地址空间的一半(4GB的前一半,0x00000000-0x7FFFFFFF)留给进程作为私有存

第三课、初识程序的灵魂------------------------狄泰软件学院

一.初识程序的灵魂 1.数据结构静态描述了数据元素之间的关系 2.高效的程序需要在数据结构的基础上设计和选择算法 高效的程序需要: (1).恰当的数据结构 (2).合适的算法 3.算法是特定问题求解步骤的描述,在计算机中表现为指令的有限序列 (1).算法是独立存在的一种解决问题的方法和思想 (2).对于算法而言:语言不重要,重要的是思想 4.算法的特性 (1).输入:算法具有0个或者多个输入 (2).输出:算法至少有一个或者多个输出 (3).有穷性:算法在有限的步骤之后会自动结束而不会自动循环

Java程序运行原理分析

class文件内容 class文件包含Java程序执行的字节码 数据严格按照格式紧凑排列在class文件的二进制流,中间无分割符 文件开头有一个0xcafebabe(16进制)特殊的标志 JVM运行时数据区 线程独占: 每个线程都会有它独立的空间,随线程的生命周而创建和销毁 线程共享: 所有线程都能访问这块内存数据,随虚拟机或GC而创建和销毁 方法区 方法区是各个线程共享的内存区域 用于存储已被虚拟机加载的类信息, 常量,静态变量, 即时编译后的代码等数据 虽然Java虚拟机规范把方法区描述为堆

孙鑫MFC学习笔记1:Win32程序运行原理

1.MSG结构 hwnd:窗口句柄 message:消息类型 wParam & lParam:消息的附加信息(比如键值) time:消息被投递的时间 tip:typedef的作用是从变量类型区分变量用途 2.WinMain 3.程序开发步骤 4.设计窗口类 5.创建窗口.显示窗口.更新窗口 6.回调函数 tip:BeginPaint.EndPaint只能在响应WM_PAINT消息中使用,而GetDC不能在这里使用 tip:if语句中如果是常量与变量比较是否相等,应该把常量写在左边(可以避免把==