3.4.7 数据目录项——IMAGE_DATA_DIRECTORY
IMAGE OPTIONAL HEADER32(扩展PE头)结构的最后一个字段为DataDirectory。
该字段定义了PE文件中出现的所有不同类型的数据的目录信息
。
如前所述,应用程序中的数据被按照用途分成很多种类:
- 导出表、
- 导入表、
- 资源、
- 重定位表等。
在内存中,这些数据被操作系统以页为单位组织起来,并赋以不同的访问属性;
在文件中,这些数据也同样被组织起来,按照不同类别分别存放在文件的指定位置。
作用
:该结构就是用来描述这些不同类别的数据在文件(和内存)中的位置及大小的
,因为这个字段比较重要
从Windows NT3.1操作系统开始到现在,该数据目录中定义的数据类型一直是16
种。
PE中使用了一种称作“数据目录项——IMAGE DATA DIRECTORY”的数据结构来定义每种数据。
该结构只有两个字段,结构具体定义如下:
Windows c++中:
typedef struct _IMAGE_DATA_DIRECTORY { DWORD VirtualAddress; DWORD Size; } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
两个字段依次为VirtualAddress和isize。
如图所示,总的数据目录一共由16个相同的IMAGE DATA DIRECTORY结构连续排列在一起组成。
在Windows头文件winnt.h中 属于拓展PE头结构体IMAGE_OPTIONAL_HEADER
的成员DataDirectory
:
这16个元组的数组每一项均代表PE中的某一个类型的数据:
如果想在PE文件中寻找特定类型的数据,就需要从该结构开始。
比如:
要想查看PE中都调用了哪些动态链接库的函数?
则需要从数据目录表的第2个元素(数组编号为1)的IMAGE DATA DIRECTORY结构 获取导入表在文件中的起始位置和大小,然后再根据VirtualAddress地址指向的位置找到导入表相关的字节码。
这种信息组织方式正是本章最开始介绍的“头部+身体”的数据组织方式。
3.4.8 节表项——IMAGE_SECTION_HEADER
PE头IMAGE NT HEADERS后紧跟着节表。
它由许多个节表项(IMAGE SECTION HEADER
)组成,每个节表项记录了PE中与某个特定的节有关的信息,如节的属性、节的大小、在文件和内存中的起始位置等。
节表中节的数量由字段IMAGE FILE HEADER, NumberOfSections来定义。节表项的数据结构详细定义如下:
Windows 头文件winnt.h中IMAGE_SECTION_HEADER
结构体:
节表后面就是节的内容。截至节表,PE文件头部涉及的所有数据结构已经全部介绍完毕。
3.5 数据结构字段详解
3.5.1 PE头——IMAGE_NT_HEADER的字段
1.IMAGE_NT_HEADER.Signature
2.IMAGE_NT_HEADER.FileHeader
3.IMAGE_NT_HEADER.OptionalHeader
3.5.2 标准PE头——IAMGE_FILE_HEADER的字段
4.IMAGE_FILE_HEADER.Machine
5 IMAGE_FILE_HEADER.NumberOfSections
6.IMAGE_FILE_HEADER.TimeDateStamp
7.IMAGE_FILE_HEADER.PointerToSymbolTable
8.IMAGE_FILE_HEADER.NumberOfSymbols
9.IMAGE_FILE_HEADER.SizeOfOptionalHeader
10.IMAGE FILE HEADER.Characteristics
3.5.3 扩展PE头——IMAGE_OPTIONAL_HEADER32的字段
11.IMAGE OPTIONAL HEADER32.Magic
12.IMAGE OPTIONAL HEADER32.MajorLinkerVersion
13.IMAGE OPTIONAL HEADER32.MinorLinkerVersion
14.IMAGE OPTIONAL HEADER32.SizeOfCode
15.IMAGE OPTIONAL HEADER32.SizeOflnitializedData
16.IMAGE_OPTIONAL_HEADER32.SizeOfUninitializedData
17.IMAGE OPTIONAL HEADER32.AddressOfEntryPoint
18.IMAGE OPTIONAL HEADER32.BaseOfCode
19.IMAGE OPTIONAL HEADER32.BaseOfData
20.IMAGE OPTIONAL HEADER32.ImageBase
21.IMAGE OPTIONAL_HEADER32.SectionAlignment
22.IMAGE OPTIONAL HEADER32.FileAlignment
23.IMAGE OPTIONAL HEADER32.MajorOperatingSystemVersion
24.IMAGE OPTIONAL HEADER32.MinorOperatingSystemVersion
25.IMAGE_OPTIONAL_HEADER32.MajorlmageVersion
26.IMAGE OPTIONAL HEADER32.MinorlmageVersion
27.IMAGE OPTIONAL HEADER32.MajorSubsystemVersion
28.IMAGE OPTIONAL HEADER32.MinorSubsystemVersion
29.IMAGE_OPTIONAL_HEADER32.Win32VersionValue
30.IMAGE OPTIONAL HEADER32.SizeOflmage
31.IMAGE OPTIONAL HEADER32.SizeOfHeaders
32.IMAGE OPTIONAL HEADER32.CheckSum
33.IMAGE OPTIONAL HEADER32.Subsystem
34.IMAGE OPTIONAL HEADER32.DlICharacteristics
35.IMAGE OPTIONAL HEADER32.SizeOfStackReserve
36.IMAGE OPTIONAL HEADER32.SizeOfStackCommit
37.IMAGE OPTIONAL HEADER32.SizeOfHeapReserve
38.IMAGE OPTIONAL HEADER32.SizeOfHeapCommit
39.IMAGE OPTIONAL HEADER32.LoaderFlags
40.IMAGE OPTIONAL HEADER32.NumberOfRvaAndSize
41.IMAGE OPTIONAL HEADER32.DataDirectory
3.5.4 数据目录项——IMAGE_DATA_DIRECTORY的字段
42.IMAGE DATA DIRECTORY.VirtualAddress
43.IMAGE DATA DIRECTORY.isize
3.5.5 节表项——IMAGE_SECTION_HEADER的字段
44.IMAGE SECTION HEADER.Name1
45.IMAGE SECTION HEADER.Misc
46.IMAGE SECTION HEADER.VirtualAddress
47.IMAGE SECTION HEADER.SizeOfRawData
48.IMAGE SECTION HEADER.PointerToRawData
49.IMAGE SECTION HEADER.PointerToRelocations
50.IMAGE SECTION HEADER.PointerToLinenumbers
51.IMAGE SECTION HEADER.NumberOfRelocations
52.IMAGE_SECTION_HEADER.NumberOfLinenumbers
53.IMAGE SECTION HEADER.Characteristics
3.5.6 解析HelloWorld程序的字节码
3.6 PE内存映像