1 Understand 分析的图表
















2 PE结构解析的主要代码简要分析
首先看下PE结构体的定义;与PE文件结构一致;
/************************************************************************/
/* 定义PE文件的结构体
2011-08-30 Wizard~ZL*/
/************************************************************************/
#ifndef _PESTRUCT_H_
#define _PESTRUCT_H_
//PE文件最开始是一个 _IMAGE_DOS_HEADER 也就是MS_DOS
struct stMS_DOS
{
WORD e_magic;//magic number DOS头标记 00h
WORD e_cblp; // Bytes on last page of file 02h
WORD e_cp; //pages in file 04h
WORD e_crlc;// Relocations 06h
WORD e_cparhdr;// Size of header in paragraphs 08h
WORD e_minalloc;// Minimum extra paragraphs needed 0ah
WORD e_maxalloc;// Maximum extra paragraphs needed 0ch
WORD e_ss; // Initial (relative) SS value 0eh
WORD e_sp; // Initial SPvalue 10h
WORD e_csum;//check sum 12h
WORD e_ip; //Initial IP value 14h
WORD e_cs;// Initial (relative) CS value 16h
WORD e_lfarlc;// File address of relocation table 18h
WORD e_ovno; // Overlay number 1ah
WORD e_res[4];// Reserved words 1ch
WORD e_oemid;// OEM identifier (for e_oeminfo) 24h
WORD e_oeminfo;//OEM information; e_oemid specific 26h
WORD e_res2[10];// Reserved words 28h
long e_lfanew; //File address of new exe header 3ch **指向PE头部
};
//IMAGE_DOS_HEADER之后是一个 _IMAGE_NT_HEADERS
struct stPE_HEADER
{
DWORD Signature; //定义PE标志信息 00h 在有效的PE文件中值是 00 00 45 50
/*映像文件头 PE文件的基本信息
IMAGE_FILE_HEADER 开始*/
WORD Machine; // 04h
WORD NumberOfSections; // 06h //pe文件中区块的数量
DWORD TimeDateStamp;// 08h //文件日期时间戳,指这个pe文件生成的时间,它的值是从1969年12月31日16:00:00以来的秒数.
DWORD PointerToSymbolTable;// 0ch //Coff调试符号表的偏移地址.
DWORD NumberOfSymbols;// 10h //Coff符号表中符号的个数. 这个域和前个域在release版本的程序里是0.
WORD SizeOfOptionalHeader;//IMAGE_OPTON_HEADER大小 14h //IMAGE_OPTIONAL_HEADER32结构的大小(即多少字节).
WORD Characteristics;// 16h //这个域描述pe文件的一些属性信息,比如是否可执行,是否是一个动态连接库等
/*IMAGE_FILE_HEADER 结束*/
//IMAGE_OPTIONAL_HEADER32 option_header;
//这个IMAGE_OPTION_HEADER32结构放入PE_EXTHEADER中
};
//映像可选头
struct stPE_ExtHeader
{
/*_IMAGE_OPTIONAL_HEADER开始*/
// Standard fields
//Magic用来标记可执行文件是Rom镜像还是普通可执行程序 如果是一般的可执行程序则是010Bh 如果是PE32+ 即64位是 020Bh
WORD Magic;// 18h //幻数,32位pe文件总为010bh
BYTE MajorLinkerVersion;// 1ah //连接器主版本号
BYTE MinorLinkerVersion;// 1bh //连接器副版本号
DWORD SizeOfCode;// 1ch //代码段总大小
DWORD SizeOfInitializedData;// 20h //已初始化数据段总大小
DWORD SizeOfUninitializedData;// 24h //未初始化数据段总大小
DWORD AddressOfEntryPoint;// 28h //程序执行入口地址(RVA)
DWORD BaseOfCode;// 2ch //代码段起始地址(RVA)
DWORD BaseOfData;// 30h //数据段起始地址(RVA)
// NT additional fields.
DWORD ImageBase;// 34h //程序默认的装入起始地址
DWORD SectionAlignment;// 38h //内存中区块的对齐单位
DWORD FileAlignment;// 3ch //文件中区块的对齐单位
WORD MajorOperatingSystemVersion;// 40h //所需操作系统主版本号
WORD MinorOperatingSystemVersion;// 42h //所需操作系统副版本号
WORD MajorImageVersion;// 44h //自定义主版本号
WORD MinorImageVersion;// 46h //自定义副版本号
WORD MajorSubsystemVersion;//