1. 程式人生 > >PE檔案格式詳解(0)

PE檔案格式詳解(0)

0.介紹  PE是Windows作業系統性愛使用的可執行檔案格式。它是微軟在UNIX平臺的COFF(Common Object File Format,通用物件格式)基礎上而成的(在Windows開發環境中,PE格式也稱為PE/COFF格式。)。最初(正如Portable這個單詞所代表的那樣)設計用來提高程式在不同作業系統上的移植性,但實際上這種檔案格式僅使用在Windows系列的作業系統。     PE檔案是指32位的可執行檔案,也稱為PE32。64位的可執行檔案稱為PE+或PE32+,是PE(PE32)的一種擴充套件形式(注意不是PE64) 事實上,一個檔案是否是PE檔案與其副檔名無關,即表明PE檔案可以是任何副檔名。
1.PE檔案格式 PE檔案格式種類:    可執行系列:EXE/SCR    驅動程式系列:SYS/VXD    庫系列:DLL/OCX/CPL/DRV    物件檔案系列:OBJ 注:嚴格來講,OBJ(物件)檔案之外的所有檔案都是可執行的。DLL/SYS檔案等雖然不能直接在Shell(Explorer.exe)中執行,但可以使用其他方法(偵錯程式、服務等)執行。 2.基本結構 從DOS頭(DOS Header)到節區頭(Section Header)是PE頭部分,其下的節區合成PE體。檔案中使用偏移(offset),記憶體中使用VA(Vitual Address,虛擬地址)來表示位置。檔案載入到記憶體時,情況就會發生變化(節區的大小、位置等)。檔案的內容一般可分為程式碼(.text)、資料(.data)、資源(.rsrc)節,分別儲存。
注:有不同種開發工具(VB/VC++/...)與編譯選項,節區的名稱、大小、個數、儲存的內容都是不同的。它們根據不同的用途分類儲存到不同的節中。 各節區頭定義了各節區在檔案或記憶體中的大小、位置、屬性等 PE頭與各節區的尾部存在一個區域,稱為NULL填充(NULL padding)。(PE檔案中檔案/記憶體中節區的起始位置應該在各檔案/記憶體最小單位的倍數位置之上,空白區域將用NULL填充。)
3.VA&RVA VA指的是程序虛擬記憶體的絕對地址,RVA(Relative Virtual Address,相對虛擬地址)指從某個基準位置(ImageBase)開始的相對地址。VA與RVA滿足下面的換算關係。
RVA+ImageBase=VA PE頭內部大多都以RVA形式存在,原因在於,PE檔案(主要是DLL)載入到程序虛擬記憶體的特定位置時,該位置可能已經載入了其他的PE檔案(DLL)。此時必須通過重定位將其載入到其他空白的位置,若PE頭資訊使用的是VA,則無法正常訪問。因此使用了RVA來定位資訊,即使發生了成定位,只要相對於基準位置的相對地址沒有變化,就能正常訪問到指定資訊,就不會出現任何問題。