说明
对pe文件头的解析
各种数据结构的定义都在 Winnt.h中
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头的开始位置
} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
PE头
typedef struct _IMAGE_NT_HEADERS64 {
DWORD Signature; //PE头
IMAGE_FILE_HEADER FileHeader; //文件头
IMAGE_OPTIONAL_HEADER64 OptionalHeader; //可选头
} IMAGE_NT_HEADERS64,*PIMAGE_NT_HEADERS64;
文件头
IMAGE_FILE_HEADER
typedef struct _IMAGE_FILE_HEADER {
WORD Machine; //可执行文件的目标CPU类型
WORD NumberOfSections; //PE文件的节区个数
DWORD TimeDateStamp; //从1970.1.1到创建该文件时的秒数
DWORD PointerToSymbolTable;
DWORD NumberOfSymbols;
WORD SizeOfOptionalHeader; //可选头的大小
WORD Characteristics; //文件类型(dll...)
} IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;
选项头
节表
节的个数由文件头的NumberOfHeader给出
地址转换
VA虚拟地址,也就是程序装载进内存的位置
RVA相对虚拟地址,地址 - 程序装载地址
FileOffset在文件中的地址
在磁盘上时,对齐 = 选项头.FileAlignment
在内存中时,对齐 = 选项头.SectionAlignment