这一章的上半部分大体介绍了下PE文件头,下半部分是详细介绍里面的内容,这一章一定要多读几遍,好好记记基础概念和知识,方便之后的学习。
简单回忆一下:
3.4.1 DOS MZ头
IMAGE_DOS_HEADER
DOS MZ头的下面是DOSS Stub。整个DOSS Stub是一个字节块,其内容随着链接时使用的连接器不同而不同,PE中没有与之对应的相关结构。
紧跟在DOS Stub后面的是PE头标识Signature。与大部分分支文件格式的头部结构一样,PE头部信息中有一个四字节的标识,该标识位于指针IMAGE_DOS_HEANDER.e_lfanew指向的位置。其内容固定,对应于ASCII码的字符串”PE\0\0”
标准PE头IMAGE_FILE_HEADER紧跟在PE头标识后,即位于IMAGE_DOS_HEADER的e_lfanew值+4的位置。由此位置开始的20个字节为数据结构标准PE头IMAGE_FILE_HEANDER的内容。该结构在微软的官方文档中被称为标准通用对象文件格式(Common
Object File Format,COFF)头,它记录了PE文件的全局属性,该PE文件运行的平台、PE文件类型(是EXE还是DLL文件)、文件中存在的节的总数,其详细定义如下:
该结构常用于判断PE文件是EXE还是DLL类型,不但可以通过该结构得到PE文件中节的数量,还可以当成对接信息进行遍历操作时的循环次数。
尽管从名字上看好像该部分数据是可选的,但在PE文件结构中,它却有着比标准PE头更多的内容。详细定义如下:
文件执行时的入口地址、文件被操作系统装入内存后的默认基地址,以及节在磁盘和内存中的对齐单位等信息均可以在此结构中找到。对于该结构中的某些数值的随意改动可能造成对PE文件的加载或运行失败。
这个结构是广义上的PE头,在标准的PE文件中器大小为456个字节。它是3.4.2节、3.4.3节和3.3.4节中提到的三个数据结构的组合,即
IMAGE_NT_HEADERS=4个字节的PE标识 +
IMAGE_FILE_HEADER +IMAGE_OPTIONAL_HEADER32:
该结构定义如下(汇编):
IMAGE_NT_HEADERS STRUCT
Signature DWORD ? ;0000h -PE文件标识,”PE\0\0”
FileHeader IMAGE_FILE_HEADER <> ;0004h -PE标准头
OptionalHeader IMAGE_OPTIONAL_HEADER32<>;0018h -PE扩展头
IMAGE_NT_HEADERS ENDS
IMAGE_OPTIONAL_HEADER32(扩展PE头)结构的最后一个字段位DataDirectory。
该字段定义了PE文件中出现的所有不同类型的目录信息。如前所述,应用程序中的数据被按照用途分成很多种类,如导入表、导出表、资源、重定位表等。在内存中,这些数据被操作系统以页位单位组织起来,并赋以不同的访问属性;在文件中,这些数据也同样被组织起来,按照不同的类别分别放在文件的指定位置。该结构就是用来描述这些不同类别的数据在文件(和内存)中的位置及大小的,因为这个字段比较重要。
从Windows NT 3.1
操作系统开始到现在,该数据目录中定义的数据类型一直是16种。PE中使用了一种称作“数据目录项IMAGE_DATA_DIRECTORY”的数据结构来定义每种数据。该结构只有两个字段,结构具体定义如下:
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress DWORD ? ;000h -
数据其实RVA
isize DWORD ? ;004h -
数据块的长度
IMAGE_DATA_DIRECTORY ENDS
两个字段依次为VirtualAddress
和 isize。如图3-11所示,总的数据目录一共由16个相同的IMAGE_DATA_DIRECTORY结构连续排列在一起组成。
这16个元组的没组每一项均代表PE中的某一个类型的数据,各数据类型详见表3-1。
如果想在PE文件中寻找特定类型的数据,就需要从该结构开始。比如,要想查看PE中都调用了哪些动态间接库的函数,则需要从数据目录表的第2个元素的IMAGE_DATA_DIRECTORY结构获取导入表在文件中的起始位置和大小,然后再根据VirtualAddress_1地址指向的位置找到导入表相关的字节码。这种信息组织方式正式本章开始的“头部+身体”的数据组织方式。
下面是这16个数据目录项依次展开后的新结构:
PE头IMAGE_NT_HEADERS后面紧跟着节表。它由许多节表项(IMAGE_SECTION_HEADER)组成,每个节表项纪录了PE中与某个特定节有关的信息,如节的属性、节的大小、在文件和内存中的起始位置等。节表中节的数量有字段IMAGE_FILE_HEADER.NumberOfSections来定义。
节表项的数据结构详细定义如下:
节表后面就是节的内容。截至节表,PE文件头设计的所有数据结构已经全部介绍完毕。接下来,集中对以上所有数据结构中每个字段进行详细介绍。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章