.NET应用程序是如何加载CLR的?
2021-01-26 05:14
标签:code img 启动命令 学习过程 demo 应用 relative 隐藏 write 一、序言: 在工作中,由于项目上的一些疑难杂症,想用Windbg来调试一下,所以想深入学习一下Windbg的脱码调试技术。但Windbg只是一个工具,能用和会用差别巨大。苦于理论基础知识不足,所以在学习过程中走了很多弯路,所以想把自己学习的过程记录下来。 二、疑问: Windbg提供了多种调试模式,除了内核模式外,对.NET应用程序可以用Live模式以及事后调试模式。当Windbg加载应用程序的时候,看着初始的启动命令感觉很好奇。 1、操作系统是怎么加载.NET应用程序的? 2、操作系统是怎么知道当前应用程序的FrameWork的版本的? 等等诸多疑问。查阅了前辈的技术资料后,才得知,这一切都隐藏在.NET的应用程序文件里。查阅Windows的PE文件格式后,才渐渐明白了一点。 三、PE格式: 根据2f28的PE系列教程,学习了一些关于PE文件格式的基础知识。详细参阅:https://www.cnblogs.com/2f28/p/9800992.html 四、然后结合一个简单的程序,来对.NET程序如何启动CLR做一个简单的追踪。 这个程序很简单,编译后,我们用16位的文件编辑器来看一下。参照微软官方对PE文件的入口解释,我们找到了AddressOfEntryPoint结点。 A8H 对应的是相对于程序基值的偏移地址 250E,184H为虚地址2000H。 然后,我们启动Windbg。用Windbg打开应用程序,程序启动后,会停下来,等待命令输入。程序被加载在003e0000的位置。 我们在程序的入口处,即加载镜像250EH处用BP命令设置断点,继续输入G命令让程序继续执行。 用DD命令转储函数,找到函数的地址。然后用!U命令进行反汇编: 可以看到程序去加载了MSCOREE!ShellShim__CorExeMain 。这个应该就是EXE程序来初始化CLR的。而dll则调用__CorDllMain函数来初始。 详细参阅微软官方文档:https://docs.microsoft.com/en-us/dotnet/framework/unmanaged-api/hosting/corexemain-function?redirectedfrom=MSDN .NET应用程序是如何加载CLR的? 标签:code img 启动命令 学习过程 demo 应用 relative 隐藏 write 原文地址:https://www.cnblogs.com/hzwanglw/p/13233206.htmlusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WindbgDemo
{
class CallClr
{
static void Main(string[] args)
{
Console.WriteLine("Program Main...");
Console.ReadKey();
}
}
}
16
4
AddressOfEntryPoint
The address of the entry point relative to the image base when the executable file is loaded into memory. For program images, this is the starting address. For device drivers, this is the address of the initialization function. An entry point is optional for DLLs. When no entry point is present, this field must be zero.
文章标题:.NET应用程序是如何加载CLR的?
文章链接:http://soscw.com/index.php/essay/47127.html