鱼C论坛

 找回密码
 立即注册

MSCOREE的入口秘密

已有 330 次阅读2018-12-18 14:56 |个人分类:都来特

MSCOREE.DLL是.NET Framework中最为核心的DLL之一,没有这个DLL,.Net的托管程序根本无法执行起来,由于这个DLL藏在System32目录,所有少有人问津,可以说是有点委屈了这位.NET Framework中的幕后英雄。

MSCOREE是托管程序的入口点

先写一个简单的Hello World程序
public class Program
{
       public static void Main(string[] args)
       {
              System.Console.WriteLine("Hello World!");
       }
}
然后,编译以上程序得到A.exe

我们可以通过运行Visual Studio中自带的Depends.exe来查看A.EXE的对于DLL的依赖关系:

可以看到A.exe对MSCOREE.DLL有依赖关系,A.exe用到了mscoree.dll中的一个函数,即_CorExeMain。而mscoree.dll本身的导出函数有137个之多。从函数名字可以猜出,这个函数是exe的一个入口点。为了证实这一点,可以用DumpBin看看内容:

可以看到exe的入口点的RVA(相对虚拟地址)是23DE。使用Windbg加载A.exe,使用lmm (list module match)命令查看A.exe加载的首地址

可以看到是首地址是0x00de0000,再加上0x23DE的RVA地址,就是程序的入口点。用u命令反汇编看0x00de23de处汇编代码

可以看到这就是一条jmp指令,跳转到0x00de2000处,那这个位置是啥呢?我们接着使用dds命令来看

原来这里就是mscoree.dll里的_CorExeMain函数。意思就是说任何托管的exe程序中的入口点都是一条JMP指令直接跳转到mscoree.dll的_CorExeMain函数。这个_CorExeMain的地址(也就是00de2000所保存的0x5b034e50)则是由OS Loader填入,因为这个位置正是Import Table的位置。

对于一个托管的DLL而言,情况也非常类似,入口点则是_CorDllMain:


以上博文根据网上的文章整理自用。


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 01:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部