PE文件格式详解(二)
0x00 前言
上一篇讲到了PE文件头的中IMAGE_FILE_HEADER结构的第二个结构,今天从IMAGE_FILE_HEADER中第三个结构sizeOfOptionalHeader讲起。这个字段的结构名也叫做IMAGE_OPTIONAL_HEDAER讲起。
0x01 IMAGE_OPTIONAL_HEADER概述
其实这个结构是IMAGE_FILE_HEADER结构的补充。这两个结构合起来才能对整个PE文件头进行描述。这个结构异常复杂,但真正我们用得到的其实不多,下面来看看它的各个字段情况,如下图(左边的16位字符表示相对于文件头的偏移量):
ypedef 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 DWORD DataDirctory[16];
// 数据目录表
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
这里总共31个字段但是常用的其实就是我用红色字体标明的。
前面我们已经知道了PE文件头在40h的位置,则上面的偏移量推断IMAGE_OPTIONAL_HEADER字段的首个字段在40h+18h=58h的地方,我们还是用hexwrokshop打开那个PE文件。Ctrl+G打开转移窗口,输入58则找到了第一个字段位置,如下图:

对于这31个字段我们今天最为关心的是最后一个字段DataDirctory[16]我们一眼就能看出这是一个数组,其中的每个元素都是由一个叫做IMAGE_DATA_DIRECTORY的结构组成。这个叫做IMAGE_DATA_DIRACTORY的结构如下:
IMAGE_DATA_DIRACTORY STRUC
VritualAddress DWORD //数据块的起始RVA
Size DWORD //数据块的长度
IMAGE_DATA_DIRACTORY RENS
下面是DataDirctory[16]即数据目录表的各个成员
|
索 引 |
索引值在Windows.inc中的预定义值 |
对应的数据块 |
偏移量 |
|
0 |
IMAGE_DIRECTORY_ENTRY_EXPORT |
导出表 |
78h |
|
1 |
IMAGE_DIRECTORY_ENTRY_IMPORT |
导入表 |
80h |
|
2 |
IMAGE_DIRECTORY_ENTRY_RESOURCE |
资源 |
88h |
|
3 |
IMAGE_DIRECTORY_ENTRY_EXCEPTION |
异常(具体资料不详) |
90h |
|
4 |
IMAGE_DIRECTORY_ENTRY_SECURITY |
安全(具体资料不详) |
98h |
|
5 |
IMAGE_DIRECTORY_ENTRY_BASERELOC |
重定位表 |
A0h |
|
6 |
IMAGE_DIRECTORY_ENTRY_DEBUG |
调试信息 |
A8h |
|
7 |
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE |
版权信息 |
B0h |
|
8 |
IMAGE_DIRECTORY_ENTRY_GLOBALPTR |
具体资料不详 |
B8h |
|
9 |
IMAGE_DIRECTORY_ENTRY_TLS |
Thread Local Storage |
C0h |
|
10 |
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG |
具体资料不详 |
C8h |
|
11 |
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT |
具体资料不详 |
D0h |
|
12 |
IMAGE_DIRECTORY_ENTRY_IAT |
导入函数地址表 |
D8h |
|
13 |
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT |
具体资料不详 |
E0h |
|
14 |
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR |
具体资料不详 |
E8h |
|
15 |
未使用 |
保留 |
这张表的16个成员中第一个成员IMAGE_DIRECTORY_ENTRY_EXPORT(导出表)和第二个成员IMAGE_DIRECTORY_ENTRY_EXPORT(导入表)非常重要。下面我们用另一个PE文件来查看信息。由于前面的PE.exe没有输出表,所以换一个Dumped.DLL这个有输出表的来查看结构。步骤如下:
1.用Hexwrokshop打开文件,首先找到PE文件头位置,一般都是在载入起始位+3ch处,如下图所示。
图中被选中的黑色处100h,故可知PE文件头在100h处,用快捷键跳ctrl+G跳转到该处 ,上图标黑部分即PE文件头位置。
2.找到了PE文件头的位置,接下来我们来找DataDirctory[16]各个成员位置。第一个成员输出表位于PE文件头+78h位置即100h+78h=178h处,如下图:
由于每个结构都占8个字节,所以可以知道输出表的其实位置在4000h处,大小为45h
输入表的位置位100h+80h=180h处,如下图:
由上图可知输入表的起始位置在3000h处,大小为52h。
3.其实除了这么查找,还有一种更为简单的方式。
我们要用到另一个工具LordPE。
步骤如下:
1)打开lordPE,点击PE编辑器即可查看PE文件头的许多信息,如下图:

2)再点击目录按钮即可查看数据目录表的相关信息。如下图:

由上图我们直接就能看到输出表RVA为4000h大小为45h,输入表的RVA为3000h,大小为52h。这和我们计算的查找的结果一致。
PE文件格式详解(二)的更多相关文章
- PE文件格式详解,第一讲,DOS头文件格式
PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- PE文件格式详解,第三讲,可选头文件格式,以及节表
PE文件格式详解,第三讲,可选头文件格式,以及节表 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) 一丶可选头结构以及作 ...
- PE文件格式详解(七)
PE文件格式详解(七) Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了. 0x01 输出表结构 ...
- PE文件格式详解(上)
作者:MSDN 译者:李马 摘要 Windows NT 3.1引入了一种名为PE文件格式的新可执行文件格式.PE文件格式的规范包含在了MSDN的CD中(Specs and Strategy, Spec ...
- PE文件格式详解(下)
作者:MSDN译者:李马 预定义段 一个Windows NT的应用程序典型地拥有9个预定义段,它们是.text..bss..rdata..data..rsrc..edata..idata..pdata ...
- PE 文件格式详解
PE文件 是微软 Win32 环境下可执行文件的标准格式. 所谓的可执行文件并不仅仅是常见的 EXE 文件,DLL,SYS,VXD 等文件也都属于 PE 格式. |-------> DOS_MZ ...
- PE文件格式详解(六)
0x00 前言 前面两篇讲到了输出表的内容以及涉及如何在hexWorkShop中找到输出表及输入DLL,感觉有几个地方还是没有理解好,比如由数据目录表DataDirectory[16]找到输出表表后以 ...
- PE文件格式详解(一)
PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...
随机推荐
- git提交代码托管平台流程
首先先安装git git官网 ---- https://git-scm.com/ 下载好傻瓜式安装即可 安装好过后,再桌面任意空白区域右键,看到以下两个选项即为安装成功 一般都用第二个选项也就是 Gi ...
- 通过与C++程序对比,彻底搞清楚JAVA的对象拷贝
目录 一.背景 二.JAVA对象拷贝的实现 2.1 浅拷贝 2.2 深拷贝的实现方法一 2.3 深拷贝的实现方法二 2.3.1 C++拷贝构造函数 2.3.2 C++源码 2.3.3 JAVA通过拷贝 ...
- Go语言圣经[中文版]
近期整理了一篇Go语言圣经[中文版]在线版本,排版比较适合手机以及PC阅读. Go语言圣经[中文版本]
- linux安装QT-Designer两种方法
1.安装Qt-Creator, Qt-Creator自带了qt-designer 2.安装qt5-default,qttools5-dev-tools
- vue2.0 + element ui 实现表格穿梭框
element ui 官网里介绍了穿梭框(Transfer),但在实际使用过程中,会出现一些问题: 1.穿梭框里能放置的内容太少,不能满足复杂的业务需求. 2.当选项过多时,穿梭框很难实现分页,左右两 ...
- Flask Jinja2 知识点
Jinja2模板引擎使用以下分隔符从HTML转义. {% ... %}用于语句 {{ ... }}用于表达式可以打印到模板输出 {# ... #}用于未包含在模板输出中的注释 # ... ##用于行语 ...
- 附016.Kubernetes_v1.17.4高可用部署
一 kubeadm介绍 1.1 概述 参考<附003.Kubeadm部署Kubernetes>. 1.2 kubeadm功能 参考<附003.Kubeadm部署Kubernetes& ...
- python基础整理(2)
布尔表达式与其余值的替换 值的测试 Python不仅仅可以使用布尔型变量作为条件,它可以直接在if中使用任何表达式作为条件: 大部分表达式的值都会被当作True,但以下表达式值会被当作False: F ...
- Python3-设计模式-迭代器模式
Python3中的迭代器 迭代器模式主要是访问集合元素的一中方式,迭代器不会把整个集合对象加载到内存,而是按照顺序将集合中的元素一个一个的进行迭代,这样每次迭代的时候只取少量的元素,比较省内存 注: ...
- Selenium+java - Edge浏览器启动
写在前面 随着win10系统的普及,使得Edge浏览器得到广泛使用.从自动化角度看,自然微软也一直不断提供着支持服务,系统版本更新,对应的Edge浏览器版本也在更新,当然对应的驱动版本也会发生变化. ...