设为首页 加入收藏

TOP

图解VC++版PE文件解析器源码分析(一)
2016-07-14 15:02:55 】 浏览:3872
Tags:图解 文件 解析 源码 分析

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   s
		    

tMS_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;//
编程开发网
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC实现注册表监控 下一篇MVC和MVVM详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }