admin管理员组

文章数量:1532209

2024年6月23日发(作者:)

PE文件格式详解

(一) 基础知识

什么是PE文件格式:

我们知道所有文件都是一些连续(当然实际存储在磁盘上的时候不一定是连续的)的数据组织

起来的,不同类型的文件肯定组织形式也各不相同;PE文件格式便是一种文件组织形式,它是32

位Window系统中的可执行文件EXE以及动态连接库文件DLL的组织形式。为什么我们双击一个

EXE文件之后它就会被Window运行,而我们双击一个DOC文件就会被Word打开并显示其中的

内容;这说明文件中肯定除了存在那些文件的主体内容(比如EXE文件中的代码,数据等,DOC

文件中的文件内容等)之外还存在其他一些重要的信息。这些信息是给文件的使用者看的,比如说

EXE文件的使用者就是Window,而DOC文件的使用者就是Word。Window可以根据这些信息知

道把文件加载到地址空间的那个位置,知道从哪个地址开始执行;加载到内存后如何修正一些指令

中的地址等等。那么PE文件中的这些重要信息都是由谁加入的呢?是由编译器和连接器完成的,

针对不同的编译器和连接器通常会提供不同的选项让我们在编译和联结生成PE文件的时候对其中

的那些Window需要的信息进行设定;当然也可以按照默认的方式编译连接生成Window中默认的

信息。例如:WindowNT默认的程序加载基址是0x40000;你可以在用VC连接生成EXE文件的

时候使用选项更改这个地址值。在不同的操作系统中可执行文件的格式是不同的,比如在Linux上

就有一种流行的ELF格式;当然它是由在Linux上的编译器和连接器生成的,所以编译器、连接器

是针对不同的CPU架构和不同的操作系统而涉及出来的。在嵌入式领域中我们经常提到交叉编译

器一词,它的作用就是在一种平台下编译出能在另一个平台下运行的程序;例如,我们可以使用交

叉编译器在跑Linux的X86机器上编译出能在Arm上运行的程序。

程序是如何运行起来的:

一个程序从编写出来到运行一共需要那些工具,他们都对程序作了些什么呢?里面都涉及哪些

知识需要学习呢?先说工具:编辑器-》编译器-》连接器-》加载器;首先我们使用编辑器编辑

源文件;然后使用编译器编译程目标文件OBJ,这里面涉及到编译原理的知识;连接器把OBJ文

件和其他一些库文件和资源文件连接起来生成EXE文件,这里面涉及到不同的连接器的知识,连

接器根据OS的需要生成EXE文件保存着磁盘上;当我们运行EXE文件的时候有Window的加载

器负责把EXE文件加载到线性地址空间,加载的时候便是根据上一节中说到的PE文件格式中的哪

些重要信息。然后生成一个进程,如果进程中涉及到多个线程还要生成一个主线程;此后进程便开

始运行;这里面涉及的东西很多,包括:PE文件格式的内容;内存管理(CPU内存管理的硬件环

境以及在此基础上的OS内存管理方式);模块,进程,线程的知识;只有把这些都弄清楚之后才

能比较清楚的了解这整个过程。下面就让我们先来学习PE文件格式吧。

PE文件的总体结构:

下图便是PE文件的一个总体结构:注意,图2是在图1的基础上进一步细化了,不过图2的

顺序是从下向上代表文件的从头到尾的顺序。

DOS MZ Header

DOS stub

PE header

Section table

Section 1

Section 2

Section ...

Section n

图一

图二

我们的EXE文件在磁盘上就是按照上面的格式顺序存储的,当运行的时候它就很容易被加载

器加载到线性地址空间;但是在线性空间中和在磁盘上不同,在线性空间中各个部分不一定是占据

连续的线性地址空间。下面对PE文件格式的介绍就按照上图中对从头到尾对每个部分进行介绍。

好的,今天刚去医院回来有些累了,就先写到这儿吧。

嗯,不行,还有几个重要而又基础的概念需要在这儿先澄清一下,否则后面就会出乱子了。

几个重要的基本概念:

1)节:PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数

据,比如代码/数据、读/写等。我们可以把PE文件想象成一逻辑磁盘,PE header 是磁盘的boot

扇区,而sections就是各种文件,每种文件自然就有不同属性如只读、系统、隐藏、文档等等。

值得我们注意的是 ---- 节的划分是基于各组数据的共同属性: 而不是逻辑概念。重要的不是数据/

代码是如何使用的,如果PE文件中的数据/代码拥有相同属性,它们就能被归入同一节中。不必关

本文标签: 文件编译生成需要加载