typedef struct _IMAGE_OPTIONAL_HEADER{
/
/
占用
224
个字节
WORD Magic;
/
/
0018h
取值为
10B
或
20B
BYTE MajorLinkerVersion;
/
/
001Ah
链接器版本号(对执行没有任何影响)
BYTE MinorLinkerVersion;
/
/
001Bh
DWORD SizeOfCode;
/
/
001Ch
所有含代码的节的大小(按照文件对齐,判断某节是否含代码,使用节属性IMAGE_SCN_CNT_CODE属性判断,而不是通过IMAGE_SCN_CNT_EXECUTE)
DWORD SizeOfInitializedData;
/
/
0020h
所有含初始化数据的节的大小
DWORD SizeOfUninitializedData;
/
/
0024h
所有含未初始化数据的节的大小(被定义为未初始化,不占用文件空间,加载入内存后为其分配空间)
DWORD AddressOfEntryPoint;
/
/
0028h
程序执行入口RVA(距离PE加载后地址的距离,对于病毒和加密程序,都会修改该值,从而获得程序的控制权,对于DLL,如果没有入口函数,那么是
0
,对于驱动,该值是初始化的函数的地址)
DWORD BaseOfCode;
/
/
002Ch
代码的节的起始RVA(一般情况跟在PE头部的后面)
DWORD BaseOfData;
/
/
0030h
数据的节的起始RVA
/
/
以上是standard,以下是additional
DWORD ImageBase;
/
/
0034h
程序的建议装载地址
DWORD SectionAlignment;
/
/
0038h
内存中的节的对齐值
32
位
0x1000
64
位
0x2000
DWORD FileAlignment;
/
/
003Ch
文件中的节的对齐值 现在都是
0x1000
早期都是
0x200
WORD MajorOperatingSystemVersion;
/
/
0040h
操作系统版本号
WORD MinorOperatingSystemVersion;
/
/
0042h
WORD MajorImageVersion;
/
/
0044h
该PE的版本号
WORD MinorImageVersion;
/
/
0046h
WORD MajorSubsystemVersion;
/
/
0048h
所需子系统的版本号
WORD MinorSubsystemVersion;
/
/
004Ah
DWORD Win32VersionValue;
/
/
004Ch
未使用,必须为
0
DWORD SizeOfImage;
/
/
0050h
内存中的整个PE文件映像大小(按照内存对齐)
DWORD SizeOfHeaders;
/
/
0054h
所有头
+
节表的大小
DWORD CheckSum;
/
/
0058h
校验和(一般EXE文件为
0
,而DLL和SYS文件则必须是正确的值)
WORD Subsystem;
/
/
005Ch
文件子系统
WORD DllCharacteristics;
/
/
005Eh
DLL文件特性
DWORD SizeOfStackReserve;
/
/
0060h
初始化时保留的栈的大小(默认
1M
)
DWORD SizeOfStackCommit;
/
/
0064h
初始化时实际提交的栈的大小(默认
4K
)
DWORD SizeOfHeapReserve;
/
/
0068h
初始化时保留的堆的大小(默认
1M
)
DWORD SizeOfHeapCommit;
/
/
006Ch
初始化时实际提交的堆大小(默认
4K
)
DWORD LoaderFlags;
/
/
0070h
加载标志一般为
0
DWORD NumberOfRvaAndSizes;
/
/
0074h
数据目录的数量
IMAGE_DATA_DIRECTORY DataDirectory{IMAGE_NUMBEROF_DIRECTORY_ENTRIES};
/
/
0078h
数据目录数组 导入表的定位由这个值给出
}