上次文章因为实在太长,所以不得不把这么简单的一点内容单独成文。回顾一下,上次先说到PE header,然后说到其中的成员Optional header,它的最后一个结构成员DataDirectory,是一个含有16个IMAGE_DATA_DIRECTORY类型元素的数组,每一个元素都指向PE文件内的一个很重要的数据结构。
首先列出IMAGE_DATA_DIRECTORY结构:(简单的结构就不注释了)
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY,*PIMAGE_DATA_DIRECTORY;
VirtualAddress。是所指向的数据结构的虚拟地址。
Size。这个数据结构的大小。
这一个结构占8个字节,16项一共占128字节。
另外序号与目录的对应关系在winnt.h中定义如下:
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6
#define IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8
#define IMAGE_DIRECTORY_ENTRY_TLS 9
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11
#define IMAGE_DIRECTORY_ENTRY_IAT 12
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14
最后15是预留位置。
下图便是testPE.exe的DataDirectory,我们选其中几项来看看。
PICTURE MISSING
图中其实很整齐地帮我们划分了每一个目录表项,每一行有明显分开的两组数据,每一组长即为8字节,也就是一个表项,这样看起来就方便很多。
第一个表项,全零,由于对应的IMAGE_DIRECTORY_ENTRY_EXPORT,意味着testPE.exe没有DLL输出表(Export Table)。
第二个是输入表(Import Table),显然不为0(不然还叫Windows程序啊),推断出VirtualAddress = 00 01 80 00,Size = 00 00 00 3C,有空自己挑个EXE去看一下去,以后我们会再遇到的,现在跳过。
其实每一个表项都有挺实在的意思,看最后一个单词就都明白了。到这,PE header部分就全部结束了。下次讲的是区段表(Section Table)。