typedef struct _IMAGE_OPTIONAL_HEADER {
 
    //
 
    // Standard fields.
 
    //
 
    WORD    Magic;                                   //010B-IMAGE_NT_OPTIONAL_HDR32_MAGIC
 
    BYTE    MajorLinkerVersion;                      //0A-连接器主版本号
 
    BYTE    MinorLinkerVersion;                      //00-连接器小版本号
 
    DWORD   SizeOfCode;                              //0000008A(138)-代码节大小
 
    DWORD   SizeOfInitializedData;                   //0000004C(76)-已初始化数据大小
 
    DWORD   SizeOfUninitializedData;                 //00000000(0)-为初始化数据大小
 
    DWORD   AddressOfEntryPoint;                     //000110AA程序入口地址
 
    DWORD   BaseOfCode;                              //00001000程序段基地址
 
    DWORD   BaseOfData;                              //00001000数据段基地址
 
    //
 
    // NT additional fields.
 
    //
  
    DWORD   ImageBase;                               //镜像加载基地址00400000
 
    DWORD   SectionAlignment;                        //节对其0001000(4096)
 
    DWORD   FileAlignment;                           //文件对齐0000200(512)
 
    WORD    MajorOperatingSystemVersion;             //操作系统主版本号0005
 
    WORD    MinorOperatingSystemVersion;             //操作系统小版本号0001
 
    WORD    MajorImageVersion;                       //镜像主版本号0000
 
    WORD    MinorImageVersion;                       //镜像小版本号0000
 
    WORD    MajorSubsystemVersion;                   //子系统主版本号0005
 
    WORD    MinorSubsystemVersion;                   //子系统小版本号0001
 
    DWORD   Win32VersionValue;                       //0
 
    DWORD   SizeOfImage;                             //镜像大小00022000
 
    DWORD   SizeOfHeaders;                           //头大小0400
 
    DWORD   CheckSum;                                //0
 
    WORD    Subsystem;                               //03-IMAGE_SUBSYSTEM_WINDOWS_CUI
 
    WORD    DllCharacteristics;                      //8140IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
 
    DWORD   SizeOfStackReserve;                      //栈初始化大小010000
 
    DWORD   SizeOfStackCommit;                       //栈提交大小01000
 
    DWORD   SizeOfHeapReserve;                       //堆初始化大小010000
 
    DWORD   SizeOfHeapCommit;                        //堆提交大小01000
 
    DWORD   LoaderFlags;                             //0
 
    DWORD   NumberOfRvaAndSizes;                     //10(16)
 
    IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];//数据目录表
 
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
IMAGE_OPTIONAL_HEADER 结构,正如名字的意思,这是一个可选映像头,是一个可选的结构,但是呢,实际上 IMAGE_FILE_HEADER 结构远远不足以来定义 PE 文件的属性。因此,这些属性在 IMAGE_OPTIONAL_HEADER 结构中进行定义。

因此这两个结构联合起来,才是一个完整的 “PE文件结构” 。
事实上,这个结构中的大部分字段都不重要,大家可以从注释中理解它们的含义,将比较重要的字段在下边跟大家详细讲解.

AddressOfEntryPoint字段

指出文件被执行时的入口地址,这是一个RVA地址(RVA的含义在下一节中详细介绍)。如果在一个可执行文件上附加了一段代码并想让这段代码首先被执行,那么只需要将这个入口地址指向附加的代码就可以了。

ImageBase字段

指 出文件的优先装入地址。也就是说当文件被执行时,如果可能的话,Windows优先将文件装入到由ImageBase字段指定的地址中,只有指定的地址已 经被**模块使用时,文件才被装入到**地址中。链接器产生可执行文件的时候对应这个地址来生成机器码,所以当文件被装入这个地址时不需要进行重定位操 作,装入的速度最快,如果文件被装载到**地址的话,将不得不进行重定位操作,这样就要慢一点。
对于EXE文件来说,由于每个文件总是使用独立的虚拟地址空间,优先装入地址不可能被**模块占据,所以EXE总是 能够按照这个地址装入,这也意味着EXE文件不再需要重定位信息。对于DLL文件来说,由于多个DLL文件全部使用宿主EXE文件的地址空间,不能保证优 先装入地址没有被**的DLL使用,所以DLL文件中必须包含重定位信息以防万一。因此,在前面介绍的 IMAGE_FILE_HEADER 结构的 Characteristics 字段中,DLL 文件对应的 IMAGE_FILE_RELOCS_STRIPPED 位总是为0,而EXE文件的这个标志位总是为1。
在链接的时候,可以通过对link.exe指定/base:address选项来自定义优先装入地址,如果不指定这个选项的话,一般EXE文件的默认优先装入地址被定为00400000h,而DLL文件的默认优先装入地址被定为10000000h。

SectionAlignment 字段和FileAlignment字段

SectionAlignment字段指定了节被装入内存后的对齐单位。也就是说,每个节被装入的地址必定是本字段指定数值的整数倍。而FileAlignment字段指定了节存储在磁盘文件中时的对齐单位。

Subsystem字段

指 定使用界面的子系统,它的取值如表17.3所示。这个字段决定了系统如何为程序建立初始的界面,链接时的/subsystem:**选项指定的就是这个字 段的值,在前面章节的编程中我们早已知道:如果将子系统指定为Windows CUI,那么系统会自动为程序建立一个控制台窗口,而指定为Windows GUI的话,窗口必须由程序自己建立。
界面子系统的取值和含义
取 值
Windows.inc中的预定义值
含 义
0
IMAGE_SUBSYSTEM_UNKNOWN
未知的子系统
1
IMAGE_SUBSYSTEM_NATIVE
不需要子系统(如驱动程序)
2
IMAGE_SUBSYSTEM_WINDOWS_GUI
Windows图形界面
3
IMAGE_SUBSYSTEM_WINDOWS_CUI
Windows控制台界面
5
IMAGE_SUBSYSTEM_OS2_CUI
OS2控制台界面
7
IMAGE_SUBSYSTEM_POSIX_CUI
POSIX控制台界面
8
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
不需要子系统
9
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
Windows CE图形界面

DataDirectory字段

这 个字段可以说是最重要的字段之一,它由16个相同的IMAGE_DATA_DIRECTORY结构组成,虽然PE文件中的数据是按照装入内存后的页属性归 类而被放在不同的节中的,但是这些处于各个节中的数据按照用途可以被分为导出表、导入表、资源、重定位表等数据块,这16个 IMAGE_DATA_DIRECTORY结构就是用来定义多种不同用途的数据块的(如表17.4所示)。IMAGE_DATA_DIRECTORY结构 的定义很简单,它仅仅指出了某种数据块的位置和长度。
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress DWORD ? ;数据的起始RVA
isize DWORD ? ;数据块的长度
IMAGE_DATA_DIRECTORY ENDS
数据目录列表的含义
索 引
索引值在Windows.inc中的预定义值
对应的数据块
0
IMAGE_DIRECTORY_ENTRY_EXPORT
导出表
1
IMAGE_DIRECTORY_ENTRY_IMPORT
导入表
2
IMAGE_DIRECTORY_ENTRY_RESOURCE
资源
3
IMAGE_DIRECTORY_ENTRY_EXCEPTION
异常(具体资料不详)
4
IMAGE_DIRECTORY_ENTRY_SECURITY
安全(具体资料不详)
5
IMAGE_DIRECTORY_ENTRY_BASERELOC
重定位表
6
IMAGE_DIRECTORY_ENTRY_DEBUG
调试信息
7
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE
版权信息
8
IMAGE_DIRECTORY_ENTRY_GLOBALPTR
具体资料不详
9
IMAGE_DIRECTORY_ENTRY_TLS
Thread Local Storage
10
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
具体资料不详
11
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
具体资料不详
12
IMAGE_DIRECTORY_ENTRY_IAT
导入函数地址表
13
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
具体资料不详
14
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
具体资料不详
15
未使用
  
在 PE文件中寻找特定的数据时就是从这些IMAGE_DATA_DIRECTORY结构开始的,比如要存取资源,那么必须从第3个 IMAGE_DATA_DIRECTORY结构(索引为2)中得到资源数据块的大小和位置;同理,如果要查看PE文件导入了哪些DLL文件的哪些API函 数,那就必须首先从第2个IMAGE_DATA_DIRECTORY结构得到导入表的位置和大小。

PE笔记之NT头PE扩展头的更多相关文章

  1. PE笔记之NT头PE签名

    typedef struct _IMAGE_NT_HEADERS {       DWORD Signature;                     //PE头签名PE\0\0       IM ...

  2. PE笔记之NT头PE文件头

    typedef struct _IMAGE_FILE_HEADER {       WORD    Machine;                         //014C-IMAGE_FILE ...

  3. PE文件学习系列三-PE头详解

    合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q  Q:408365330     E-Mail:egojit@qq.com 最近比较忙 ...

  4. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

  5. PE文件格式详解,第三讲,可选头文件格式,以及节表

    PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...

  6. PE笔记之PE基本结构图(PE笔记索引)

    PE(Portable Execute) 文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 何扩展名.那 ...

  7. UNIX标准化及实现之POSIX标准扩展头文件

    POSIX标准定义的XSI(X/Open System Interface)扩展头文件 头文件 说明 <cpio.h> cpio归档值 <dlfcn.h> 动态链接 <f ...

  8. Android系列之网络(二)----HTTP请求头与响应头

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  9. (二)----HTTP请求头与响应头

    一.HTTP头引入: 正确的设置HTTP头部信息有助于搜索引擎判断网页及提升网站访问速度.通常HTTP消息包括:客户机向服务器的请求消息和服务器向客户机的响应消 息.客户端向服务器发送一个请求,请求头 ...

随机推荐

  1. 九、Linux 磁盘管理

    Linux 磁盘管理 Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fd ...

  2. LeetCode951-翻转等价二叉树

    问题:翻转等价二叉树 我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树. 只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉 ...

  3. MongDB之各种新增操作

    接口IMongDaoCreate: package com.net.test.mongdb.dao; import java.util.List; import com.net.test.mongdb ...

  4. 动态规划:完全背包问题-HDU1114-Piggy-Bank

    解题心得: 1.这是一个完全背包问题的变形,题目要求是求在规定的重量下求价值最小,所以需要将d[0]=0关键的初始化 2.当不可能出现最小的价值时,d的状态并没有被改变,说明并没有放进去一个硬币. 题 ...

  5. GIt-恢复进度

    继续暂存区未完成的实践 经过了前面的实践,现在DEMO版本库应该处于master分支上,看看是不是这样. $ cd /path/to/my/workspace/demo $ git status -s ...

  6. CodeForces 781D Axel and Marston in Bitland DP

    题意: 有一个\(n\)个点\(m\)条边的无向图,边有两种类型,分别用\(0\)和\(1\)标识 因此图中的任意一条路径都对应一个\(01\)字符串 定义一个无限长的字符串\(s\): 开始令\(s ...

  7. django 自定义过滤器中的坑.

    今天在创建自定义过滤器的时候,设置已正常.但是在运行后报: 'filter' is not a valid tag library: Template library filter not found ...

  8. day19 Dgango进阶 路由系统及 ORM 详解

    完成一个完整的网页服务,需要有以下: 再次回顾一下Django 的完成开发流程: 一些值的获取: 对于性别,为互斥属性: 爱好则为多选: 需要使用新的方法 getlist 来获取多个爱好: 单选下拉框 ...

  9. http协议学习笔记——状态码

    1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态码. 100(继续) 请求者应当继续提出请求.服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101(切换协议) 请求者已要 ...

  10. IOS开发学习笔记030-xib实现淘宝界面

    使用xib文件实现界面,然后通过模型更新数据. 1.使得控制器继承自UITableViewController 2.创建xib文件,实现界面如下:一个UIImageView,两个lable 3.新建一 ...