我一直在网上搜索试图找到这个问题的答案,但它似乎在逃避我。在提出这个问题之前,我已经咨询了以下来源。
我理解PE格式(或者至少我认为我这样做)。使用命令行调试器(cdb),我希望能够反汇编RVA所在的地址,以查看第一次调用的内容。对于本机应用程序(如记事本),我希望看到记事本!WinMainCRTStartup ,对于.NET应用程序,我希望看到CLR的jmp命令。
以记事本为例,我在其上执行了 dumpbin / headers ,并为入口点获得了3570的值。当我执行 cdb notepad 并执行此命令 - u [内存中的基地址] + 0x3570 时 - 我没有得到WinMainCRTStartup调用。
我是否误解了dumpbin的PE输出?我怎样才能准确知道应用程序的启动功能在内存中的位置?
编辑(1/7/13):我忘了提到我在64位Windows 7上运行此操作。如果我尝试在Windows XP模式下使用cdb(从中获取结果)一个32位的操作系统),反汇编我从PE文件的分析得到的AddressOfEntryPoint让我调用WinMainCRTStartup,正如我所料。换句话说,我被告知要查看的确切地址包含我认为应该在32位操作系统中应该使用的地址。在64位计算机上运行应用程序真的会产生很大的不同吗?
只是为了增加复杂性,如果我在cdb中的64位操作系统中对ImageBaseAddress执行操作,我会得到需要使用的EXACT AddressOfEntryPoint。
答案 0 :(得分:2)
使用Microsoft Symbol Server获取符号调试信息。 http://support.microsoft.com/kb/311503/en-us
0:001> !dh -a notepad
....
3689 address of entry point
...
00ac0000 image base
...
0:001> u ac3689
notepad!WinMainCRTStartup:
编辑:添加dumpbin输出(入口点的偏移量相同,图像库可能不同,因为ASLR在内存中加载图像时有效):
Microsoft (R) COFF/PE Dumper Version 11.00.50727.1
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file c:\windows\notepad.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
4 number of sections
4A5BC60F time date stamp Tue Jul 14 03:41:03 2009
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
102 characteristics
Executable
32 bit word machine
OPTIONAL HEADER VALUES
10B magic # (PE32)
9.00 linker version
A800 size of code
22400 size of initialized data
0 size of uninitialized data
3689 entry point (01003689) _WinMainCRTStartup
编辑2 为x64添加输出
DUMPBIN:
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file c:\windows\notepad.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
8664 machine (x64)
6 number of sections
4A5BC9B3 time date stamp Tue Jul 14 03:56:35 2009
0 file pointer to symbol table
0 number of symbols
F0 size of optional header
22 characteristics
Executable
Application can handle large (>2GB) addresses
OPTIONAL HEADER VALUES
20B magic # (PE32+)
9.00 linker version
A800 size of code
25800 size of initialized data
0 size of uninitialized data
3570 entry point (0000000100003570) WinMainCRTStartup
WinDBG的:
0:000> !dh -a notepad
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
8664 machine (X64)
...
1000 base of code
----- new -----
00000000ff0c0000 image base
...
0:000> u ff0c0000+3570
notepad!WinMainCRTStartup: