PE文件是Windows操作系统下使用的可执行文件格式。它是微软在UNIX平台的COFF(Common Object File Format,通用对象文件格式)基础上制作而成的。最初(正如Portable这个单词所代表的那样)设计用来提高程序在不同操作系统上的移植性,但实际上这种文件格式仅用在Windows系列的操作系统下。
PE文件是指32位的可执行文件,也称为PE32。64位的可执行文件称为PE+或PE32+,是PE文件的一种扩展形式(请注意不是PE64)。
下图是PE文件的整体结构:
大致包含:DOS头、PE头、节区头、各个节区等
windows在将PE文件加载到内存时,会对各个节区进行重新定位。文件默认对齐200h,在内存中的默认对齐是1000h。多出来的空间用0来填充。下图就是PE加载的内存分布。
下图展示了较为详细的PE结构体定义:
下面介绍几个关键结构:
1.IMAGE_DOS_HEADER:DOS头结构
0x00 e_magic; // DOS signature:4D5A("MZ")
0x3C e_lfanew; // offset to NT header 这个变量是NT头结构的偏移值
2.IMAGE_NT_HEADERS:NT头结构
typedef struct _IMAGE_NT_HEADERS{
DWORD Signature; //PE Signature:50450000("PE"00)
IMAGE_FILE_HAEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
}IMAGE_NT_HEADER32, *PIMAGE_NT_HEADERS32;
3.IMAGE_FILE_HAEADER:文件头
0x00 Machine; //每个CPU都拥有唯一的Machine码,其中I386/IA64常用
0x02 NumberOfSections; //节区的个数
0x10 SizeOfOptionalHeader; //IMAGE_OPTIONAL_HEADER32 结构的长度
0x12 Characteristics; //文件的属性,0x0002可执行、0x2000DLL文件
4.IMAGE_OPTIONAL_HEADER32:可选头
0x00 Magic: //32位10B、64位20B
0x10 AddressOfEntryPoint; //EP,程序入口点(最先执行的地方)
0x1C ImageBase: //基址
0x44 Subsytem; //用来区分驱动和普通文件的。如:1:驱动sys。2:notepad.exe。3:cmd.exe控制台
0x60 DataDirectory; //数据目录,其中包含了导入、导出和资源等数据表地址。