PE文件格式详解③
2010年12月04日
PE可选头部
Optional Header 结构是 IMAGE_NT_HEADERS 中的最后成员。包含了PE文件的逻辑分布信息。该结构共有31个域,一些是很关键,另一些不太常用。其结构定义:
typedef struct _IMAGE_OPTIONAL_HEADER {
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
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_HEADER, *PIMAGE_OPTIONAL_HEADER;
IMAGE_OPTIONAL_HEADER 结构成员含义:
1.Magic:用来定义 image 的状态
0x0107(IMAGE_ROM_OPTIONAL_HDR_MAGIC):一个 ROM image
0x010B(IMAGE_NT_OPTIONAL_HDR_MAGIC): 一个正常的(一般的)EXE image。大部份PE 文件都含此值。
2.MajorLinkerVersion、MinorLinkerVersion:产生此PE文件的链接器的版本。以十进制而非十六进制表示。例如2.23 版。
3.SizeOfCode:所有code section 的总和大小。大部分程序只有一个 code section,所以此域通常就是 .text section 的大小。
4.SizeOfInitializedData:所有包含初始化内容的 sections(但不包括 code section)的总和大小。似乎不包括 initialized data sections 在内。
5.SizeOfUninitializedData:所有需要PE装载器将内存地址空间赋予它但是却不占用硬盘空间的所有 sections 的大小总和。这些 sections 在程序启动时并不需要特别内容,所以导致 Uninitialized Data 这种叫法。为初始化的内容通常放在 .bss section 中。
6.AddressOfEntryPoint:这是PE文件开始执行的位置。这是一个RVA,通常会落在 .text section.此域适用于 exe 或 dll。
7.BaseOfCode:一个RVA,表示程序中的 code section 从何开始。code section 通常在 data section 之前,在PE 表头之后。微软链接器所产生的exes 中,此值通常为0x1000。Borland 的TLINK32则通常指定此值为0x10000。因为预设情况下TLINK时以64k为对齐粒度的,而MS用的是4k。
8.BaseOfData:一个RVA,表示程序中的 data section 从何开始。data section 一般位于code section 和 PE 表头之后。
9.ImageBase:PE文件的优先装载地址(Base Address)。比如,如果该值是400000h,PE装载器将尝试把文件装到虚拟地址空间的400000h处。字眼"优先"表示若该地址区域已被其他模块占用,那PE装载器会选用其他空闲地址。
10.SectionAlignment:内存中节对齐的粒度。例如,如果该值是4096 (1000h),那么每节的起始地址必须是4096的倍数。若第一节从401000h开始且大小是10个字节,则下一节必定从402000h开始,即使401000h和402000h之间还有很多空间没被使用。
11.FileAlignment:文件中节对齐的粒度。例如,如果该值是(200h),,那么每节的起始地址必须是512的倍数。若第一节从文件偏移量200h开始且大小是10个字节,则下一节必定位于偏移量400h,即使偏移量512和1024之间还有很多空间没被使用或定义。预设值就是0x200h。
12.MajorOperatingSystemVersion/MinorOperatingSystemVersion:使用此可执行程序的操作系统的最小版本。WIN32程序的这两个域通常指定为1.0。
13.MajorSubsystemVersion/MinorSubsystemVersion:WIN32子系统版本。若PE文件是专门为WIN32设计的,该子系统版本必定是4.0否则对话框不会有3维立体感。
14.MajorImageVersion/MinorImageVersion:使用者自定义的域,允许你拥有不同版本的exe或dll。可以利用链接器的 /VERSION 选项设定其值。例如:LINK /VERSION:2.0 myobj.obj。
15.Reserved1:似乎总是0。
16.SizeOfImage:内存中整个PE映像体的尺寸。它是所有头和节经过节对齐处理后的大小。也就是从image base 开始,直到最后一个 section为止。最后一个section 的尾端必需是SectionAlignment 的倍数。
17.SizeOfHeaders:所有头 + 节表的大小,也就等于文件尺寸减去文件中所有节的尺寸。可以以此值作为PE文件第一节的文件偏移量。
18.CheckSum:此程序的一个CRC 校验和。PE中此域通常被忽略并被设为0。然而,所有的driver DLLs、所有在开机时载入的DLLs、以及server DLLs 都必须有一个合法的 CheckSum。其演算法可以在IMAGEHLP.DLL中获得。IMAGEHLP.DLL 的代码可以在WIN32 SDK中找到。
19.Subsystem:用来识别PE文件属于哪个子系统。对于大多数Win32程序,只有两类值: Windows GUI 和 Windows CUI (控制台)。WINNT.h中定义如下:
#define IMAGE_SUBSYSTEM_UNKNOWN 0 Unknown subsystem.
#define IMAGE_SUBSYSTEM_NATIVE 1 不需要子系
发表评论
-
QTP的2种脚本调用方法是什么
2012-01-20 02:14 918QTP的2种脚本调用方法是什么 2011年06月14日 ... -
让windows批处理脚本在后台运行
2012-01-20 02:14 707让windows批处理脚本在后台运行 2010年12月24日 ... -
VBS学习笔记(2): Call造成的麻烦
2012-01-20 02:14 593VBS学习笔记(2): Call造成的麻烦 2011年02月 ... -
用vbs实现文本循环读取
2012-01-20 02:14 533用vbs实现文本循环读取 2010年06月16日 因为测 ... -
VBS启动Process
2012-01-20 02:14 595VBS启动Process 2010年06月09日 Run ... -
小学语文毕业知识整理与复习题
2012-01-19 10:04 574小学语文毕业知识整理 ... -
总体上说,是c++ builder胜于VC++,DELPHI是最好
2012-01-19 10:04 765总体上说,是c++ builder胜 ... -
FPS游戏透视源码!
2012-01-19 10:04 2558FPS游戏透视源码! 2011年10月03日 需要的自己 ... -
创建一个新的服务
2012-01-19 10:03 569创建一个新的服务 2010年11月23日 创建一个新的服 ... -
android最新的SDK安装方法+ 离线安装方法
2012-01-17 02:45 686android最新的SDK安装方法+ 离线安装方法 2010 ... -
Eclipse+Android SDK+ADT(@XP)搭建时候的几个小问题
2012-01-17 02:45 751Eclipse+Android SDK+ADT(@XP)搭 ... -
Android SDK2.1开发环境的搭建
2012-01-17 02:45 694Android SDK2.1开发环境的搭建 2010年11月 ... -
通过QQ旋风离线下载Android SDK,速度超快
2012-01-17 02:44 748通过QQ旋风离线下载Android SDK,速度超快 201 ... -
Qt 学习笔记 --Qt SDK 的下载安装与配置
2012-01-17 02:44 624Qt 学习笔记 --Qt SDK 的下 ... -
flex各种用法
2012-01-15 22:21 467flex各种用法 2010年02月22日 //获得屏幕的 ... -
Flex开发实例――个人学习心得
2012-01-15 22:21 561Flex开发实例――个人学习心得 2009年10月15日 ... -
Flex 的一些整理
2012-01-15 22:21 559Flex 的一些整理 2010年11月16日 你常用的 ... -
自动根据内容调整列宽advanceddatagrid autoresize
2012-01-15 22:21 813自动根据内容调整列宽advanceddatagrid auto ... -
AdvancedDataGrid的使用,动态插入组列
2012-01-15 22:20 496AdvancedDataGrid的使用,动态插入组列 201 ...
相关推荐
PE文件格式详解.chm PE文件格式详解.chm
Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式。PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常之晦涩。 然而这...
PE文件格式详解.rtf PE文件格式详解.rtf PE文件格式详解.rtf PE文件格式详解.rtf PE文件格式详解.rtf PE文件格式详解.rtf
PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件解析类PE文件...
Windows的PE文件格式详解:Windows的PE文件格式详解.chm;PE文件分析工具(可执行文件分析工具)
PE文件格式详解.txtPE文件格式详解.txt
《PE文件格式详解》的PDF版本 ------------------------
李马翻译的《PE文件格式详解》中所涉及到的PEfile.c,PEfile.H和PEfile.dll等文件,便于学习PE文件格式的同道参考学习。客观为人,主观为自己赚点分,别说我狠呶。
此文的英文原文为The Portable Executable File Format from Top to Bottom,我找到了两篇不同出处的译文,题名分别为《PE文件格式详解》和《可移植的可执行文件格式全接触》。并且搜集到了文章中所提到的两个附件...
你值得拥有,PE文件格式详解PE文件格式详解PE文件格式详解PE文件格式详解
详细地讲解PE格式文件,适合初学者对PE格式文件有个全面地了解
PE文件格式详解PE文件格式详解
同时为了保证与旧版本 MS-DOS 及 Windows 操作系统的兼容,PE 文件格式也保 留了 MS-DOS 中那熟悉的 MZ 头部。“Portable Executable”(可移植的执行体)意 味着此文件格式是跨 Win32 平台的;即使 Windows 运行在...
PE文件格式详解 分析可执行代码,在window系统下
PE文件格式解析(MFC,C++源码),解析的很全,学习PE文件格式必备
WINDOWS PE文件解析,PE文件详细解析 ,包含详细的代码和分析