PE头解析

  1. PE文件的两种状态
    1. 文件映射
    2. 拉伸
    3. 分节
  2. DOC头:
  3. NT头(包含标准PE头和可选PE头)
  4. 标准PE头
  5. 可选PE头

PE文件的两种状态

文件映射

PE文件在硬盘上和在内存上的状态是不一样的。

PE文件在磁盘上的状态称作FileBuffer,在内存中的状态称为ImageBuffer。

PE文件进入内存会经过”拉伸”的过程。这使得两种状态下的大小会不同。

拉伸

根据内存对齐的大小进行拉伸(内存对齐的大小由编译器决定)。

拉伸的目的:节省硬盘空间。

分节

PE文件在硬盘上和内存中都是分成一节一节的。

分节目的:1、节省硬盘空间;2、节省内存,以qq多开为例,某些只读的数据节不会被修改,可多次利用。

image-20230828145557822

DOC头:

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];
DWORD 	e_lfanew;*//MZ标记,用来标记是否为可执行文件

NT头(包含标准PE头和可选PE头)

DWORD	Signature;// PE签名 相对该结构的偏移0x00
_IMAGE_FILE_HEADER	FileHeader;//标准PE头
_IMAGE_OPTIONAL_HEADER	OptionalHeader;//可选PE头

标准PE头

WORD	Machine;*//程序运行的CPU型号
WORD	NumberOfSections;*//文件的节的总数
DWORD 	TimeDatestamp;*//时间戳:文件的创建时间,编译器填写的
DWORD 	PointerToSymbolTable;
DWORD 	NumberOfSymbols;
WORD	SizeOFOptionalHeader;*//可选PE头的大小
WORD	characteristics;*//PE文件属性

可选PE头

WORD	Magic;*//说明文件类型,32位--10B 64位--20B
BYTE	MajorLinkerUersion;
BYTE	MinorLinkerUersion;
DWORD	SizeOfCode;*//所有代码节的和
DWORD	SizeOfInitializedData;*//已初始化数据大小的和
DWORD	SizeOfUninitializedData;*//未初始化数据大小的和
DWORD	addressOfEntryPoint;*程序入口
DWORD	BaseOfCode;*//代码开始的基址
DWORD	BaseOfData;*//数据开始的基址
DWORD	ImageBase;*//内存镜像基址:内存中所有数据的起点
DWORD	SectionAlignment;*//内存对齐
DWORD	FileAlignment;*--文件对齐
WORD	MajorOperatingsystemVersion;
WORD	MinorOperatingsystemVersion;
WORD	MajorImageVersion;
WORD	MinorImageVersion;
WORD	MajorSubsystemVersion;
WORD	MinorSubsystemVersion;
DWORD	Win32VersionValue;
DWORD	SizeofImage;*//内存中整个PE文件的映射的尺寸
DWORD	SizeofHeaders;*//所有头+节表+按照文件对齐后的大小
DWORD	CheckSum;*//校验和
WORD	Subsystem;
WORD	D1Characteristics;
DWORD	SizeOfStackReserve;*//初始化时保留堆栈大小
DWORD	SizeOfStackCommit;*//初始化实际提交的大小
DWORD	SizeOfHeapReserve;*//初始化时保留的堆大小
DWORD	SizeOfHeapCommit;*//初始化实践提交的大小
DWORD	LoaderFlags;
DWORD 	NumberOfRvaAndSizes;//目录项数目	

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1666739907@qq.com
github