探索黑客技术攻防,实战研究与安全创新

导航菜单

PE系列之PE文件结构全貌

Windows下的可执行程序有着复杂的文件结构,同样PE结构是由若干个复杂的结构体组合而成的,不单单是一个结构体那么简单,就像磁盘结构体一样,磁盘结构同样是非常多的结构体组成的,PE结构包含的结构体有DOS头,PE标识,文件头,可选头,目录结构,节表等,要掌握PE结构,必须对PE结构有一个整体上的认识,要知道PE结构分为哪些部分,这些部分大概是起到什么作用的,有了宏观赏的概念以后,就可以深入PE结构的各个结构体进行细致的学习了,下面给出一张图,让大家对PE结构有一个大概的了解,如图4-1所示。

图片1.png

从图中可以看到,在PE文件中,真正包含代码和数据的部分是节表数据,节表数据以上的部分都是PE文件结构。

下面根据这个图给大家介绍PE文件结构的各个结构体,介绍完以后在写一个PE结构的解释器,这里不会介绍PE结构中的每个结构,只针对常用的和相对重要的结构体进行介绍。

MZ头部

MZ头部其实是一个DOS头部,由于其开始处的字符为MZ,因此叫做MZ头,也可以叫做DOS头,看个人习惯了,该部分用于在DOS下加载可执行程序,是用IMAGE_DOS_HEADER来定义的。

DOS残留是一段简单的程序,主要用于输出“This program cannot berun in dosmode”类似的字符串。

为什么PE结构的最开始位置,有这样一段DOS头部呢?关键是为了该可执行程序可以兼容DOS系统,通常情况下,Win32下的PE程序只是简单的输出一段字符串,提示不能运行于DOS系统下,但是这个DOS程序是可以在程序连接时修改的,不过由于不常使用也就不进行介绍了。

PE头部

PE头部保存Windows系统加载可执行文件的重要信息,PE头部由IMAGE_NT_HEADERS来定义,通过该结构体的定义可以看出,IMAGE_NT_HEADERS是由多个结构体组合而成的,具体内容将在后面进行介绍,PE头部在PE文件中的位置是不确定的,PE头部的位置由DOS头部的某个字段给出的。

节表数据

真正的程序部分就保存在节数据中。节名称最大长度为8个字节,大于8个字节将截取,节的划分是根据各组数据的属性划分,每个节拥有共同你属性。