我试图了解加载可执行文件的机制,所以我用notepad.exe做了两个不同的测试
1)运行dumpbin命令:
dumpbin /ALL "C:\Windows\System32\notepad.exe" /OUT:"C:\sample\log4.txt"
在OPTIONALHEADER值下,我得到了以下值:
1AC50 entry point (000000014001AC50) WinMainCRTStartup
1000 base of code
140000000 image base (0000000140000000 to 0000000140042FFF)
2)运行WinDbg:
x notepad!*CRT*
我得到这些:
00b9bf9a notepad!__mainCRTStartup (void)
00b9bf90 notepad!WinMainCRTStartup (<no parameter info>)
00ba04a4 notepad!msvcrt_NULL_THUNK_DATA = <no type information>
00ba050c notepad!_IMPORT_DESCRIPTOR_msvcrt = <no type information>
我不明白为什么14001AC50和00b9bf90是不同的值。它们不应该是相同的AddressOfEntryPoint值吗?
预先感谢
答案 0 :(得分:3)
造成差异的原因有很多。
首先,您正在dumpbin
的x64版本的notepad.exe
上运行System32
,但是您似乎正在调试notepad.exe
中存储的x86 SysWoW64
}。确保已启动x64或AMD64版本的WinDbg,并且已附加到C:\Windows\System32\notepad.exe
。
一旦解决了这个问题,事情就应该变得更有意义了,但还有一点要记住。 WinDbg中的x
命令在运行过程中显示符号的虚拟内存地址,而dumpbin
将其显示为与模块基地址的偏移量。
从模块库中快速减去一些东西,应该使它们匹配。
这是我的系统上的样子:
C:\>dumpbin /ALL "C:\Windows\System32\notepad.exe" | find "entry point"
1AC50 entry point (000000014001AC50) WinMainCRTStartup
0:000> x notepad!WinMainCRTStartup
00007ff6`4fe1ac50 notepad!WinMainCRTStartup (<no parameter info>)
0:000> ? notepad!WinMainCRTStartup - notepad
Evaluate expression: 109648 = 00000000`0001ac50