pe文件,即portable executable文件,是windows操作系統(tǒng)上常見(jiàn)的可執(zhí)行文件格式,包括exe、dll、ocx、sys和com等。pe文件可以在任何運(yùn)行Windows的cpu體系結(jié)構(gòu)上執(zhí)行,因?yàn)樗褂闷矫娴刂房臻g,將所有代碼和數(shù)據(jù)合并成一個(gè)大型結(jié)構(gòu)。文件內(nèi)容被劃分為不同的區(qū)塊,每個(gè)區(qū)塊在內(nèi)存中具有不同的權(quán)限,如只讀、只寫或可執(zhí)行。常見(jiàn)的區(qū)塊包括:
- .text:編譯或匯編后生成的指令代碼區(qū)塊。
- .rdata:運(yùn)行時(shí)的只讀數(shù)據(jù)區(qū)塊,包含const常量。
- .data:初始化的數(shù)據(jù)區(qū)塊,包含全局變量。
- .idata:包含其他DLL的函數(shù)和數(shù)據(jù)信息,即輸入表。
- .rsrc:包含所有資源,如圖標(biāo)、菜單和位圖等。
每個(gè)區(qū)塊在內(nèi)存中按頁(yè)邊界對(duì)齊,區(qū)塊沒(méi)有大小限制,是一個(gè)連續(xù)的結(jié)構(gòu),每個(gè)區(qū)塊都有對(duì)應(yīng)的屬性。
PE文件的優(yōu)勢(shì)在于其在磁盤上的數(shù)據(jù)結(jié)構(gòu)與在內(nèi)存中的結(jié)構(gòu)一致。以下是一些相關(guān)名詞:
- 入口點(diǎn)(EntryPoint):程序執(zhí)行的第一條指令所在的內(nèi)存地址。
- 文件偏移地址(FileOffset):PE文件存儲(chǔ)在磁盤上的時(shí)候,各個(gè)數(shù)據(jù)的地址相對(duì)于文件頭的距離。
- 虛擬地址(VirtualAddress VA):應(yīng)用程序訪問(wèn)的邏輯地址,即其虛擬地址。
- 基地址(ImageBase):文件被映射到內(nèi)存時(shí)的初始地址。
PE文件的基本結(jié)構(gòu)如下圖所示:
在討論P(yáng)E文件時(shí),常涉及以下幾個(gè)名詞:
- 基地址(ImageBase):PE文件被加載到內(nèi)存中的首地址,是這個(gè)模塊的句柄,可以使用函數(shù)GetModuleHandle來(lái)獲取。
- 文件的偏移地址:PE文件中各個(gè)部分相對(duì)于文件頭的偏移。
- 相對(duì)虛擬地址(RVA):PE結(jié)構(gòu)被映射到內(nèi)存中后,某個(gè)位置所在內(nèi)存相對(duì)于基地址的偏移。
一般可執(zhí)行文件被PE加載器加載到內(nèi)存中后,文件的基本格式不會(huì)發(fā)生改變,只是會(huì)將各個(gè)塊按照頁(yè)來(lái)進(jìn)行對(duì)齊。PE文件在磁盤與在內(nèi)存中的對(duì)應(yīng)關(guān)系大致如下圖所示: