struct IMAGE_OPTIONAL_HEADER
typedef struct _IMAGE_OPTIONAL_HEADER
{
WORD Magic;
/
/
※ 说明文件类型:
10B
32
位、
20B
64
位
UCHAR MajorLinkerVersion;
/
/
链接程序的主版本号
UCHAR MinorLinkerVersion;
/
/
链接程序的副版本号
ULONG SizeOfCode;
/
/
所有代码段的总和大小,注意:必须是FileAlignment的整数倍
ULONG SizeOfInitializedData;
/
/
已经初始化数据的大小,注意:必须是FileAlignment的整数倍
ULONG SizeOfUninitializedData;
/
/
未经初始化数据的大小,注意:必须是FileAlignment的整数倍
ULONG AddressOfEntryPoint;
/
/
※程序入口地址OEP,这是一个RVA(Relative Virtual Address),通常会落在.textsection,此字段对于DLLs
/
EXEs都适用。
ULONG BaseOfCode;
/
/
代码段起始地址(代码基址),(代码的开始和程序无必然联系)
ULONG BaseOfData;
/
/
数据段起始地址(数据基址)
ULONG ImageBase;
/
/
※内存镜像基址(默认装入起始地址),默认为
4000H
ULONG SectionAlignment;
/
/
※内存中的区块的对齐大小:一旦映像到内存中,每一个section保证从一个「此值之倍数」的虚拟地址开始
ULONG FileAlignment;
/
/
※文件中的区块的对齐大小:最初是
200H
,现在是
1000H
WORD MajorOperatingSystemVersion;
/
/
所需操作系统主版本号
WORD MinorOperatingSystemVersion;
/
/
所需操作系统副版本号
WORD MajorImageVersion;
/
/
自定义主版本号,使用连接器的参数设置,eg:LINK
/
VERSION:
2.0
myobj.obj
WORD MinorImageVersion;
/
/
自定义副版本号,使用连接器的参数设置
WORD MajorSubsystemVersion;
/
/
所需子系统主版本号,典型数值
4.0
(Windows
4.0
/
即Windows
95
)
WORD MinorSubsystemVersion;
/
/
所需子系统副版本号
ULONG Win32VersionValue;
/
/
※莫须有字段,不被病毒利用的话一般为
0
ULONG SizeOfImage;
/
/
※PE文件在内存中映像总大小,sizeof(ImageBuffer),SectionAlignment的倍数
ULONG SizeOfHeaders;
/
/
※DOS头(
64B
)
+
PE标记(
4B
)
+
标准PE头(
20B
)
+
可选PE头
+
节表的总大小,按照文件对齐(FileAlignment的倍数)
ULONG CheckSum;
/
/
※PE文件CRC校验和,判断文件是否被修改
WORD Subsystem;
/
/
用户界面使用的子系统类型
WORD DllCharacteristics;
/
/
DllMain()函数何时被调用,默认为
0
ULONG SizeOfStackReserve;
/
/
默认线程初始化线程栈的保留大小
ULONG SizeOfStackCommit;
/
/
初始化时实际提交的线程栈大小
ULONG SizeOfHeapReserve;
/
/
默认保留给初始化的线程栈的虚拟内存大小
ULONG SizeOfHeapCommit;
/
/
初始化时实际提交的堆大小
ULONG LoaderFlags;
/
/
与调试有关,默认为
0
ULONG NumberOfRvaAndSizes;
/
/
目录项数目:总为
0X00000010H
(
16
),这个字段自Windows NT 发布以来一直是
16
IMAGE_DATA_DIRECTORY DataDirectory[
16
];
/
/
定义IMAGE_NUMBEROF_DIRECTORY_ENTRIES
16
} IMAGE_OPTIONAL_HEADER,
*
PIMAGE_OPTIONAL_HEADER;