PE——PE基础结构分析

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];//数据目录表
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值