1.PE文件基本结构
(1)DOS头:
- DOS MZ头,IMAGE_DOS_HEADER结构体
- DOS块
(2)PE文件头
- PE文件头标志
- PE文件表头,IMAGE_OPTIONAL_HEADER结构体
- PE文件可选头,IMAGE_OPTIONAL_HEADER32/64结构体
(3)节表,IMAGE_SECTION_HEADER结构
(3)节数据
2.PE文件的两种存在形式
PE文件在磁盘文件中的存储格式和内存中的映像结构不同。
在磁盘文件中存储时,DOS头、PE文件头和节表的长度和在PE文件扩展头中由SizeOfHeaders成员决定,并按照FileAlignment成员规定的文件对齐长度对该段长度即节数据部分各节的长度进行补齐,每个部分长度均为文件对齐长度的整数倍,空白部分由编译器补充空数据或常量字符串。
在内存的映像中PE文件各节的长度由PE文件拓展头中的SectionAlignment成员规定的内存对齐属性所决定,内存对齐的长度和文件对齐长度一般不同
3. DOS头属性
DOS头中包含两部分:DOS MZ文件头(IMAGE_DOS_HEADER结构体),及DOS块。DOS MZ头为一个长度为64字节结构体,DOS块为一些数据。
IMAGE_DOS_HEADER结构体:16位机器所用头,在当前操作系统中不再使用。但该结构体的第一个成员MZ标志(对应PE文件前2个字节,十六进制ASCII码4D5A对应英文字母“MZ”)和最后一个成员PE头地址(对应PE文件第61至第64字节)仍然使用。前者用于标识PE文件,后者用于指定PE头的起始地址。更改这两处数据将造成PE文件无法正常运行。
DOS块为链接器添加的数据,删除或修改后不影响程序正常运行。
3.PE文件头
PE头是一个结构体(IMAGE_NT_HEADERS),包含三个部分:PE标识,标准PE头(IMAGE_FILE_HEADER)和扩展PE头(IMAGE_OPTIONAL_HEADER32/64)。后两者都是其中的子结构体。
3.1 PE标识
PE标识本身并无作用,但操作系统在执行PE文件时验证PE标识是否正确,若改变则程序无法运行。PE标识占2个字节,十六进制ASCII码5045对应英文字母"PE"。
3.2 标准PE头
标准PE头的内容为结构体IMAGE_FILE_HEADER,长度为20字节。具体属性如下。
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //可以运行在什么样的CPU上。任意: 0 ;Intel 3861以及后续: 14C ;x64: 8664
WORD NumberOfSections; //表示节的数量
DWORD TimeDateStamp; //编译器填写的时间戳,从1970年1月1日0时0分0秒至今经过的秒数,与文件属性(创建时间、修改时间)无关
DWORD PointerToSymbolTable; //调试相关
DWORD NumberOfSymbols; //调试相关
WORD SizeOfOptionalHeader; //扩展PE头的大小(32位PE文件: 0xE0 64位PE文件: 0xF0)
WORD Characteristics; //文件属性
} IMAGE_ FILE_ _HEADER, *PIMAGE_ FILE_ HEADER;
PS:计算机中数据存储系统:
二进制数字(binary digit):二进制计数系统中的一个数字,可以是0或1
位(bit):二进制数字的简称
字节(byte):8个二进制数据,即 1 byte=8 bit
字(word):一个或多个字节。当前windows系统中一个word的长度定义为2byte&#x