2013-01-08 34 views
2

我一直在搜尋網絡,試圖找到這個問題的答案,但它似乎在躲避我。在提出這個問題之前,我已經諮詢了以下來源。如何使用Dumpbin確定來自PE頭的AddressOfEntryPoint的RVA

我理解的PE格式(或至少我覺得我做的)。使用命令行調試器(cdb),我希望能夠反彙編RVA的地址,以查看第一個調用的內容。對於本機應用程序(如記事本),我期望看到記事本!WinMainCRTStartup,對於.NET應用程序,我期望看到一個jmp命令到CLR。

以記事本爲例,我對它執行了dumpbin/headers,並獲得了入口點的值3570。當我執行cdb記事本並執行此命令 - u [內存中的基址] + 0x3570 - 我沒有得到WinMainCRTStartup調用。

我誤解了dumpbin的PE輸出嗎?我怎樣才能確切地知道應該在哪裏查看內存中的應用程序的啓動功能?我忘了提及我在64位Windows 7上運行這個程序。如果我嘗試在Windows XP Mode中使用cdb(從32位獲得結果) OS),分解我從PE文件分析中得到的AddressOfEntryPoint讓我按照我的預期調用WinMainCRTStartup。換句話說,我被告知要查看的確切地址包含我認爲應該在32位操作系統中的內容。在64位計算機上運行應用程序是否真的能改變這種差異?

爲了增加複雜性,如果我在cdb的64位操作系統的ImageBaseAddress上執行!dh命令,我會得到我需要使用的EXACT AddressOfEntryPoint。

回答

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添加輸出for 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: 
+0

感謝回答sergmat。當我帶上調試器時,我一直在做.symfix和.reload。你是完全正確的!在調試器的基地址上顯示正確的AddressOfEntryPoint。你在技術上回答了我的問題,即如何才能確切地知道在哪裏尋找真正的啓動功能。非常感謝你! 作爲跟進,爲什麼這不是由dumpbin(或另一個PE分析儀)顯示的地址? –

+0

添加了dumpbin輸出到答案。 – sergmat

+0

您是在什麼版本的Windows上執行此操作的?什麼架構? –