PE文件结构体-IMAGE_FILE_HEADER
struct _IMAGE_FILE_HEADER { WORD Machine; //运行平台 WORD NumberOfSections; //文件的区块数目 DWORD TimeDateStamp; //文件创建日期和时间 DWORD PointerToSymbolTable; //指向符号表(用于调试) DWORD NumberOfSymbols; //符号表中符号个数(用于调试) WORD SizeOfOptionalHeader; //IMAGE_OPTIONAL_HEADER结构的大小 WORD Characteristics; //文件属性 };
共20个字节:
成员Machine,占2个字节,表示该文件运行所要求的CPU。对于Intel i386平台,该值是“4C01”。
成员NumberOfSections,占2个字节,表示该文件中段的总数,我们这里计划写3个段,(.text(代码段)、.rdata(只读数据段)、 .data(全局变量数据段))。所以此处值是“0300”。
成员TimeDateStamp,占4个字节,表示文件创建日期和时间,从1970.1.1 00:00:00以来的秒数,我们这里填“0000”即可。
成员PointerToSymbolTable,占4个字节,表示符号表的指针,主要用于调试,在这里填“0000”。成员NumberOfSymbols,占4个字节,表示符号的数目,主要用于调试,在这里填“0000”。
成员SizeOfOptionalHeader,占2个字节,表示后面的“PE文件可选头 ”部分所占空间大小,“PE文件可选头 ”的大小,32位是224 byte,转换成十六进制就是E0,所以这里的值为“E000”,64位是240byte,转换成十六进制是F0,填充F000.
成员Characteristics,占2个字节,表示关于文件信息的标记,比如文件是exe还是dll。这个值实际上是二进制位进行或运算得到的值。
各二进制位表示的意义如下:
- Bit 0 :置1表示文件中没有重定向信息。每个段都有它们自己的重定向信息。这个标志在可执行文件中没有使用,在可执行文件中是用一个叫做基址重定向目录表来表示重定向信息的。
Bit 1 :置1表示该文件是可执行文件(也就是说不是一个目标文件或库文件)。
Bit 2 :置1表示没有行数信息;在可执行文件中没有使用。
Bit 3 :置1表示没有局部符号信息;在可执行文件中没有使用。
Bit 4 :
Bit 7
Bit 8 :表示希望机器为32位机。这个值永远为1。
Bit 9 :表示没有调试信息,在可执行文件中没有使用。
Bit 10:置1表示该程序不能运行于可移动介质中(如软驱或CD-ROM)。在这种情况下,OS必须把文件拷贝到交换文件中执行。
Bit 11:置1表示程序不能在网上运行。在这种情况下,OS必须把文件拷贝到交换文件中执行。
Bit 12:置1表示文件是一个系统文件例如驱动程序。在可执行文件中没有使用。
Bit 13:置1表示文件是一个动态链接库(DLL)。
Bit 14:表示文件被设计成不能运行于多处理器系统中。
Bit 15:表示文件的字节顺序如果不是机器所期望的,那么在读出之前要进行交换。在可执行文件中它们是不可信的(操作系统期望按正确的字节顺序执行程序)。