欢迎来到天天文库
浏览记录
ID:37662737
大小:117.35 KB
页数:8页
时间:2019-05-28
《从源代码看.net下exe的加载过程》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、这里的源代码自然不是指.netFramework的源码,不过微软公开了一个代号为rotor的opensourcecli的源码,你可以把它看为轻量级的.netframework。最关键的是,它俩的运行机理大致相同。今天,我们就从rotor的源码中看看做为程序调试最基本的exe文件的动态加载。同样,先给出参考文献,免得有人说我抄袭。《insidetherotorcli》,另一本是《sharedsourcecli》,只不过网上搞不到。当然,还要从MSDN的网站下载sscli2.0压缩包。和win32下一样,系统会提供一个loader将exe读入,sscli中提供了另一个loader的例子:c
2、lix.exe。我们暂且把它看为系统默认的loader,来看源码(clix.cpp),注意红色的代码代码:--------------------------------------------------------------------------------DWORDLaunch(WCHAR*pFileName,WCHAR*pCmdLine){WCHARexeFileName[MAX_PATH+1];DWORDdwAttrs;DWORDdwError;DWORDnExitCode;...//这里进行一系列文件的属性检查...if(dwError!=ERROR_SUCCESS){
3、//Wecan'tfindthefile,orthere'ssomeotherproblem.Exitwithanerror.fwprintf(stderr,L"%s:",pFileName);DisplayMessageFromSystem(dwError);return1;//error}nExitCode=_CorExeMain2(NULL,0,pFileName,NULL,pCmdLine);//_CorExeMain2neverreturnswithsuccess_ASSERTE(nExitCode!=0);DisplayMessageFromSystem(::GetLast
4、Error());returnnExitCode;}--------------------------------------------------------------------------------这里我们看到了著名的CorExeMain,还记得用PE编辑文件打开.netPE文件,只引入了一个函数吗?mscoree.dll!_CorExeMain。奇怪,怎么不是_CorExeMain2呢?这只是rotor和商业版的framework的一点区别而已。你可以用IDApro逆一下mscoree.dll,就可以看到_CorExeMain()只不过是一个中转,代码如下代码:----
5、----------------------------------------------------------------------------.text:79011B47pushoffseta_corexemain;"_CorExeMain".text:79011B4Cpush[ebp+hModule];hModule.text:79011B4Fcallds:__imp__GetProcAddress@8;GetProcAddress(x,x).text:79011B55testeax,eax.text:79011B57jzloc_79019B46.text:79011B5D
6、calleax--------------------------------------------------------------------------------进入后马上就调用了mscorwks.dll的_CorExeMain。而这个函数和rotor中刚才提到的_CorExeMain2提供的功能差不多,就开始exe载入的初始化了。这些都可以从反汇编代码与源代码比较看出来。继续回到sscli中,来看_CorExeMain2()的代码(ceemain.cpp)代码:--------------------------------------------------------
7、------------------------__int32STDMETHODCALLTYPE_CorExeMain2(//Executableexitcode.PBYTEpUnmappedPE,//->memorymappedcodeDWORDcUnmappedPE,//Sizeofmemorymappedcode__inLPWSTRpImageNameIn,//->ExecutableName__inLPWSTRpLoadersFileN
此文档下载收益归作者所有