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