没有合适的资源?快使用搜索试试~ 我知道了~
首页PE文件格式详解 PDF
PE文件格式详解 PDF
4星 · 超过85%的资源 需积分: 9 24 下载量 150 浏览量
更新于2023-03-03
评论
收藏 458KB PDF 举报
《PE文件格式详解》的PDF版本 ------------------------
资源详情
资源评论
资源推荐
PE 文件格式详解
摘要
Windows NT 3.1 引入了一种名为 PE 文件格式的新可执行文件格式。PE 文件格式的规范包含在了 MS
DN 的 CD 中(Specs and Strategy, Specifications, Windows NT File Format Specifications),但是它非常
之晦涩。
然而这一的文档并未提供足够的信息,所以开发者们无法很好地弄懂 PE 格式。本文旨在解决这一问
题,它会对整个的 PE 文件格式作一个十分彻底的解释,另外,本文中还带有对所有必需结构的描述以及
示范如何使用这些信息的源码示例。
我为了获得 PE 文件中所包含的重要信息,编写了一个名为 PEFILE.DLL 的动态链接库,本文中所有出
现的源码示例亦均摘自于此。这个 DLL 和它的源代码都作为 PEFile 示例程序的一部分包含在了 CD 中(译
注:示例程序请在 MSDN 中寻找),你可以在你自己的应用程序中使用这个 DLL;同样,你亦可以依你所
愿地使用并构建它的源码。在本文末尾,你会找到 PEFILE.DLL 的函数导出列表和一个如何使用它们的说
明。我觉得你会发现这些函数会让你从容应付 PE 文件格式的。
介绍
Windows 操作系统家族最近增加的 Windows NT 为开发环境和应用程序本身带来了很大的改变,这之
中一个最为重大的当属 PE 文件格式了。新的 PE 文件格式主要来自于 UNIX 操作系统所通用的 COFF 规范,
同时为了保证与旧版本 MS-DOS 及 Windows 操作系统的兼容,PE 文件格式也保留了 MS-DOS 中那熟悉的
MZ 头部。
在本文之中,PE 文件格式是以自顶而下的顺序解释的。在你从头开始研究文件内容的过程之中,本文
会详细讨论 PE 文件的每一个组成部分。
许多单独的文件成分定义都来自于 Microsoft Win32 SDK 开发包中的 WINNT.H 文件,在这个文件中
你会发现用来描述文件头部和数据目录等各种成分的结构类型定义。但是,在 WINNT.H 中缺少对 PE 文件
结构足够的定义,在这种情况下,我定义了自己的结构来存取文件数据。你会在 PEFILE.DLL 工程的 PEFI
LE.H 中找到这些结构的定义,整套的 PEFILE.H 开发文件包含在 PEFile 示例程序之中。
本文配套的示例程序除了 PEFILE.DLL 示例代码之外,还有一个单独的 Win32 示例应用程序,名为 E
XEVIEW.EXE。创建这一示例目的有二:首先,我需要测试 PEFILE.DLL 的函数,并且某些情况要求我同
时查看多个文件;其次,很多解决 PE 文件格式的工作和直接观看数据有关。例如,要弄懂导入地址名称
表是如何构成的,我就得同时查看.idata 段头部、导入映像数据目录、可选头部以及当前的.idata 段实体,
而 EXEVIEW.EXE 就是查看这些信息的最佳示例。
闲话少叙,让我们开始吧。
PE 文件结构
PE 文件格式被组织为一个线性的数据流,它由一个 MS-DOS 头部开始,接着是一个是模式的程序残
余以及一个 PE 文件标志,这之后紧接着 PE 文件头和可选头部。这些之后是所有的段头部,段头部之后跟
随着所有的段实体。文件的结束处是一些其它的区域,其中是一些混杂的信息,包括重分配信息、符号表
信息、行号信息以及字串表数据。我将所有这些成分列于图 1。
图 1.PE 文件映像结构
从 MS-DOS 文件头结构开始,我将按照 PE 文件格式各成分的出现顺序依次对其进行讨论,并且讨论
的大部分是以示例代码为基础来示范如何获得文件的信息的。所有的源码均摘自 PEFILE.DLL 模块的 PEFI
LE.C 文件。这些示例都利用了 Windows NT 最酷的特色之一——内存映射文件,这一特色允许用户使用一
个简单的指针来存取文件中所包含的数据,因此所有的示例都使用了内存映射文件来存取 PE 文件中的数
据。
注意:请查阅本文末尾关于如何使用 PEFILE.DLL 的那一段。(未完待续)
MS-DOS 头部/实模式头部
如上所述,PE 文件格式的第一个组成部分是 MS-DOS 头部。在 PE 文件格式中,它并非一个新概念,
因为它与 MS-DOS 2.0 以来就已有的 MS-DOS 头部是完全一样的。保留这个相同结构的最主要原因是,当
你尝试在 Windows 3.1 以下或 MS-DOS 2.0 以上的系统下装载一个文件的时候,操作系统能够读取这个文
件并明白它是和当前系统不相兼容的。换句话说,当你在 MS-DOS 6.0 下运行一个 Windows NT 可执行文
件时,你会得到这样一条消息:“This program cannot be run in DOS mode.”如果 MS-DOS 头部不是作为
PE 文件格式的第一部分的话,操作系统装载文件的时候就会失败,并提供一些完全没用的信息,例如:“T
he name specified is not recognized as an internal or external command, operable program or batch file.”
MS-DOS 头部占据了 PE 文件的头 64 个字节,描述它内容的结构如下:
WINNT.H
typedef struct _IMAGE_DOS_HEADER { // DOS 的.EXE 头部
USHORT e_magic; // 魔术数字
USHORT e_cblp; // 文件最后页的字节数
USHORT e_cp; // 文件页数
USHORT e_crlc; // 重定义元素个数
USHORT e_cparhdr; // 头部尺寸,以段落为单位
USHORT e_minalloc; // 所需的最小附加段
USHORT e_maxalloc; // 所需的最大附加段
USHORT e_ss; // 初始的 SS 值(相对偏移量)
USHORT e_sp; // 初始的 SP 值
USHORT e_csum; // 校验和
USHORT e_ip; // 初始的 IP 值
USHORT e_cs; // 初始的 CS 值(相对偏移量)
USHORT e_lfarlc; // 重分配表文件地址
USHORT e_ovno; // 覆盖号
USHORT e_res[4]; // 保留字
USHORT e_oemid; // OEM 标识符(相对 e_oeminfo)
USHORT e_oeminfo; // OEM 信息
USHORT e_res2[10]; // 保留字
LONG e_lfanew; // 新 exe 头部的文件地址
} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
第一个域 e_magic,被称为魔术数字,它被用于表示一个 MS-DOS 兼容的文件类型。所有 MS-DOS 兼
容的可执行文件都将这个值设为 0x5A4D,表示 ASCII 字符 MZ。MS-DOS 头部之所以有的时候被称为 MZ
头部,就是这个缘故。还有许多其它的域对于 MS-DOS 操作系统来说都有用,但是对于 Windows NT 来说,
这个结构中只有一个有用的域——最后一个域 e_lfnew,一个 4 字节的文件偏移量,PE 文件头部就是由它
定位的。对于 Windows NT 的 PE 文件来说,PE 文件头部是紧跟在 MS-DOS 头部和实模式程序残余之后的。
实模式残余程序
实模式残余程序是一个在装载时能够被 MS-DOS 运行的实际程序。对于一个 MS-DOS 的可执行映像文
件,应用程序就是从这里执行的。对于 Windows、OS/2、Windows NT 这些操作系统来说,MS-DOS 残余
程序就代替了主程序的位置被放在这里。这种残余程序通常什么也不做,而只是输出一行文本,例如:“T
his program requires Microsoft Windows v3.1 or greater.”当然,用户可以在此放入任何的残余程序,这就
意味着你可能经常看到像这样的东西:“You can't run a Windows NT application on OS/2, it's simply not
possible.”
当为 Windows 3.1 构建一个应用程序的时候,链接器将向你的可执行文件中链接一个名为 WINSTUB.
EXE 的默认残余程序。你可以用一个基于 MS-DOS 的有效程序取代 WINSTUB,并且用 STUB 模块定义语
句指示链接器,这样就能够取代链接器的默认行为。为 Windows NT 开发的应用程序可以通过使用-STUB:
链接器选项来实现。
PE 文件头部与标志
PE 文件头部是由 MS-DOS 头部的 e_lfanew 域定位的,这个域只是给出了文件的偏移量,所以要确定
PE 头部的实际内存映射地址,就需要添加文件的内存映射基地址。例如,以下的宏是包含在 PEFILE.H 源
文件之中的:
PEFILE.H
#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + \
((PIMAGE_DOS_HEADER)a)->e_lfanew))
在处理 PE 文件信息的时候,我发现文件之中有些位置需要经常查阅。既然这些位置仅仅是对文件的
偏移量,那么用宏来实现这些定位就比较容易,因为它们较之函数有更好的表现。
请注意这个宏所获得的是 PE 文件标志,而并非 PE 文件头部的偏移量。那是由于自 Windows 与 OS/2
的可执行文件开始,.EXE 文件都被赋予了目标操作系统的标志。对于 Windows NT 的 PE 文件格式而言,
这一标志在 PE 文件头部结构之前。在 Windows 和 OS/2 的某些版本中,这一标志是文件头的第一个字。同
样,对于 PE 文件格式,Windows NT 使用了一个 DWORD 值。
以上的宏返回了文件标志的偏移量,而不管它是哪种类型的可执行文件。所以,文件头部是在 DWOR
D 标志之后,还是在 WORD 标志处,是由这个标志是否 Windows NT 文件标志所决定的。要解决这个问
题,我编写了 ImageFileType 函数(如下),它返回了映像文件的类型:
PEFILE.C
DWORD WINAPI ImageFileType (LPVOID lpFile)
{
/* 首先出现的是 DOS 文件标志 */
if (*(USHORT *)lpFile == IMAGE_DOS_SIGNATURE)
{
/* 由 DOS 头部决定 PE 文件头部的位置 */
if (LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==
IMAGE_OS2_SIGNATURE ||
LOWORD (*(DWORD *)NTSIGNATURE (lpFile)) ==
IMAGE_OS2_SIGNATURE_LE)
return (DWORD)LOWORD(*(DWORD *)NTSIGNATURE (lpFile));
else if (*(DWORD *)NTSIGNATURE (lpFile) ==
IMAGE_NT_SIGNATURE)
return IMAGE_NT_SIGNATURE;
else
return IMAGE_DOS_SIGNATURE;
}
else
/* 不明文件种类 */
return 0;
}
以上列出的代码立即告诉了你 NTSIGNATURE 宏有多么有用。对于比较不同文件类型并且返回一个
适当的文件种类来说,这个宏就会使这两件事变得非常简单。WINNT.H 之中定义的四种不同文件类型有:
WINNT.H
#define IMAGE_DOS_SIGNATURE 0x5A4D // MZ
#define IMAGE_OS2_SIGNATURE 0x454E // NE
#define IMAGE_OS2_SIGNATURE_LE 0x454C // LE
#define IMAGE_NT_SIGNATURE 0x00004550 // PE00
首先,Windows 的可执行文件类型没有出现在这一列表中,这一点看起来很奇怪。但是,在稍微研究
一下之后,就能得到原因了:除了操作系统版本规范的不同之外,Windows 的可执行文件和 OS/2 的可执行
文件实在没有什么区别。这两个操作系统拥有相同的可执行文件结构。
现在把我们的注意力转向 Windows NT PE 文件格式,我们会发现只要我们得到了文件标志的位置,P
E 文件之后就会有 4 个字节相跟随。下一个宏标识了 PE 文件的头部:
PEFILE.C
#define PEFHDROFFSET(a) ((LPVOID)((BYTE *)a + \
((PIMAGE_DOS_HEADER)a)->e_lfanew + \
SIZE_OF_NT_SIGNATURE))
这个宏与上一个宏的唯一不同是这个宏加入了一个常量 SIZE_OF_NT_SIGNATURE。不幸的是,这个
常量并未定义在 WINNT.H 之中,于是我将它定义在了 PEFILE.H 中,它是一个 DWORD 的大小。
剩余31页未读,继续阅读
hlj493595708
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
- MW全能培训汽轮机调节保安系统PPT教学课件.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1