PE文件结构与ELF文件结构

发布 2019-07-16 13:49:20 阅读 4990

一、 pe文件结构。

pe文件被称为可移植的执行体是portable execute的全称,常见的exe、dll、ocx、sys、com都是pe文件,pe文件是微软windows操作系统上的程序文件(可能是间接被执行,如dll),portable 是指对于不同的windows版本和不同的cpu类型上pe文件的格式是一样的,当然cpu不一样了,cpu指令的二进制编码是不一样的。只是文件中各种东西的布局是一样的。

在下面关于结构的定义中,word 表示变量大小为2个字节,dword表示变量大小是4个字节。

1.1 pe文件的结构。

pe文件有着固定的结构,分为五个部分,如下:

1:dos mz header(dos文件头) 一个image_dos_header结构,大小为64字节。

2:dos stub(dos加载模块) 没有固定大小。

3:pe header(pe文件头)一个image_nt_headers结构,大小为节。

4:section table(节表)一个image_section_header结构数组,数组大小依据节而定,如果pe文件有5个节,则数组大小为5。

5:sections(节或段)没有固定大小,可以有多个节。

1.2 dos文件头和dos加载模块。

pe文件的一二部分完全是为了程序能在dos运行下时给出一个提示。 image_dos_header结构的定义如下:

typedef struct image_dos_header{

word e_magic; /魔术数字

word e_cblp;//文件最后页的字节数

word e_cp;//文件页数

word e_crlc; /重定义元素个数

word e_cparhdr; /头部尺寸,以段落为单位

word e_minalloc; /所需的最小附加段

word e_maxalloc; /所需的最大附加段

word e_ss;//初始的ss值(相对偏移量)

word e_sp;//初始的sp值。

word e_csum;//校验和。

word e_ip;//初始的ip值。

word e_cs;//初始的cs值(相对偏移量)

word e_lfarlc;//重分配表文件地址。

word e_ovno;//覆盖号。

word e_res[4];/保留字。

word e_oemid; /oem标识符(相对e_oeminfo)

word e_oeminfo; /oem信息。

word e_res2[10]; 保留字。

long e_lfanew;//新exe头部的文件地址。

image_dos_header, *pimage_dos_header;

dos文件头和dos加载模块在 windows下几乎已经没有什么作用了。只要了解image_dos_header里的e_lfanew成员(偏移61h~63h),这个成员指明了 image_nt_headers(pe文件头)在pe文件中的偏移量(位置)。

1.3 pe文件头。

pe文件头是一个image_dos_header结构,该结构定义及成员意义如下:

typedef struct image_nt_headers{

dwoed signature; /文件头标志:"pe\0\0",占4字节。

mage_file_header fileheader; /文件物理分布的信息,占20字节。

image_optional_header32 optionalheader; /pe文件逻辑分布的信息,占节。

image_nt_headers32, *pimage_nt_headers32;

在这个结构中,又有两个结构,即mage_file_header结构类型与image_optional_header32结构类型,这两个结构的定义如下:

先是说 struct mage_file_header的定义及成员意义:

typedef struct mage_file_header{

word machine;//表示该程序要执行的环境及平台,0x14c表示intel 80386处理器以上 0x014d表示intel 80486 处理器以上。

wordnumberofsections;//指明pe文件最后一部分有多少个节,同时也指明了pe文件第四部分数组的大小。

dword timedatestamp;//文件建立的时间。

dword pointertosymboltable;//用在调试信息中,用途不太明确,不过它们的值总为0。

dword numberofsymbols;//用在调试信息中,用途不太明确,不过它们的值总为0。

wordsizeofoptionalheader;//可选头的长度,即sizeof( image_optional_header),可以用它来检验pe文件的正确性。

wordcharacteristics;//是一个标志的集合,其大部分位用于obj文件或lib文件中。(obj文件既是目标文件,一般是程序编译后的二进制文件,再通过链接器和资源文件链接就成exe文件了。obj文件只给出了程序的相对地址;)

image_file_header, *pimage_file_header;

下面是struct image_optional_header32结构的定义及成员意义:

typedef struct image_optional_header32{

word magic;//值是0x010b或者267,作用未知。

byte majorlinkerversion;

byte minorlinkerversion;//这两个变量是链接器的版本号,随windowswindow nt build 438配套的windows nt sdk包含的链接器版本是2.39(十六进制为2.27)。

dwordsizeofcode;//可执行**的长度。

dwordsizeofinitializeddata;//初始化数据的长度(数据段)

dwordsizeofuninitializeddata;//未初始化数据的长度(bss段)

dword addressofentrypoint;//**的入口rva地址,应用程序从这儿开始执行,常称为程序的原入口点oep(original entry point)

dword baseofcode;//可执行**起始位置。

dword baseofdata;//初始化数据起始位。

*以上的部分是该结构的标准域,所谓标准域,就是和unix可执行文件的coff格式所公共的部分,下面部分的成员是属于附加域*/

dword imagebase;//载入程序首选的rva地址。

dword sectionalignment;//规定了装载到内存时段能够占据的最小空间数量——就是说,段是关于sectionalignment对齐的。

dword filealignment;//段在文件中的对齐方式。

wordmajoroperatingsystemversion; /操作系统主版本号, 通常对windows nt 1.0而言,这个值被设为1。

woed minoroperatingsystemversion; /操作系统次版本号,通常对windows nt 1.0而言,这个值被设为0。

word majorimageversion; /应用程序主版本号。

word minorimageversion; /应用程序次版本号。

word majorsubsystemversion; /表示windows nt win32子系统主版本号。

word minorsubsystemversion; /表示windows nt win32子系统的次版本号。

dword win32versionvalue;//这个值总是为0

dword sizeofimage;//程序调入后占用内存大小(字节),等于所有段的长度之和。

dword sizeofheaders;//所有文件头长度之和,它等于从文件开始到第一个段的原始数据之间的大小。包括ms-dos头部、pe文件头部、pe可选头部以及pe段头部。文件中所有的段实体就开始于这个位置。

dword checksum;//校验和,仅用在驱动程序中, 用来在装载时验证可执行文件的。

word subsystem; /一个标明可执行文件所期望的子系统的枚举值。

word dllcharacteristics;//dll状态, 用来表示一个dll映像是否为进程和线程的初始化及终止包含入口点的标记。

dword sizeofstackreserve; /保留堆栈大小。

dword sizeofstackcommit; /启动后实际申请的堆栈数,可随实际情况变大。

dword sizeofheapreserve;//保留堆大小。

dword sizeofheapcommit;//实际堆大小。

dword loaderflags;//告知装载器是否在装载时中止和调试,或者默认地正常运行。

dword numberofrvaandsizes;//下面的目录表入口个数,struct image_data_directory

datadirectory[image_numberof_directory_entries];/目录表入口 , 当前的pe文件格式定义了16种可能的数据目录,这之中的11种现在在使用中。

image_optional_header, *pimage_optional_header;

然后是struct image_data_directory这一结构的具体内容:

typedef struct image_data_directory{

dword virtualaddress; /起始rva地址。

dword size;//长度。

image_data_directory, *pimage_data_directory;

上面说明了第三个头——pe文件头的结构,下面说第四部分section table(节表)部分。

总分总结构作文 总结文件

总分汇总报告构作文 雨水带来的天空是灰色,是阴沉的色调。我眯起眼睛仰望天空,看不到一丝的生机。灰灰的天幕也只有在滴滴哒哒落下雨水的衬托下,才能显示出一丝的生气。像一个正在发脾气的孩子一样,雨中的天空有着几多的神秘,天空中云层浓厚,根本看不到深处,看不到它那本来明亮透彻的眼睛。门口的那几棵桃树已经开花...

钢结构工程投标文件完整范本

沧州隆泰迪科技管道 钢结构车间工程施工招标。投。标。书 项目名称 沧州隆泰迪科技管道 投标人 庆云鑫达彩钢钢结构工程 投标文件内容 投标函 商务标部分 技术标部分。日期 二o一三年十月三十一日。一 前言。二 投标函部分。三 企业相关证明复印件及简介。1 企业营业执照。2 企业组织机构 证。3 企业税...

钢结构课程设计节点文件

轻钢门式刚架施工图设计设计时间 8 10 2010 高强度螺栓计算方法 采用方法2,假定中和轴在端板形心。节点设计结果 施工图总剖面数 7当前剖面归并号 1 梁柱连接节点 节点号 1梁端与柱刚接连接。连接构件号 柱1,梁1节点连接形式 1 内力设计值 弯矩m 114.493 剪力v 40.317 k...