首页
社区
课程
招聘
7
[原创]从源代码看.net下exe的加载过程
发表于: 2006-9-11 18:24 15439

[原创]从源代码看.net下exe的加载过程

2006-9-11 18:24
15439

这里的源代码自然不是指.net Framework的源码,不过微软公开了一个代号为rotor的open source cli的源码,你可以把它看为轻量级的.net framework。最关键的是,它俩的运行机理大致相同。今天,我们就从rotor的源码中看看做为程序调试最基本的exe文件的动态加载。同样,先给出参考文献,免得有人说我抄袭。《inside the rotor cli》,另一本是《shared source cli》,只不过网上搞不到。当然,还要从MSDN的网站下载sscli2.0压缩包。
    和win32下一样,系统会提供一个loader将exe读入,sscli中提供了另一个loader的例子:clix.exe。我们暂且把它看为系统默认的loader,来看源码(clix.cpp),注意红色的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DWORD Launch(WCHAR* pFileName, WCHAR* pCmdLine)
{
    WCHAR exeFileName[MAX_PATH + 1];
    DWORD dwAttrs;
    DWORD dwError;
    DWORD nExitCode;
 
...
[color=green]//这里进行一系列文件的属性检查[/color]
...
  
    if (dwError != ERROR_SUCCESS) {
        // We can't find the file, or there's some other problem. Exit with an error.
        fwprintf(stderr, L"%s: ", pFileName);
        DisplayMessageFromSystem(dwError);
        return 1;   // error
    }
[color=red]    nExitCode = _CorExeMain2(NULL, 0, pFileName, NULL, pCmdLine);[/color]
 
    // _CorExeMain2 never returns with success
    _ASSERTE(nExitCode != 0);
 
    DisplayMessageFromSystem(::GetLastError());
 
    return nExitCode;
}
1
2
3
4
5
6
[color=red].text:79011B47                 push    offset a_corexemain ; "_CorExeMain"[/color]
.text:79011B4C                 push    [ebp+hModule]   ; hModule
.text:79011B4F                 call    ds:__imp__GetProcAddress@8 ; GetProcAddress(x,x)
.text:79011B55                 test    eax, eax
.text:79011B57                 jz      loc_79019B46
[color=red].text:79011B5D                 call    eax[/color]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
__int32 STDMETHODCALLTYPE _CorExeMain2( // Executable exit code.
    PBYTE   pUnmappedPE,                // -> memory mapped code
    DWORD   cUnmappedPE,                // Size of memory mapped code
    __in LPWSTR  pImageNameIn,          // -> Executable Name
    __in LPWSTR  pLoadersFileName,      // -> Loaders Name
    __in LPWSTR  pCmdLine)              // -> Command Line
{
 
    // This entry point is used by clix
    BOOL bRetVal = 0;
 
    //BEGIN_ENTRYPOINT_VOIDRET;
 
    // Before we initialize the EE, make sure we've snooped for all EE-specific
    // command line arguments that might guide our startup.
    HRESULT result = CorCommandLine::SetArgvW(pCmdLine);
 
    if (!CacheCommandLine(pCmdLine, CorCommandLine::GetArgvW(NULL))) {
        LOG((LF_STARTUP, LL_INFO10, "Program exiting - CacheCommandLine failed\n"));
        bRetVal = -1;
        goto exit;
    }
 
    if (SUCCEEDED(result))
[color=red]        result = CoInitializeEE(COINITEE_DEFAULT | COINITEE_MAIN);[/color]
 
    if (FAILED(result)) {
        VMDumpCOMErrors(result);
        SetLatchedExitCode (-1);
        goto exit;
    }
 
    // This is here to get the ZAPMONITOR working correctly
    INSTALL_UNWIND_AND_CONTINUE_HANDLER;
 
 
    // Load the executable
[color=red]    bRetVal = ExecuteEXE(pImageNameIn);[/color]
 
...
...

[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 7
支持
分享
赞赏记录
参与人
雪币
留言
时间
QinBeast
为你点赞~
2023-10-23 00:37
shinratensei
为你点赞~
2023-10-22 00:33
Youlor
为你点赞~
2023-9-30 05:04
伟叔叔
为你点赞~
2023-6-29 00:06
PLEBFE
为你点赞~
2023-5-14 04:42
心游尘世外
为你点赞~
2023-4-22 04:47
飘零丶
为你点赞~
2023-4-21 01:46
最新回复 (13)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
支持一下hmx
2006-9-11 18:31
0
雪    币: 55963
活跃值: (21445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
谢谢tankaiha给大家带来这么多篇.net相关文章!
2006-9-11 18:32
0
雪    币: 7327
活跃值: (3813)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
4
.NET文章确实不多,这几篇都是经典
争取上看雪主页
2006-9-11 19:12
0
雪    币: 55963
活跃值: (21445)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 海风月影 发布
.NET文章确实不多,这几篇都是经典
争取上看雪主页


准备有时间,将主页的解密教学升级一下:
http://www.pediy.com/tutorial.htm

tankaiha几篇肯定搬上去。
2006-9-11 19:13
0
雪    币: 214
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
不简单啊
2006-9-11 19:37
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
受教了,高手!
2006-9-11 19:57
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
8
辛苦,多谢,
down了loader,
学习一下...
2006-9-11 20:10
0
雪    币: 5275
活跃值: (491)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
9
sorry,原文中有一个概念性错误:每个assembly中包含多个module,至少有一个module有且只有一个MainMethod,就是入口方法。而不是原来的每一个module有且只有一个入口方法,有的module可以不含的。

唉,我写的几篇文章都是学习笔记。这些外国人的东西已经不新了,只不过我们看的太迟了。而且.net大规模普及估计要等到捆绑.net framework的windows发布才行。不过说实话,这些东西越看越有意思。
2006-9-11 20:30
0
雪    币: 155
活跃值: (2991)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
.net的资料收藏!
2006-9-11 21:04
0
雪    币: 216
活跃值: (70)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
的确是学习.NET的好料
顶了,lz再接再厉吧
2006-9-11 23:27
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
支持支持
2006-9-12 06:11
0
雪    币: 200
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习中,谢谢
2006-9-12 09:28
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
是不简单啊!
2009-4-25 22:36
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册