(一)data directory 是一个 IMAGE_DATA_DIRECTORY结构数组,共有16个成员。如果您还记得节表可以看作是PE文件各节的根目录的话,也可以认为 data directory 是存储在这些节里的逻辑元素的根目录。明确点,data directory 包含了PE文件中各重要数据结构的位置和尺寸信息。每个成员包含了一个重要数据结构的信息。
Member | Info inside |
---|---|
0 | Export symbols |
1 | Import symbols |
2 | Resources |
3 | Exception |
4 | Security |
5 | Base relocation |
6 | Debug |
7 | Copyright string |
8 | Unknown |
9 | Thread local storage (TLS) |
10 | Load configuration |
11 | Bound Import |
12 | Import Address Table |
13 | Delay Import |
14 | COM descriptor |
data directory 的每个成员都是 IMAGE_DATA_DIRECTORY结构类型的,其定义如下所示:
IMAGE_DATA_DIRECTORY STRUCT
VirtualAddress dd ? //数据结构的相对虚拟地址(RVA)
isize dd ? //含有VirtualAddress所指向数据结构的字节数
IMAGE_DATA_DIRECTORY ENDS
(二)如何定位到某一个数据目录:
- 从 DOS header 定位到 PE header
- 从 optional header 读取 data directory 的地址。
- IMAGE_DATA_DIRECTORY 结构尺寸乘上找寻结构的索引号: 比如您要找寻import symbols的位置信息,必须用IMAGE_DATA_DIRECTORY结构尺寸(8 bytes)乘上1(import symbols在data directory中的索引号)。
- 将上面的结果加上data directory地址,我们就得到包含所查询数据结构信息的 IMAGE_DATA_DIRECTORY结构项。