PE Header中的OptionalHeader

 

typedef struct _IMAGE_OPTIONAL_HEADER

 

{

 

//

 

// Standard fields.

 

//

 

+18h WORD Magic; // 标志字, ROM 映像(0107h),普通可执行文件(010Bh)

 

+1Ah BYTE MajorLinkerVersion; // 链接程序的主版本号

 

+1Bh BYTE MinorLinkerVersion; // 链接程序的次版本号

 

+1Ch DWORD SizeOfCode; // 所有含代码的节的总大小

 

+20h DWORD SizeOfInitializedData; // 所有含已初始化数据的节的总大小

 

+24h DWORD SizeOfUninitializedData; // 所有含未初始化数据的节的大小

 

+28h DWORD AddressOfEntryPoint; // 程序执行入口RVA

 

+2Ch DWORD BaseOfCode; // 代码的区块的起始RVA

 

+30h DWORD BaseOfData; // 数据的区块的起始RVA

 

//

 

// NT additional fields. 以下是属于NT结构增加的领域。

 

//

 

+34h DWORD ImageBase; // 程序的首选装载地址

 

+38h DWORD SectionAlignment; // 内存中的区块的对齐大小

 

+3Ch DWORD FileAlignment; // 文件中的区块的对齐大小

 

+40h WORD MajorOperatingSystemVersion; // 要求操作系统最低版本号的主版本号

 

+42h WORD MinorOperatingSystemVersion; // 要求操作系统最低版本号的副版本号

 

+44h WORD MajorImageVersion; // 可运行于操作系统的主版本号

 

+46h WORD MinorImageVersion; // 可运行于操作系统的次版本号

 

+48h WORD MajorSubsystemVersion; // 要求最低子系统版本的主版本号

 

+4Ah WORD MinorSubsystemVersion; // 要求最低子系统版本的次版本号

 

+4Ch DWORD Win32VersionValue; // 莫须有字段,不被病毒利用的话一般为0

 

+50h DWORD SizeOfImage; // 映像装入内存后的总尺寸

 

+54h DWORD SizeOfHeaders; // 所有头 + 区块表的尺寸大小

 

+58h DWORD CheckSum; // 映像的校检和

 

+5Ch WORD Subsystem; // 可执行文件期望的子系统

 

+5Eh WORD DllCharacteristics; // DllMain()函数何时被调用,默认为 0

 

+60h DWORD SizeOfStackReserve; // 初始化时的栈大小

 

+64h DWORD SizeOfStackCommit; // 初始化时实际提交的栈大小

 

+68h DWORD SizeOfHeapReserve; // 初始化时保留的堆大小

 

+6Ch DWORD SizeOfHeapCommit; // 初始化时实际提交的堆大小

 

+70h DWORD LoaderFlags; // 与调试有关,默认为 0

 

+74h DWORD NumberOfRvaAndSizes; // 下边数据目录的项数,这个字段自Windows NT 发布以来 // 一直是16

 

+78h IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

 

// 数据目录表

 

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

 

 

 

FieldMeanings
AddressOfEntryPoint PE装载器准备运行的PE文件的第一个指令的RVA。若您要改变整个执行的流程,可以将该值指定到新的RVA,这样新RVA处的指令首先被执行。
ImageBase PE文件的优先装载地址。比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处。字眼"优先"表示若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址。
SectionAlignment 内存中节对齐的粒度。例如,如果该值是4096 (1000h),那么每节的起始地址必须是4096的倍数。若第一节从401000h开始且大小是10个字节,则下一节必定从402000h开始,即使401000h和402000h之间还有很多空间没被使用。
FileAlignment

文件中节对齐的粒度。例如,如果该值是(200h),,那么每节的起始地址必须是512的倍数。若第一节从文件偏移量200h开始且大小是10个字节,则下一节必定位于偏移量400h: 即使偏移量512和1024之间还有很多空间没被使用/定义。

MajorSubsystemVersion
MinorSubsystemVersion
win32子系统版本。若PE文件是专门为Win32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感。
SizeOfImage 内存中整个PE映像体的尺寸。它是所有头和节经过节对齐处理后的大小。
SizeOfHeaders 所有头+节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。
Subsystem NT用来识别PE文件属于哪个子系统。 对于大多数Win32程序,只有两类值: Windows GUI 和 Windows CUI (控制台)。
DataDirectory IMAGE_DATA_DIRECTORY 结构数组。每个结构给出一个重要数据结构的RVA,比如引入地址表等。

 

posted @ 2013-08-25 09:10  Fly Hawk  阅读(1083)  评论(0编辑  收藏  举报