1 概論
看歷史;com檔案,
exe檔案,
le格式的可執行檔案(linear executable/線性可執行檔案),windows 9x中的vxd驅動程式也使用le格式,因為這些驅動程式中也同時包括16位和32位**。
而在windows 9x,windows nt,windows 2000下,純32位的可執行檔案都使用微軟設計的一種新的檔案格式——pe格式(portable executable file format/可移植的執行體)。
pe檔案的基本結構如圖17.1所示,在pe檔案中,**、已初始化的資料、資源和重定位資訊等資料被按照屬性分類放到不同的節(section)中,而每個節的屬性和位置等資訊用乙個image_section_header結構來描述,所有的image_section_header結構組成乙個節表(section table),節表資料在pe檔案中被放在所有節資料的前面。我們知道,win32中可以對每個記憶體頁分別指定可執行、可讀寫等屬性,pe檔案將同樣屬性的資料分類放在一起是為了統一描述這些資料裝入記憶體後的頁面屬性。
由於資料是按照屬性在節中放置的,不同用途但是屬性相同的資料(如匯入表、匯出表以及.const段指定的唯讀資料)可能被放在同乙個節中,所以pe檔案中還用一系列的資料目錄結構image_data_directory來分別指明這些資料的位置,資料目錄表和其他描述檔案屬性的資料合在一起稱為pe檔案頭,pe檔案頭被放置在節和節表的前面。
上面介紹的這些部分是pe檔案中真正用於win32的部分,為了與dos系統的檔案格式相容,在這部分的前面又加上了乙個標準的dos mz格式的可執行部分,所有這些部分合起來組成了現在使用的pe檔案。下面分別介紹這些組成部分。
pe檔案中的dos部分由mz格式的檔案頭和可執行**部分組成,可執行**被稱為「dos塊」(dos stub)。一般來說,dos部分的執行**只是簡單地顯示乙個「this program cannot be run in dos mode.」就退出了,這段簡單的**是編譯器自動生成的。
mz格式的檔案頭由image_dos_header結構定義:
_image_dos_header = packed record
e_magic: word;
e_cblp: word;
e_cp: word;
e_crlc: word;
e_cparhdr: word;
e_minalloc: word;
e_maxalloc: word;
e_ss: word;
e_sp: word;
e_csum: word;
e_ip: word;
e_cs: word;
e_lfarlc: word;
e_ovno: word;
e_res: array [0..3] of word;
e_oemid: word;
e_oeminfo: word;
e_res2: array [0..9] of word;
_lfanew: longint;
end;
timagedosheader = _image_dos_header;
image_dos_header = _image_dos_header;
PE檔案的基本結構 4 匯入表
匯入表的位置和大小可以從pe檔案頭中image optional header32結構的資料目錄欄位中獲取,對應的專案是datadirectory欄位的第2個image data directory結構,從結構的virtualaddress欄位得到匯入表的rva值。匯入表由一系列的image imp...
PE檔案結構詳解(一)基本概念
pe portable execute 檔案是windows下可執行檔案的總稱,常見的有dll,exe,ocx,sys等,事實上,乙個檔案是否是pe檔案與其副檔名無關,pe檔案可以是任何副檔名。那windows是怎麼區分可執行檔案和非可執行檔案的呢?我們呼叫loadlibrary傳遞了乙個檔名,系統...
PE檔案結構詳解(一)基本概念
pe portable execute 檔案是windows下可執行檔案的總稱,常見的有dll,exe,ocx,sys等,事實上,乙個檔案是否是pe檔案與其副檔名無關,pe檔案可以是任何副檔名。那windows是怎麼區分可執行檔案和非可執行檔案的呢?我們呼叫loadlibrary傳遞了乙個檔名,系統...