通过windbg查看.net程序的加载过程
先列出我的windbg的配置
C:\WINDOWS\Symbols;
C:\Program Files\Microsoft Visual Studio8\SDK\v2.0\symbols;
srv*e:\symbols*http://msdl.microsoft.com/download/symbols;
e:\symbols;
C:\Inetpub\wwwroot\wss\VirtualDirectories\80\bin
1.用dumpbin /all consoleapplication3.exe c:\aa.txt
查看该程序内容,其中在OPTIONAL HEADER VALUES节可以看到 277E entry point (0040277E) 的字样。
2.用windbg打开该程序
执行命令lmm (list module match)命令查看程序加载的首地址.
输出结果:
0:000> lmm Consoleapplication3
start end module name
00400000 00408000 ConsoleApplication3 C (deferred)
3. 00400000 + 277E = 0040277E
继续在windbg中执行反汇编命令
u 0040277E
输出结果
0:000> u 0040277E
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x277e):
0040277e ff2500204000 jmp dword ptr [ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x2000) (00402000)]
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x2784):
00402784 0000 add byte ptr [eax],al
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x2786):
00402786 0000 add byte ptr [eax],al
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x2788):
00402788 0000 add byte ptr [eax],al
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x278a):
0040278a 0000 add byte ptr [eax],al
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x278c):
0040278c 0000 add byte ptr [eax],al
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x278e):
0040278e 0000 add byte ptr [eax],al
ConsoleApplication3!COM+_Entry_Point <PERF> (ConsoleApplication3+0x2790):
00402790 0000 add byte ptr [eax],al
可以看到会用jmp命令跳转到00402000处。
4.继续用dds{Display words and symbols (memory at Addr is assumed to be a series of addresses in the symbol table)
dds = dwords (4b)
dqs = qwords (8b)} 命令查看该位置到底是什么。
0:000> dds 00402000
00402000 7900b183 mscoree!_CorExeMain
00402004 00000000
00402008 00000048
0040200c 00050002
00402010 00002098
.....
5.至此可以确定托管程序的加载是由mscoree.dll中的_CorExeMain开始的。