一、什么是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跳过去就是函数的序号