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