没有合适的资源?快使用搜索试试~ 我知道了~
PE文件格式”1.9版 完整译文(附注释)
4星 · 超过85%的资源 需积分: 10 20 下载量 141 浏览量
2010-04-12
20:25:59
上传
评论
收藏 181KB DOC 举报
温馨提示
试读
43页
原著:Bernd. Luevelsmeyer PE(“portable executable”,可移植的可执行文件)文件格式,是微软WindwosNT,Windows95和Win32子集①中的可执行的二进制文件的格式;
资源推荐
资源详情
资源评论
“PE 文件格式”1.9 版 完整译文(附注释)(一)
原著:Bernd.Luevelsmeyer
翻译:ah007
[注意:本译文的所有大小标题序号都是译者添加,以方便大家阅读。圆圈内的数字是注释的编号,其中
注释②译自微软的《PECOFF 规范》,其它译自网络。----译者]
一、前言(Preface)B
------------------
PE(“ portableexecutable”,可移植的可执行文件)文件格式,是微软 WindwosNT,Windows95 和 Win32 子
集①中的可执行的二进制文件的格式;在 WindowsNT 中,驱动程序也是这种格式。它还能被应用于各种
目标文件②和库文件中。B
这种文件格式是由微软设计的,并于 1993 年被 TIS(toolinterfacestandard,工具接口标准)委员会(由
Microsoft,Intel,Borland,Watcom,IBM,等等组成)所批准,它明显的基于 COFF 文件格式的许多知识。
COFF(“ commonobjectfilefromat”,通用目标文件格式)是应用于好几种 UNIX 系统③和 VMS④ 系统中的
目标文件和可执行文件的格式。B
Win32SDK⑤ 中包含一个名叫的头文件,其中含有很多用于 PE 格式的#define 和 typedef 定义。我将逐步
地提到其中的很多结构成员名字和#define 定义。B
你也可能发现 DLL 文件“imagehelp.dll”很有用途,它是 WindowNT 的一部分,但其书面文件却很缺乏。它
的一些功用在“DeveloperNetwork”(开发者网络)中有所描述。B
二、总览(GeneralLayout)B
-------------------------
在一个 PE 文件的开始处,我们会看到一个 MS-DOS 可执行体(英语叫“stub”,意为“根,存根”);它使任何
PE 文件都是一个有效的 MS-DOS 可执行文件。B
在 DOS-根之后是一个 32 位的签名以及魔数 0x00004550(IMAGE_NT_SIGNATURE)(意为“NT 签名”,也
就是 PE 签名;十六进制数 45 和 50 分别代表 ASCII 码字母 E 和 P----译者注)。B
之后是文件头(按 COFF 格式),用来说明该二进制文件将运行在何种机器之上、分几个区段、链接的时
间、是可执行文件还是 DLL、等等。(本文中可执行文件和 DLL 文件的区别在于:DLL 文件不能被启动,
但能被别的二进制文件使用,而一个二进制文件则不能链接到另一个可执行文件。)B
那些之后,是可选头(尽管它一直都存在,却仍被称作“可选”----因为 COFF 文件格式仅为库文件使用一个
“可选头”,却不为目标文件使用一个“可选头”,这就是为什么它被称为“可选”的原因)。它会告诉我们该二
进制文件怎样被载入的更多信息:开始的地址呀、保留的堆栈数呀、数据段的大小呀、等等。B
可选头的一个有趣的部分是尾部的“数据目录”数组;这些目录包含许多指向各“节”数据的指针。例如:如
果一个二进制文件拥有一个输出目录,那么你就会在数组成员
“IMAGE_DIRECTORY_ENTRY_EXPORT”(输出目录项)中找到一个指向那个目录的指针,而该指针指
向文件中的某节。B
跟在各种头后面我们就发现各个“节”了,它们都由“节头”引导。本质上讲,各节中的内容才是你执行一个
程序真正需要的东西,所有头和目录这些东西只是为了帮助你找到它们。B
每节都含有和对齐、包含什么样的数据(如“已初始化数据”等等)、是否能共享等有关的一些标记,还有
就是数据本身。大多数(并非所有)节都含有一个或多个可通过可选头的“数据目录”数组中的项来参见的
目录,如输出函数目录和基址重定位目录等。无目录形式的内容有:例如“可执行代码”或“已初始化数据”
等。B
+-------------------+
|DOS-stub|--DOS-头B
+-------------------+
|file-header|--文件头B
+-------------------+
|optionalheader|--可选头B
|----------|
||
|datadirectories|--数据目录B
||
+-------------------+
||
|sectionheaders|--节头B
||
+-------------------+
||
|section1|--节 1
| |
+-------------------+
||
|section2|--节 2
||
+-------------------+
||
|...|
||
+-------------------+
||
|sectionn|--节 n
||
+-------------------+
三、DOS-根和签名(DOS-stubandSignature)B
-----------------------------------------
DOS-根的概念很早从 16 位 windows 的可执行文件(当时是“NE”格式⑥)时就广为人知了。根原来是用于
OS/2⑦ 系统的可执行文件的,也用于自解压档案文件和其它的应用程序。对于 PE 文件来说,它是一个总
是由大约 100 个字节所组成的和 MS-DOS2.0 兼容的可执行体,用来输出象“thisprogramneedswindowsNT
”之类的错误信息。B
你可以通过确认 DOS-头部分是否为一个 IMAGE_DOS_HEADER(DOS 头)结构来认出 DOS-根,它的前
两个字节必须为连续的两个字母“MZ”(有一个#defineIMAGE_DOS_SIGNATURE 的定义是针对这个
WORD 单元的)。B
你可以通过跟在后面的签名来将一个 PE 二进制文件和其它含有根的二进制文件区分开来,跟在后面的签
名可由头成员’e_lfanew’(它是从字节偏移地址 60 处开始的,有 32 字节长)所设定的偏移地址找到。对于
OS/2 系统和 Windows 系统的二进制文件来说,签名是一个 16 位的 word 单元;对于 PE 文件来说,它是一
个按照 8 位字节边界对齐的 32 位的 longword 单元,并且 IMAGE_NT_SIGNATURE(NT 签名)的值已由
#defined 定义为 0x00004550(即字母“PE/0/0”----译者)。B
四、文件头(FileHeader)B
-------------------------
要到达 IMAGE_FILE_HEADER(文件头)结构,请先确认 DOS-头“MZ”(起始的 2 个字节),然后找出
DOS-根的头部的成员“e_lfanew”,并从文件开始处跳过那么多的字节。在核实你在那里找到的签名后,
IMAGE_FILE_HEADER(文件头)结构的文件头就紧跟其后开始了,下面我们将从头至尾的介绍其成员。
B
1)第一个成员是“Machine(机器)”,一个 16 位的值,用来指出该二进制文件预定运行于什么样的系统。
已知的合法的值有:B
IMAGE_FILE_MACHINE_I386(0x14c)
Intel80386处理器或更高B
0x014d
Intel80386处理器或更高B
0x014e
Intel80386处理器或更高B
0x0160
R3000(MIPS⑧)处理器,大尾⑨B
IMAGE_FILE_MACHINE_R3000(0x162)
R3000(MIPS)处理器,小尾B
IMAGE_FILE_MACHINE_R4000(0x166)
R4000(MIPS)处理器,小尾B
IMAGE_FILE_MACHINE_R10000(0x168)
R10000(MIPS)处理器,小尾B
IMAGE_FILE_MACHINE_ALPHA(0x184)
DECAlphaAXP⑩ 处理器B
IMAGE_FILE_MACHINE_POWERPC(0x1F0)
IBMPowerPC,小尾B
2)然后是“NumberOfSections(节数)”成员,16 位的值。它是紧跟在头后面的节的数目。我们以后将讨论
节的问题。B
3)下一个成员是时间戳“TimeDateStamp”(32 位),用来给出文件建立的时间。即使它的“官方”版本号没
有改变,你也可通过这个值来区分同一个文件的不同版本。(除了同一个文件的不同版本之间必须唯一,
时间戳的格式没有明文规定,但似乎是按照 UTC时间“从 1970 年 1 月 1 日 00:00:00 算起的秒数值”----也就
是大多数 C 语言编译器给 time_t 标志使用的格式。)B
这个时间戳是用来绑定各个输入目录的,我们稍后再讨论它。B
警告:有一些链接器往往将时间戳设为荒唐的值,而不是如前所述的 time_t 格式的链接时间。B
4-5)成员“PointerToSymbolTable(符号表指针)”和成员“NumberOfSymbols(符号数)”(都是 32 位)都
用于调试信息的。我不知道该怎样去解读它,并且我发现该指针的值总为 0。B
6)成员“SizeOfOptionalHeader(可选头大小)”(16 位)只是“IMAGE_OPTIONAL_HEADER(可选头)”
项的大小,你能用它去验证 PE 文件结构的正确性。B
7)成员“Characteristics(特性)”是一个 16 位的,由许多标志位形成的集合组成,但大多数标志位只对目
标文件和库文件有效。具体如下:B
位 0IMAGE_FILE_RELOCS_STRIPPED(重定位被剥离文件)B表示如果文件中没有重定位信息,该位
置 1,这就表明各节的重定位信息都在它们各自的节中;可执行文件不使用该位,它们的重定位信息放在
下面将要描述的“baserelocation”(基址重定位)目录中。B
位 1IMAGE_FILE_EXECUTABLE_IMAGE(可执行映象文件)B表示如果文件是一个可执行文件,也即
不是目标文件或者库文件时,置 1。如果链接器尝试创建一个可执行文件,却因为一些原因失败了,并保
存映像以便下次例如增量链接时使用,此时此标志位也可能置 1。B
位 2IMAGE_FILE_LINE_NUMS_STRIPPED(行数被剥离文件)B表示如果行数信息被剥除,此位置 1;
此位也不用于可执行文件。B
位 3IMAGE_FILE_LOCAL_SYMS_STRIPPED(本地符号被剥离文件)B表示如果文件中没有关于本地
符号的信息时,此位置 1(此位也不用于可执行文件)。B
位 4IMAGE_FILE_AGGRESIVE_WS_TRIM(强行工作集修剪文件)B表示如果操作系统被假定为:通
过将正在运行的进程(它所使用的内存数量)强行的页清除来修剪它的工作集时,此位置 1。如果一进程
是大部分时间处于等待,且一天中仅被唤醒一次的演示性的应用程序之类时,此位也应该被置 1。B
位 7IMAGE_FILE_BYTES_REVERSED_LO(低字节变换文件)和B位
15IMAGE_FILE_BYTES_REVERSED_HI(高字节变换文件)B表示如果一文件的字节序不是机器所预期的
形式,因此它在读入前必须调换字节时,此位置 1。这样做对可执行文件是不可靠的(操作系统期望可执
行文件都已经被正确地按字节排整齐了)。B
位 8IMAGE_FILE_32BIT_MACHINE(32 位机器文件)B表示如果使用的机器被期望为 32 位的机器时,
此位置 1。现在的应用程序总将此位置 1;NT5 系统可能工作不同。B
位 9IMAGE_FILE_DEBUG_STRIPPED(调试信息被剥离文件)表示如果文件中没有调试信息,此位置
1。此位可执行文件不用。按照其它信息([6])(这里指的是参考书目中的第[6]种----译者注),此位被称作
“恒定”,并且当一个映象文件只有在被装入优先的装入地址才能运行(亦即:此文件不可重定位)时,此
位置 1。B
位 10IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP(移动介质文件从交换文件运行)表示如果一个
应用程序不可以从可移动的介质,如软盘或 CD-ROM 上运行时,此位置 1。在这种情况下,建议操作系统
将文件复制到交换文件并从那里执行。B
位 11IMAGE_FILE_NET_RUN_FROM_SWAP(网络文件从交换文件运行)表示如果一个应用程序不可
以从网络上运行时,此位置 1。在这种情况下,建议操作系统将文件复制到交换文件并从那里执行。B
位 12IMAGE_FILE_SYSTEM(系统文件)表示如果文件是一个象驱动程序那样的系统文件,此位置 1。
此位可执行文件不用;我所见过的所有 NT 系统的驱动程序也不用。B
位 13IMAGE_FILE_DLL(DLL 文件)表示如果文件是一个 DLL 文件时,此位置 1。B
位 14IMAGE_FILE_UP_SYSTEM_ONLY(仅但处理器系统的文件)表示如果文件不设计运行在多处理
器系统上(也就是说,因为此文件严格地依赖单一处理器的一些方式工作,所以它会发生冲突)时,此位
置 1。B
五、相对虚拟地址(RelativeVirtualAddresses)B
---------------------------------------------
剩余42页未读,继续阅读
资源评论
- jfztaq2012-10-28还可以,挺详细的
negip2009
- 粉丝: 29
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功