windows内核基础5—PE文件格式
PE文件的框架结构

PE的基本概念:
pe文件使用的是一个平面地址空间,所有代码和数据合并在一起,组成了一个很大的结构.文件的内容被分割为不同的区块(Section,又称区段,节等,)区块中包含代码或数据,各个区块按页边界对齐.区块没有大小限制,是一个连续结构.每个块都有它自己在内存中的一套属性,例如这个块是否包含代码\是否只读或可读.
认识到PE文件不是作为单一内存映射文件被载入内存是很重要的.Windows加载器(又称PE装载器)遍历PE文件并决定文件的哪一部分被映射,这种映射方式是将文件较高的偏移位置映射到较高的内存地址中.磁盘文件一旦被载入内存,磁盘上的数据结构布局和内存中的数据结构布局就是一致的.这样,如果在磁盘的数据结构中寻找一些内容,那么几乎都能在被载入的内存映射文件中找到相同的信息,但数据之间的相对位置可能会改变,某项的偏移地址可能区别于原始的偏移位置.
基地址
当PE文件通过Windows加载器载入内存后,内存中的版本称为模块。映射文件的起始地址称为模块句柄,可以通过模块句柄访问内存中的其他数据结构。这个初始内存地址也称为基地址。准确的说,对于WindowsCE,这是不成立的,一个模块句柄在windowsCE下并不等同于安装的起始地址。

内存中的模块代表进程将这个可执行文件所需要的代码、数据、资源、输入表、输出表及其他有用的数据结构所使用的内存都放在一个连续的内存块中,程序员只要知道装载程序文件映像到内存后的基地址即可。
PE文件各部分的作用:
(1)dos头
dos头分为两部分,分别是“MZ”头部和“dos存根”,MZ头部是真正的头部,由于其起始处的两字节为“MZ",所以通常称之为MZ头部。该头部用于在dos操作系统中加载程序,它的结构被定义为IMAGE_DOS_HEADER。
因为如今win32下的PE程序是不能在dos下运行的,因此保留了dos存根。
(2)PE 头
PE头保存着windows操作系统加载可执行文件的重要信息,PE头由IMAGE_NT_HEADERS定义,从该结构体定义的名称可以看出,IMAGE_NT_HEADERS是由多个结构体组成的。
(3)节表
程序的结构体按照各自属性的不同而保存在不同的节中,在PE头之后就是一个结构体数组构成的节表。节表中描述了各个节在整个文件中的位置与加载入内存后的位置,同时定义了节的属性(只读、可读写、可执行等)。
(4)节表数据
可执行文件中的真正程序代码部分保存在节表数据中,当然,数据、资源等内容也保存在节表数据
与PE文件格式相关的3种地址。
VA(虚拟地址):PE文件被windows加载到内存后的地址
RAV(相对虚拟地址):PE文件虚拟地址相对于映射基地址的偏移地址
FOA (文件偏移地址):相对于PE文件在磁盘中文件开头的偏移地址;

浙公网安备 33010602011771号