-
PE格式
鎖定
目錄
PE格式基本參數
Portable 是指對於不同的Windows版本和不同的CPU類型上PE文件的格式是一樣的,當然CPU不一樣了,CPU指令的二進制編碼是不一樣的。只是文件中各種東西的佈局是一樣的。
PE文件使用的是一個平面地址空間,所有代碼和數據都合併在一起,組成一個很大的結構。主要有:
DOS MZ Header |
PE Header |
Section Table |
Section 1 |
Section 2 |
... |
Section n |
Dos Mz head 和Dos stub和稱Dos文件頭,PE文件的第一個字節起始於MS-DOS頭部,被稱作IMAGE_DOS_HEADER.緊隨Dos stub的是PE文件頭(PE Header),PE Header是PE相關結構NT映像頭(IMAGE_NT_HEADERS)的簡稱,其中包含許多PE裝載器用到的重要字段。
1、入口點 Entry Point
2、文件偏移地址 File Offset
3、虛擬地址 Virtual Address 簡稱:VA
4、基地址 ImageBase
5、相對虛擬地址 Relative Virual Address 簡稱:RVA
公式: RVA (相對虛擬地址) =VA (虛擬地址) - ImageBase (基地址)
文件偏移地址和虛擬地址轉換
在X86系統中,每個內存頁的大小是4KB,即0X1000個字節。
文件偏移地址 File Offset = RVA (相對虛擬地址) - ΔK
文件偏移地址 File Offset = VA (虛擬地址) - ImageBase (基地址) - ΔK
pe具體結構圖:
PE格式pe的具體結構
如下所示(經過簡化的,具體的可以查看winnt.h,不同字長的結構,其實大體一樣的)。
幾個宏定義:
typedef unsigned long DWORD;
typedef unsigned short WORD;
typedef unsigned char BYTE;
PE格式IMAGE_DOS_HEADER
typedef struct _IMAGE_DOS_HEADER
{
WORD e_magic; //魔術數字,所有MS-DOS兼容的可執行文件都將此值設為0X4D5A(MZ)
WORD e_cblp; //文件最後頁的字節數
WORD e_cp; //文件頁數
WORD e_crlc; //重定義元素個數
WORD e_cparhdr; //頭部尺寸,以段落為單位
WORD e_minalloc; //所需的最小附加段
WORD e_maxalloc; //所需的最大附加段
WORD e_ss; //初始的SS值(相對偏移量)
WORD e_sp; //初始的SP值
WORD e_csum; //校驗和
WORD e_ip; //初始的IP值
WORD e_cs; //初始的CS值(相對偏移量)
WORD e_lfarlc; //重分配表文件地址
WORD e_ovno; //覆蓋號
WORD e_res[4]; //保留字
WORD e_oemid; //OEM標識符(相對e_oeminfo)
WORD e_oeminfo; //OEM信息
WORD e_res2[10]; //保留字
DWORD e_lfanew; //新exe頭部的文件地址
}IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
PE格式IMAGE_NT_HEADERS
#define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
typedef struct IMAGE_NT_HEADERS
{
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}IMAGE_NT_HEADERS,*PIMAGE_NT_HEADERS;
typedef struct IMAGE_FILE_HEADER
{
WORD Machine;
WORD NumberOfSections;//節的數量
DWORD TimeDateStamp;
DWORD PointerToSymbols;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader;
WORD Characteristics;
}IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;
typedef struct IMAGE_OPTIONAL_HEADER32
{
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUnInitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
DWORD ImgaeBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingsystemversion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsybtemVersion;
WORD MinorSubsybtemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeoOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlages;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
}IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
PE格式IMAGE_SECTION_HEADER
PE文件頭後是節表,在winnt.h下如下定義 typedef struct _IMAGE_SECTION_HEADER { //IMAGE_SIZEOF_SHORT_NAME=8 BYTE Name[IMAGE_SIZEOF_SHORT_NAME];//節表名稱,如“.text” union { DWORD PhysicalAddress;//物理地址 DWORD VirtualSize;//真實長度,這兩個值是一個聯合結構,可以使用其中的任何一個,//一般是節的數據大小 } Misc; DWORD VirtualAddress;//RVA DWORD SizeOfRawData;//物理長度 DWORD PointerToRawData;//節基於文件的偏移量 DWORD PointerToRelocations;//重定位的偏移 DWORD PointerToLinenumbers;//行號表的偏移 WORD NumberOfRelocations;//重定位項數目 WORD NumberOfLinenumbers;//行號表的數目 DWORD Characteristics;//節屬性 如可讀,可寫,可執行等 } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; |
typedef struct IMAGE_THUNK_DATA
{
union
{
DWORD ForwarderString;
DWORD Function;
DWORD Ordinal;
DWORD AddressOfData;
}u1;
}IMAGE_THUNK_DATA,*PIMAGE_THUNK_DATA;
typedef struct IMAGE_IMPORT_BY_NAME
{
WORD Hint;
BYTE Name;
}IMAGE_IMPORT_BY_NAME;
- 詞條統計
-
- 瀏覽次數:次
- 編輯次數:24次歷史版本
- 最近更新: yl201317