PE檔案格式

2021-09-20 10:05:44 字數 2577 閱讀 5591

pe檔案是windows下使用的可執行檔案格式。pe檔案是指32位的可執行檔案,也稱pe32,64位稱pe+或pe32+,是pe32的一種擴充套件形式(不是pe64)

種類主副檔名

可執行系列

exe、scr

庫系列dll、ocx、cpl、drv

驅動程式系列

sys、vxd

物件檔案系列

obj obj(物件)檔案之外的所有檔案都是可執行的,dll、sys檔案雖然不能在shell裡面直接執行,但可以通過其他方法(偵錯程式、服務等)執行。

pe頭中儲存程式執行時需要的大量的資訊,如何載入記憶體,從何處開始執行,執行中需要哪些dll,多大的堆疊記憶體等,都會以結構體的形式儲存在pe頭中。

pe檔案結構從上到下依次是:dos頭,dos存根、nt頭、節區頭(.text)、節區頭(.data)、節區頭(.rsrc)、節區(.text)、節區(.data)、節區(.rarc)

從dos頭(dos header)到節區頭(section header)是pe頭部分,其下的節區合稱位pe體。檔案中使用偏移(offset),記憶體中使用va(virtual address,虛擬位址)來表示檔案位置。檔案內容一般分為**節(.text)、資料節(.data)、資源節(.rsrc),分別儲存。各節區頭定義了各節區在檔案或記憶體中的大小、位置、屬性等。

pe頭與各節區的尾部有乙個區域,稱為null填充(null padding)。檔案/記憶體中節區的起始位置應該在、各檔案/記憶體最小單位的倍數字置上,空白區域將用null填充,如圖:

va(程序虛擬記憶體的絕對位址)、rva(relative virtual address,相對虛擬位址)指從某個基準位置(imagebase)開始的相對位址,va和rva滿足換算關係:

va=rva+imagebase

pe頭內部大多以rva形式存在。使用相對虛擬位址(rva)可解決了重定位帶來的無法訪問的問題,,只要相對於基準位置的相對位址沒變就可以訪問,重定位(pe檔案(主要dll)載入到程序虛擬記憶體的特定位置,該位置可能已經載入了其他pe檔案(dll),這時必須通過重定位將其載入到其他空白位置),如果用的va,就訪問不到了。

dos頭考慮了pe檔案對dos檔案的相容性,在pe頭前面加了乙個image_dos_header結構體來擴充套件已有的dos exe頭。結構體大小為40位元組,有兩個重要成員:e_magic和e_lfanew

e_magic:dos簽名(4d5a=>ascii「mz」)

e_lfanew:指示nt頭的偏移(不同檔案可變)

乙個叫mark zbikowski的開發人員在微軟設計了dos可執行檔案,mz取自其名字的首字母。自豪!

pe規範,檔案開始兩個位元組為4d5a,在(30,c)的地方是e_lfanew的值。 

dos存根在dos頭的下方,大小不固定,即使沒有dos存根,檔案也能正常執行,

nt頭也是乙個結構體:image_nt_headers,由3個成員組成,第乙個簽名(signature)結構體,值為50450000(pe「00」),其餘兩個為檔案頭(file header)和可選頭(optional header)

前面說了節區頭中定義了各節區的屬性,pe檔案中的code(**)、data(資料)、resource(資源)等按不同屬性分類儲存在不同的節區,那為什麼要按照屬性分不同的區呢?

把pe檔案建立成多個節區是為了保證程式的安全性,若把data和code放在乙個節區中相互糾纏,會引發很多問題,比如在向字串data寫資料時,由於某個原因移溢位了,導致覆蓋了後面的code(指令),程式就會崩潰。

類別訪問許可權

code

執行、讀取許可權

data

非執行、讀寫許可權

resource

非執行、讀取許可權

pe檔案從磁碟到記憶體對映,pe檔案載入到記憶體時,每個節區都要能準確完成記憶體地值與檔案偏移間的對映,方法:

(1)查詢rva所在節區

(2)使用簡單公式計算檔案偏移(raw)

根據image_section_header結構體,換算公式如下:

raw-pointertorawdata=rva-virtualaddress

raw=rva-virtualaddress+pointertorawdata(檔案偏移位址)

eg:rva=5000時,file offset=?

an:首先查詢rva值所在的節區。

->rva5000位於第一節區(.text)(假設imagebase為01000000)

raw=5000(rva)-1000(virtualaddress)+400(pointertorawdata)=4400

iat(匯入位址表):import address table 由於匯入函式就是被程式呼叫但其執行**又不在程式中的函式,這些函式的**位於乙個或者多個dll 中.當pe 檔案被裝入記憶體的時候,windows 裝載器才將dll 裝入,並將呼叫匯入函式的指令和函式實際所處的位址聯絡起來(動態連線),這操作就需要匯入表完成.其中匯入位址表就指示函式 實際位址

iat和匯入表關係: 賞

你的支援是我最大的動力!

PE檔案格式

pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable executable 可移植的執行體 意味著此檔案格式是跨win3...

PE檔案格式

pe檔案格式分析及修改 圖 1 2009 01 09 14 08 pe 的意思是 portable executable 可移植的執行體 它是 win32環境自身所帶的執行檔案格式。它的一些特性繼承自unix的coff common object file format 檔案格式。portable ...

PE檔案格式

pe檔案格式應用於所有32位windows系統 windows 9x,windows nt,windows 2000及windows xp vista已經對pe格式進行了公升級,也出現了pe64 而在msdn 98中有pe的大量詳細資料 按目錄 msdn library visual studio ...