PE格式详解(五)

来源:互联网 发布:简易平面广告制作软件 编辑:程序博客网 时间:2024/05/18 20:31
 

         上次文章因为实在太长,所以不得不把这么简单的一点内容单独成文。回顾一下,上次先说到PE header,然后说到其中的成员Optional header,它的最后一个结构成员DataDirectory,是一个含有16IMAGE_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.exeDataDirectory,我们选其中几项来看看。

                PICTURE MISSING

    图中其实很整齐地帮我们划分了每一个目录表项,每一行有明显分开的两组数据,每一组长即为8字节,也就是一个表项,这样看起来就方便很多。

    第一个表项,全零,由于对应的IMAGE_DIRECTORY_ENTRY_EXPORT,意味着testPE.exe没有DLL输出表(Export Table)

    第二个是输入表(Import Table),显然不为0(不然还叫Windows程序啊),推断出VirtualAddress = 00 01 80 00Size = 00 00 00 3C,有空自己挑个EXE去看一下去,以后我们会再遇到的,现在跳过。

    其实每一个表项都有挺实在的意思,看最后一个单词就都明白了。到这,PE header部分就全部结束了。下次讲的是区段表(Section Table)