PE文件的两种状态
文件映射
PE文件在硬盘上和在内存上的状态是不一样的。
PE文件在磁盘上的状态称作FileBuffer,在内存中的状态称为ImageBuffer。
PE文件进入内存会经过”拉伸”的过程。这使得两种状态下的大小会不同。
拉伸
根据内存对齐的大小进行拉伸(内存对齐的大小由编译器决定)。
拉伸的目的:节省硬盘空间。
分节
PE文件在硬盘上和内存中都是分成一节一节的。
分节目的:1、节省硬盘空间;2、节省内存,以qq多开为例,某些只读的数据节不会被修改,可多次利用。
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