PE结构

1 DOC头:64个字节
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; 用于定位PE文件(可执行文件地址)值是不确定的
中间有4个字节判断是不是PE
2 标准PE头: 20个字节
WORD Machine; //程序运行的CPU型号:0x0任何处理器、0x14C 386及后续处理器(用于约定程序在什么CPU上执行)
WORD NumberOfSections; //PE文件中节的数量 节 除了头还有几断数据
DWORD TimeDateStamp; //时间戳:文件创建时间和日期
DWORD PointerToSymbolTable;//Pointer to COFF //指向符合表(用于调试)
DWORD NumberOfSymbols; //COFF table size 符合表中符号数量(用于调试)
WORD SizeOfOptionalHeader;//可选PE头的大小, 32位PE文件默认E0h 64位PE文件默认为F0h 大小可以自定义
WORD Characteristics;//每个位有不同的含义 可执行文件值为10F 即0 1 2 3 8位置为1

3 可选PE头: 95+?
WORD Magic;//说明文件类型:10B 32位下的PE文件 20B 64位下的PE文件
BYTE MajorLinkerVersion;//连接器版本号
BYTE MinorLinkerVersion;
DWORD SizeOfCode; //所有含代码节的和 必须是FileAlignmentr的整数倍 编译器填的 没用
DWORD SizeOfInitializedData;//所有含已初始化数据的节的总大小 必须是FileAlignment的整数倍 编译器填的 没用
DWORD SizeOfUninitializedData;//所有含未初始化数据的节的大小 必须是FileAlignment的整数倍 编译器填的 没用
DWORD AddressOfEntryPoint;//程序执行入口RVA 真正的要加上ImageBase
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 DllCharacteristics;//DLL文件特性
DWORD SizeOfStackReserve;//初始化时保留的堆栈存储大小
DWORD SizeOfStackCommit;//初始化时实际提交的大小
DWORD SizeOfHeapReserve;//初始化时保留的堆大小
DWORD SizeOfHeapCommit;//初始化时实践提交的大小
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;//下面的数据目录结构的项目数量
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录

posted @ 2018-08-23 15:44  LifeOverflow  阅读(64)  评论(0)    收藏  举报