PE檔案格式

2021-10-09 01:12:10 字數 3275 閱讀 4641

pe檔案是windows作業系統下使用的可執行檔案格式,它是微軟在unix平台的coff基礎上製作而成的。

pe檔案是指32為的可執行檔案,也成為pe32,64位的可執行檔案稱為pe+或pe32+。

pe檔案種類

下圖是notepad.exe檔案的起始部分,也是pe檔案的頭部分(pe header),notepad.exe檔案執行需要的所有資訊都儲存在這個pe頭中,如何載入到記憶體、從何處開始執行、執行中需要的dll有哪些、需要多大的棧/堆記憶體,大量資訊以結構體形式儲存在pe頭中。

基本結構

rva + imagebase = va
建立pe檔案格式時,人們正廣泛使用dos檔案,所以微軟充分考慮pe檔案對dos檔案的相容性,其結果是在pe頭的最前面新增了乙個image_dos_header結構體,用來拓展已有的dos exe頭。

//(注:最左邊是檔案頭的偏移量。)

image_dos_header struct

image_dos_header ends

dos存根

nt頭

typedef

struct _image_nt_headers image_nt_headers32,

*pimage_nt_headers32;

nt頭:檔案頭

typedef

struct _image_file_header image_file_header,

*pimage_file_header;

nt頭:可選頭

typedef

struct _image_optional_header

image_optional_header32,

*pimage_optional_header32;

pe格式的設計者決定把具有相似屬性的資料統一儲存在乙個被稱為節區的地方,然後需要把各節區屬性記錄在節區頭中。

節區頭是由image_section_header結構體組成的陣列,每個結構體對應乙個節區。

typedef

struct _image_section_header

misc;

+ch dword virtualaddress;

// 節區的 rva 位址

+10h dword sizeofrawdata;

// 在檔案中對齊後的尺寸

+14h dword pointertorawdata;

// 在檔案中的偏移量

+18h dword pointertorelocations;

// 在obj檔案中使用,重定位的偏移

+1ch dword pointertolinenumbers;

// 行號表的偏移(供除錯使用地)

+1eh word numberofrelocations;

// 在obj檔案中使用,重定位項數目

+20h word numberoflinenumbers;

// 行號表中行號的數目

+24h dword characteristics;

// 節屬性如可讀,可寫,可執行等} image_section_header, *pimage_section_header;

}

pe檔案載入到記憶體時,每個節區都要能準確完成記憶體位址與檔案偏移間的對映,這種對映一般稱為rva to raw。

ex:rva = 5000, file offset = 5000 - 1000 + 400 = 4400

iat是一種**,用來記錄程式正在使用哪些庫中的哪些函式。

dll

載入dll的方式有兩種

image_import_descriptor

typedef

struct _image_import_descriptor

; dword timedatestamp;

//當可執行檔案不與被匯入的dll進行繫結時,此字段為0

dword forwarderchain;

//第乙個被轉向的api索引

dword name;

//指向被匯入的dll 名稱

dword firstthunk;

//指向輸入位址表(iat)rva,iat是乙個image_thunk_data結構的陣列

} image_import_descriptor;

typedef

struct _image_import_by_name image_import_by_name,

*pimage_import_by_name;

使用notepad.exe

eat是一種核心機制,它使不同的應用程式可以呼叫庫檔案中提供的函式,也就是說,只有通過ea才能準確求得從相應庫中匯出函式的起始位址。

pe檔案中僅有乙個用來說明庫eat的image_export_directory結構體。

可以在pe檔案的pe頭中查詢到image_export_directory結構體的位置,image_optional_header32.datadirectory[0].virtualaddress值即是image_export_directory結構體陣列的起始位置。

下圖顯示的是kernel32.dll檔案的image_optional_header32.datadirectory[0],第乙個4位元組為virtualaddress,第二個4位元組為size成員。

使用kernel32.dll練

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 ...