PE结构
- 总体结构
IMAGE_NT_HEADERS包含了PE字样的签名
,标准PE头
IMAGE_FILE_HEADER和可选PE头
IMAGE_OPTIONAL_HEADER。
//DOS头
typedef struct _IMAGE_DOS_HEADER {
WORD e_magic; //“MZ标记”,用于判断是否位可执行文件
WORD e_cblp;
WORD e_cp;
WORD e_crlc;
WORD e_cparhdr;
WORD e_minalloc;
WORD e_maxalloc;
WORD e_ss;
WORD e_sp;
WORD e_csum;
WORD e_ip;
WORD e_cs;
WORD e_lfarlc;
WORD e_ovno;
WORD e_res[4];
WORD e_oemid;
WORD e_oeminfo;
WORD e_res2[10];
LONG e_lfanew; //PE头相对于文件的偏移,用于定位PE文件
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
//标准PE头IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER
{
WORD Machine; //程序运行的的CPU型号:0x0任何处理器/0x14c 386及后续处理器
WORD NumberOfSections; //文件中存在的节的总数
DWORD TimeDateStamp; //时间戳:文件的创建时间,编译器填写的
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; //可选PE头的大小,32位PE文件默认是E0,32位PE文件默认是F0,大小可自定义
WORD Characteristics; //按位表示的特征,每个位有不通含义,可选文件为10F
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
//可选PE头IMAGE_OPTIONAL_HEADER
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic; //说明文件类型:10BH->32位下的PE; 20B->64位下的PE
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode; //所有代码节的和,必须是FileAligment的整数倍,编译器填的,没用
DWORD SizeOfInitializedData; //已初始化数据块的大小,必须是FileAligment的整数倍,编译器填的,没用
DWORD SizeOfUninitializedData; //未初始化数据块的大小,必须是FileAligment的整数倍,编译器填的,没用
DWORD AddressOfEntryPoint; //程序开始执行的入口地址,这是一个RVA(相对虚拟地址),相对于ImageBase
DWORD BaseOfCode; //代码段的起始RVA 一般来说 是 1000h
DWORD BaseOfData; //数据段的起始RVA
DWORD ImageBase; //可执行文件默认装入的基地址(也可以理解成模块和模块间的对齐值)
DWORD SectionAlignment; //内存中块的对齐值(默认的块对齐值为1000H,4KB个字节)
DWORD FileAlignment;//文件中块的对齐值(默认值为200H字节,为了保证块总是从磁盘的扇区开始的)
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;//映像装入内存后的总尺寸(拉长以后),但是必须是SectionAlignment的整数倍
DWORD SizeOfHeaders;//所有头加上节表 对齐后的大小,严格按照FileAlignment对齐
DWORD CheckSum;//CRC检验和,一些非常重要的文件会做检查,判断文件是否被修改
WORD Subsystem;//程序使用的用户接口子系统
WORD DllCharacteristics;//DLLmain函数何时被调用,默认为0
DWORD SizeOfStackReserve;//初始化时堆栈大小
DWORD SizeOfStackCommit;//初始化时实际提交的堆栈大小
DWORD SizeOfHeapReserve;//初始化时保留的堆大小
DWORD SizeOfHeapCommit;//初始化时实际提交的对大小
DWORD LoaderFlags;//与调试有关,默认为0
DWORD NumberOfRvaAndSizes;//数据目录结构的数目
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
}