PE文件解析-PE头解析-2-可选PE头
其中的空白是为了对齐时的填充值。默认硬盘的对齐是200H,在内存中的默认对齐是1000H
可选PE头
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;//代码开始地址
DWORD BaseOfData;//数据段开始地址
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
可选PE头重点字段
Magic
Magic表示是32位PE文件,还是64位PE文件,为10B就是32位PE文件,20B就是64位PE文件
SizeOfcode
存放总代码大小,但是是按照FileAlignment对齐后的大小
SectionAlignment
内存对齐大小
FileAlignment
表示文件(硬盘)中的对齐值。
SizeOfInitializedData
已初始化的数据大小,按照FileAlignment对齐
SizeOfUninitializedData
未初始化的数据大小,按照FileAlignment对齐
ImageBase
内存镜像地址,也就是程序加载进内存后的首地址
AddressOfEntryPoint --重中之重
程序入口地址--也叫OEP
也是一个偏移地址,是从程序被加载到内存后在内存中的首地址的偏移地址。
也就是说PE文件的起始地址,就等于程序加载进入内存后,把程序在内存中的首地址加上OEP的地址就是程序加载进去后跑的第一行代码的地址。
也就是 OEP+ImageBase 的地址,就是一个程序真正的入口地址
SizeOfImage
文件在内存中的大小,按SectionAlignment对齐后的大小
SizeOfHeaders
DOS头+NT头+标准PE头(文件头)+可选PE头+区段头,按照FileAlignment对齐后的大小
NumberOfRvaAndSizes:
数据目录表的个数16个
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
数据目录表,一共有16个内容
代码实现解析
https://www.cnblogs.com/Sna1lGo/p/14447218.html