设为首页 加入收藏

TOP

图解VC++版PE文件解析器源码分析(一)
2016-07-14 15:02:55 】 浏览:4745
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   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;//		
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC实现注册表监控 下一篇MVC和MVVM详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目