一、什麼是PE文件。
PE(Portable Executable)格式,是微軟Win32環境可移植可執行文件(如exe、dll、vxd、sys和vdm等)的標準文件格式。
二、PE文件格式
2.1RVA、VA和OFFSET轉換和理解
OFFSET 就是010Editor以[0x00]開始的文件中的位置 OFFSET = RVA-所屬區段的基址(VirtualAddress) + 所屬區段的節基於文件的偏移量(PointerToRawData)
VA 就是內存映像中的位置,即地址 VA = RVA - ImageBase
RVA 就是內存映像中的位置與文件映射基址的差 RVA = VA+ImageBase
2.2PE文件的關鍵頭
DOS頭:
IMAGE_DOS_HEADER[0x40]:
[0x00]WORD e_magic; 所有MS-DOS兼容的可執行文件都將此值設爲0X5A4D(MZ).
[0x3c]DWORD e_lfanew;表示PE頭起始的位置.
PE頭:文件信息都在其中
struct _IMAGE_NT_HEADERS {
0x00 DWORD Signature; //PE頭標識
0x04 _IMAGE_FILE_HEADER FileHeader;
0x18 _IMAGE_OPTIONAL_HEADER OptionalHeader;
};
IMAGE_NT_HEADERS[0x78]:前面0x78個字段固定
區段表:保存各個區段的信息,如名稱、大小、VOffset、ROffset等
IMAGE_SECTION_HEADER:
區段:文件的信息全部在區段中
三、PE文件的數據資源信息——以user32.dll的輸出表信息爲例
(在文件中保存的位置均爲RVA所以在文件中查找位置需要轉換爲OFFSET)
輸出表信息
IMAGE_DIRECTORY_ENTRY_EXPORT
struct _IMAGE_DATA_DIRECTORY {
0x00 DWORD VirtualAddress; //0x00010548——>Offset:0x00000948
0x04 DWORD Size; //0x00005A7E
};
IMAGE_EXPORT_DIRECTORY[0x28]:0x00000948
0x0c DWORD Name;文件名稱0x00012860——>0x00002C60跳過去就能看見user32.dll
0x10 DWORD Base;函數基序號0x000005DC
0x14 DWORD NumberOfFunctions; 函數數量 3EB
0x18 DWORD NumberOfNames; 函數名數量 336
0x1c DWORD AddressOfFunctions; 函數地址 0x00010570——>0x00000970
跳過去0x000789CB——>0x00068DCB過去後是函數的OPCODE
0x20 DWORD AddressOfNames; 函數名地址 0x0001151C——>0x0000191C
跳過去0x0001286B——>0x00002C6B後面就是一個一個的函數名了
0x24 DWORD AddressOfNameOrdinals;序號地址 0x000121F4——>0x000025F4跳過去就是函數的序號