4

我一直在网上搜索试图找到这个问题的答案,但它似乎在逃避我。在问这个问题之前,我已经咨询了以下来源。

我了解 PE 格式(或者至少我认为我了解)。使用命令行调试器 (cdb),我希望能够反汇编 RVA 所在的地址,以查看第一个调用是什么。对于本机应用程序(如记事本),我希望看到notepad!WinMainCRTStartup,对于 .NET 应用程序,我希望看到 CLR 的 jmp 命令。

以记事本为例,我在上面执行了dumpbin /headers,得到的入口点值为3570。当我执行cdb notepad并执行此命令时 - u [内存中的基地址]+0x3570 - 我没有收到 WinMainCRTStartup 调用。

我是否误解了 dumpbin 的 PE 输出?我怎样才能确切地知道在内存中查找应用程序的启动功能的位置?

编辑(1/7/13):我忘了提到我在 64 位 Windows 7 上运行它。如果我尝试在 Windows XP 模式下使用 cdb(从 32 位操作系统获取结果),反汇编 AddressOfEntryPoint正如我所期望的那样,我从 PE 文件的分析中得到了对 WinMainCRTStartup 的调用。换句话说,我被告知要查看的确切地址包含我认为在 32 位操作系统中应该看到的地址。在 64 位机器上运行应用程序真的有那么大的不同吗?

只是为了增加复杂性,如果我在 cdb 的 64 位操作系统中对 ImageBaseAddress 执行 !dh,我会得到我需要使用的 EXACT AddressOfEntryPoint。

4

1 回答 1

4

使用 Microsoft 符号服务器获取符号调试信息。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 添加输出

垃圾箱:

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

风声:

    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:
于 2013-01-08T08:14:56.350 回答