没有合适的资源?快使用搜索试试~ 我知道了~
首页windows PE文件结构
资源详情
资源评论
资源推荐
文件结构一
转自看雪学院
学习 的工具
!"!#
刚注册好像不能上传附件
一、前言($)
(“%&'%(,可移植的可执行文件)文件格式,是微软
)*+,-)* 和 )* 子集①中的可执行的二进制文件的格
式;在 )*+, 中,驱动程序也是这种格式。它还能被应用于各种目标文
件②和库文件中。
这种文件格式是由微软设计的,并于 . 年被 ,/0(%*$
*-工具接口标准)委员会(由
1$-/*%-2%*-)-/21-等等组成)所批准,它明显的基于
3455 文件格式的许多知识。3455(“*67%$(-通用目
标文件格式)是应用于好几种 8+/9 系统③和 :10; 系统中的目标文件和可执
行文件的格式。
)*0<=> 中包含一个名叫?**@的头文件,其中含有很多用于
格式的A7* 和 $ 定义。我将逐步地提到其中的很多结构成员名字和
A7* 定义。
你也可能发现 <BB 文件“C%%%(很有用途,它是 )*+, 的一部
分,但其书面文件却很缺乏。它的一些功用在“<D%+E((开发
者网络)中有所描述。
二、总览(F*%B')
在一个 文件的开始处,我们会看到一个 10<40 可执行体(英语叫“'(-
意为“根,存根”);它使任何 文件都是一个有效的 10<40 可执行文件。
在 <40根之后是一个 位的签名以及魔数 &#
/1GFH+,H0/F+G,8I(意为“+, 签名”,也就是 签名;十六进制数
# 和 分别代表 G03// 码字母 和 译者注)。
之后是文件头(按 3455 格式),用来说明该二进制文件将运行在何种机器之
上、分几个区段、链接的时间、是可执行文件还是 <BB、等等。(本文中可执
行文件和 <BB 文件的区别在于:<BB 文件不能被启动,但能被别的二进制文件
使用,而一个二进制文件则不能链接到另一个可执行文件。)
那些之后,是可选头(尽管它一直都存在,却仍被称作“可选”因为 3455 文
件格式仅为库文件使用一个“可选头”,却不为目标文件使用一个“可选头”,这就
是为什么它被称为“可选”的原因)。它会告诉我们该二进制文件怎样被载入的
更多信息:开始的地址呀、保留的堆栈数呀、数据段的大小呀、等等。
可选头的一个有趣的部分是尾部的“数据目录”数组;这些目录包含许多指向各
“节”数据的指针。例如:如果一个二进制文件拥有一个输出目录,那么你就会
在数组成员“/1GFH</I3,4IJH+,IJH94I,((输出目录项)中找到
一个指向那个目录的指针,而该指针指向文件中的某节。
跟在各种头后面我们就发现各个“节”了,它们都由“节头”引导。本质上讲,各节
中的内容才是你执行一个程序真正需要的东西,所有头和目录这些东西只是为
了帮助你找到它们。
每节都含有和对齐、包含什么样的数据(如“已初始化数据”等等)、是否能共
享等有关的一些标记,还有就是数据本身。大多数(并非所有)节都含有一个
或多个可通过可选头的“数据目录”数组中的项来参见的目录,如输出函数目录
和基址重定位目录等。无目录形式的内容有:例如“可执行代码”或“已初始化数
据”等。
KKKKLL
KKKKM<40'KKKKKKKKKKMKKKK<40头
KKKKLL
KKKKM7%KKKKKKKMKKKK文件头
KKKKLL
KKKKM*%KKKMKKKK可选头
KKKKMM
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKMKKMKKKK数据目录
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKLL
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKM*KKKMKKKKK节头
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKLL
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKM*.KKKKKKKKKMKKKKK节 .
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKLL
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKM*KKKKKKKKKMKKKKK节
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKLL
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKMKKKKKKKKKKKKKKKM
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKLL
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKM**KKKKKKKKKMKKKKK节 *
KKKKMKKKKKKKKKKKKKKKKKKKM
KKKKLL
三、<40根和签名(<40'*0C*')
<40根的概念很早从 . 位 * 的可执行文件(当时是“+(格式⑥)时
就广为人知了。根原来是用于 40N 系统的可执行文件的,也用于自解压档
案文件和其它的应用程序。对于 文件来说,它是一个总是由大约 . 个字
节所组成的和 10<40 兼容的可执行体,用来输出象“C
**+,(之类的错误信息。
你可以通过确认 <40头部分是否为一个 /1GFH<40HOG<I(<40 头)
结构来认出 <40根,它的前两个字节必须为连续的两个字母“1P((有一个
A7*/1GFH<40H0/F+G,8I 的定义是针对这个 )4I< 单元的)。
你可以通过跟在后面的签名来将一个 二进制文件和其它含有根的二进制文
件区分开来,跟在后面的签名可由头成员QH%$*Q(它是从字节偏移地址
处开始的,有 字节长)所设定的偏移地址找到。对于 40 系统和
)* 系统的二进制文件来说,签名是一个 . 位的 单元;对于
文件来说,它是一个按照 位字节边界对齐的 位的 %*C 单元,并且
/1GFH+,H0/F+G,8I(+, 签名)的值已由A7* 定义为
&#(即字母“(译者)。
四、文件头(5%O)
要到达 /1GFH5/BHOG<I(文件头)结构,请先确认 <40头“1P((起
始的 个字节),然后找出 <40根的头部的成员“H%$*(,并从文件开始
处跳过那么多的字节。在核实你在那里找到的签名
后,/1GFH5/BHOG<I(文件头)结构的文件头就紧跟其后开始了,下面
我们将从头至尾的介绍其成员。
.)第一个成员是“1*(机器)”,一个 . 位的值,用来指出该二进制文
件预定运行于什么样的系统。已知的合法的值有:
KKKKK/1GFH5/BH1G3O/+H/&.#
KKKKKKKKKKKK/*%处理器或更高
KKKKK&.#
KKKKKKKKKKKK/*%处理器或更高
KKKKK&.#
KKKKKKKKKKKK/*%处理器或更高
KKKKK&.KKKKKKKKKK
KKKKKKKKKKKKKI1/0R处理器,大尾⑨
KKKKK/1GFH5/BH1G3O/+HI&.
KKKKKKKKKKKKKI1/0处理器,小尾
KKKKK/1GFH5/BH1G3O/+HI#&.
KKKKKKKKKKKKKI#1/0处理器,小尾
KKKKK/1GFH5/BH1G3O/+HI.&.
KKKKKKKKKKKKKI.1/0处理器,小尾
KKKKK/1GFH5/BH1G3O/+HGBOG&.#
KKKKKKKKKKKKK<3G%G9S 处理器
KKKKK/1GFH5/BH1G3O/+H4)I3&.5
KKKKKKKKKKKKK/213-小尾
)然后是“+'4$0*(节数)”成员,. 位的值。它是紧跟在头后
面的节的数目。我们以后将讨论节的问题。
)下一个成员是时间戳“,<0(( 位),用来给出文件建立的
时间。即使它的“官方”版本号没有改变,你也可通过这个值来区分同一个文件
的不同版本。(除了同一个文件的不同版本之间必须唯一,时间戳的格式没有
明文规定,但似乎是按照 8,3 时间“从 .T 年 . 月 . 日 算起的秒
数值”也就是大多数 3 语言编译器给 H 标志使用的格式。)
这个时间戳是用来绑定各个输入目录的,我们稍后再讨论它。
警告:有一些链接器往往将时间戳设为荒唐的值,而不是如前所述的 H
格式的链接时间。
#)成员“*,0%,%(符号表指针)”和成员
“+'4$0%(符号数)”(都是 位)都用于调试信息的。我不知
道该怎样去解读它,并且我发现该指针的值总为 。
)成员“0U4$4*%O(可选头大小)”(. 位)只是
“/1GFH4,/4+GBHOG<I(可选头)”项的大小,你能用它去验证 文
件结构的正确性。
T)成员“3(特性)”是一个 . 位的,由许多标志位形成的集合
组成,但大多数标志位只对目标文件和库文件有效。具体如下:
KKKK位 /1GFH5/BHIB430H0,I/<(重定位被剥离文件) 表示如果
文件中没有重定位信息,该位置 .,这就表明各节的重定位信息都在它们各自
的节中;可执行文件不使用该位,它们的重定位信息放在下面将要描述的
“%*((基址重定位)目录中。
KKKK位 ./1GFH5/BH938,G2BH/1GF(可执行映象文件) 表示如果
文件是一个可执行文件,也即不是目标文件或者库文件时,置 .。如果链接器
尝试创建一个可执行文件,却因为一些原因失败了,并保存映像以便下次例如
增量链接时使用,此时此标志位也可能置 .。
KKKK位 /1GFH5/BHB/+H+810H0,I/<(行数被剥离文件) 表示如果
行数信息被剥除,此位置 .;此位也不用于可执行文件。
KKKK位 /1GFH5/BHB43GBH0J10H0,I/<(本地符号被剥离文件) 表
示如果文件中没有关于本地符号的信息时,此位置 .(此位也不用于可执行文
件)。
KKKK位 #/1GFH5/BHGFFI0/:H)0H,I/1(强行工作集修剪文件) 表示
如果操作系统被假定为:通过将正在运行的进程(它所使用的内存数量)强行
的页清除来修剪它的工作集时,此位置 .。如果一进程是大部分时间处于等
待,且一天中仅被唤醒一次的演示性的应用程序之类时,此位也应该被置 .。
KKKK
KKKK位 T/1GFH5/BH2J,0HI:I0<HB4(低字节变换文件)和 位
./1GFH5/BH2J,0HI:I0<HO/(高字节变换文件) 表示如果一文件
的字节序不是机器所预期的形式,因此它在读入前必须调换字节时,此位置
.。这样做对可执行文件是不可靠的(操作系统期望可执行文件都已经被正确
地按字节排整齐了)。
KKKK位 /1GFH5/BH2/,H1G3O/+( 位机器文件) 表示如果使用的
机器被期望为 位的机器时,此位置 .。现在的应用程序总将此位置 .;+,
系统可能工作不同。
剩余49页未读,继续阅读
sangchengjiang
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- 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
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0