PE文件结构与ELF文件结构

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、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结构,大小为248字节。

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文件逻辑分布的信息,占224字节

} 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 处理器以上

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

DWORD TimeDateStamp;//文件建立的时间

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

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

WORD SizeOfOptionalHeader;//可选头的长度,即sizeof ( IMAGE_OPTIONAL_HEADER),可以用它来检验PE文件的正确性

WORD Characteristics;//是一个标志的集合,其大部分位用于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)。

DWORD SizeOfCode; //可执行代码的长度

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

相关文档
最新文档