1. 程式人生 > >圖解用工具對PE檔案格式做初步研究

圖解用工具對PE檔案格式做初步研究

工具:

PETool,MiniHex,PEViewer

以本機notepad.exe為研究物件。本機64位,該notepad.exe是64位應用程式。

1 用peviewer開啟

PE檔案大體包括四部分,DOS頭,NT頭,節表以及具體的節。下圖展示的是前三部分。


2 DOS頭

e_magic:一個WORD型別,值是一個常數0x4D5A,用文字編輯器檢視該值位‘MZ’,可執行檔案必須都是'MZ'開頭。

e_lfanew:為32位可執行檔案擴充套件的域,用來表示DOS頭之後的NT頭相對檔案起始地址的偏移。

看下圖左方給出的e_lfanew為0x000000E8,在下圖右方找到此地址,如右方000000E0所示行的游標處;

起始四個位元組是50 45 00 00,和右圖的PE頭的Signature相符合;


3 檔案頭

PE檔案頭的定義:

typedef struct _IMAGE_FILE_HEADER {  
    WORD    Machine;  
    WORD    NumberOfSections;  
    DWORD   TimeDateStamp;  
    DWORD   PointerToSymbolTable;  
    DWORD   NumberOfSymbols;  
    WORD    SizeOfOptionalHeader;  
    WORD    Characteristics;  
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;  

Machine:該檔案的執行平臺,是x86、x64還是I64等等,可以是下面值裡的某一個。
NumberOfSections:該PE檔案中有多少個節,也就是節表中的項數。
TimeDateStamp:PE檔案的建立時間,一般有聯結器填寫。

對照下圖左方顯示和右方游標處,其內容相符合;




4 匯入表

自己算下匯入表的起始地址,比較難算;用工具看下,如下圖;匯入表起始地址是

0x00000178


peviewer給出的匯入表內容;


看16進位制檔案中的00000178,與peviewer給出的似乎不符,不過此處還不太理解;


16進位制檔案和PETool給出的內容是相符合的;

5 匯入表中的函式名

試著找下匯入的SetWindowText函式的名字在16進位制檔案中的位置;


什麼是Thunk RVA,對相關計算尚不太熟悉;

直接找到0000D640處看看,不是SetWindowText;


用搜索功能找SetWindowText;在如下位置;這個RVA的計算是比較複雜;以後再搞;


連結

http://www.pediy.com/kssd/tutorial/chap8-1-6.htm
http://blog.csdn.net/evileagle/article/details/11693499