·
一、PE头
typedef struct _IMAGE_NT_HEADERS {
DWORD Signature; //PE标识(4字节)
IMAGE_FILE_HEADER FileHeader; //标准PE头(20字节)
IMAGE_OPTIONAL_HEADER32 OptionalHeader; //扩展PE头(默认224字节)
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;
PE标识:
PE标识不能破坏,操作系统在启动一个程序的时候会检测这个标识。
二、标准PE头
ypedef struct _IMAGE_FILE_HEADER {
WORD Machine; //可以运行在什么样的CPU上 任意:0 Intel 386以及后续:14C x64:8664
WORD NumberOfSections; //表示节的数量
DWORD TimeDateStamp; //编译器填写的时间戳 与文件属性里面(创建时间、修改时间)无关
DWORD PointerToSymbolTable;//调试相关
DWORD NumberOfSymbols; //调试相关
WORD SizeOfOptionalHeader;//可选PE头的大小(32位PE文件:0xE0 64位PE文件:0xF0)
WORD Characteristics; //文件属性
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
WORD Characteristics含义表
三、扩展PE头
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic; //PE32:10B PE32+:20B
BYTE MajorLinkerVersion; //链接器版本号
BYTE MinorLinkerVersion; //链接器版本号
DWORD SizeOfCode; //所有代码节的总和 文件对齐后的大小 编译器填的 没用
DWORD SizeOfInitializedData; //包含所有已经初始化数据的节的总大小 文件对齐后的大小 编译器填的 没用
DWORD SizeOfUninitializedData; //包含未初始化数据的节的总大小 文件对齐后的大小 编译器填的 没用
DWORD AddressOfEntryPoint; //程序入口
DWORD BaseOfCode; //代码开始的基址,编译器填的 没用
DWORD BaseOfData; //数据开始的基址,编译器填的 没用
DWORD ImageBase; //内存镜像基址
DWORD SectionAlignment; //内存对齐
DWORD FileAlignment; //文件对齐
WORD MajorOperatingSystemVersion; //标识操作系统版本号 主版本号
WORD MinorOperatingSystemVersion; //标识操作系统版本号 次版本号
WORD MajorImageVersion; //PE文件自身的版本号
WORD MinorImageVersion; //PE文件自身的版本号
WORD MajorSubsystemVersion; //运行所需子系统版本号
WORD MinorSubsystemVersion; //运行所需子系统版本号
DWORD Win32VersionValue; //子系统版本的值,必须为0
DWORD SizeOfImage; //内存中整个PE文件的映射的尺寸,可比实际的值大,必须是SectionAlignment的整数倍
DWORD SizeOfHeaders; //所有头+节表按照文件对齐后的大小,否则加载会出错
DWORD CheckSum; //校验和,一些系统文件有要求.用来判断文件是否被修改.
WORD Subsystem; //子系统 驱动程序(1) 图形界面(2) 控制台、DLL(3)
WORD DllCharacteristics; //文件特性 不是针对DLL文件的
DWORD SizeOfStackReserve; //初始化时保留的栈大小
DWORD SizeOfStackCommit; //初始化时实际提交的大小
DWORD SizeOfHeapReserve; //初始化时保留的堆大小
DWORD SizeOfHeapCommit; //初始化时实践提交的大小
DWORD LoaderFlags; //调试相关
DWORD NumberOfRvaAndSizes; //目录项数目
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;