pe(portable execute)檔案是windows下可執行檔案的總稱,常見的有dll,exe,ocx,sys等,事實上,乙個檔案是否是pe檔案與其副檔名無關,pe檔案可以是任何副檔名。pe檔案是指32位可執行檔案,也稱pe32。64位可執行檔案稱為pe+或pe32+,是pe(pe32)的一種擴充套件形式(注意不是pe64)
pe檔案的結構一般來說如下圖所示:從起始位置開始依次是dos頭,nt頭,節表以及具體的節。
dos頭是用來相容ms-dos作業系統的,64位元組,共四行,目的是當這個檔案在ms-dos上執行時提示一段文字,大部分情況下是:this program cannot be run in dos mode.還有乙個目的,就是指明nt頭在檔案中的位置。
4位元組(共4行)的dos頭,第乙個成員2個位元組是可執行檔案的標誌資訊;最後乙個成員4位元組是pe頭的偏移位址為00000100h,我們可以根據00000100h來獲取pe頭的位址。而dos頭和pe頭中間的空餘位置是一些垃圾值以及編譯器填充的一些「is program cannot be run in dos mode.」或「this program must be run under win32」等資訊。
nt頭包含windows pe檔案的主要資訊,其中包括乙個『pe』字樣的簽名,pe檔案頭(image_file_header)和pe可選頭(image_optional_header32)。
節表:是pe檔案後續節的描述,windows根據節表的描述載入每個節。
節:每個節實際上是乙個容器,可以包含**、資料等等,每個節可以有獨立的記憶體許可權,比如**節預設有讀/執行許可權,節的名字和數量可以自己定義,未必是上圖中的三個。
pe檔案使用偏移(offset),記憶體中使用va(virtual address)來表示位置。
va指虛擬記憶體的絕對位址,rva(relative virtual address,相對虛擬位址)是指從某基準位置(image base)開始的相對位址。
pe頭內部資訊大多是以rva形式存在,原因在於pe檔案(主要是dll)載入到程序虛擬記憶體的特定位置時,該位置可能已經載入了其他pe檔案(dll),此時必須通過重定向( relocation)將其載入到其他空白的位置,若pe頭資訊使用的是va,則無法正常訪問。因此使用rva來重定向資訊,即使發生了重定向,只要相對於基準位置的相對位置沒有變化,就能正常訪問到指定資訊,不會出現任何問題。
當pe檔案被執行時,pe裝載器會為程序分配4g的虛擬位址空間,然後把程式所占用的磁碟空間作為虛擬記憶體對映到這個4g的虛擬位址空間(imagebase)中,一般情況下,會對映到虛擬位址空間中的0x400000的位置。
va與rva滿足以下換算關係:
rva+imagebase=va
header結構(00000000 - 0000003f,共64個位元組)
typedef struct _image_dos_header image_dos_header, *pimage_dos_header;
#注意win+intel的電腦上大部分採用」小端法」,位元組在記憶體中儲存方式是倒過來的。
重要引數為e_magic
和e_lfanew
dos存根(00000040 - 000000bf,共128位元組)dos存根則是一段簡單的dos程式,主要用來輸出類似「this program cannot be run in dos mode.」的提示語句。即使沒有dos存根,程式也能正常執行。
typedef struct _image_nt_headers image_nt_headers32, *pimage_nt_headers32;
typedef struct _image_file_header image_file_header, *pimage_file_header;
typedef struct _image_optional_header image_optional_header32, *pimage_optional_header32;
typedef struct _image_data_directory image_data_directory, *pimage_data_directory;
#define image_directory_entry_export 0 // export directory ''#define image_directory_entry_import 1 // import directory
PE檔案結構(一) MS DOS頭 ,PE頭
ms dos頭 標準pe頭 擴充套件pe頭 資料目錄 節表各個欄位的含義 第乙個字段 mz標誌位 e magic 是乙個常量,一般都是0x4d5a 最後乙個字段 pe頭偏移 e ifanew 指向新的pe頭,偏移量為0x0138 位於0x0138 typedef struct image nt he...
PE檔案結構
pe檔案結構 a,dos header timagedosheader 其中 lfanew 指向 c e magic 為 mz b,dos stub 用於不支援pe的作業系統,顯示錯誤提示如 this program requires windows 不定長 c,pe header timagent...
PE檔案頭結構
typedef struct image file header image file header,pimage file header 1.machine 每個cpu都有唯一的machine碼,用來指定檔案的執行平台 define image file machine unknown 0 def...