PE文件学习(三)数据目录表之资源

来源:互联网 发布:房地产网络销售传播图 编辑:程序博客网 时间:2024/06/04 17:59

     资源是PE文件中最复杂的结构了,资源在PE文件中是以目录结构的形式存在的,一般情况下分为3层,从根目录开始分别是资源类型、目录资源ID与资源代码页。

     3层目录结构都是由一个IMAGE_RESOURCE_DIRECTORY结构为头部,后面跟着一个IMAGE_RESOURCE_DIRECTORY_ENTRY结构数组。

      结构体IMAGE_RESOURCE_DIRECTORY_ENTRY如下所示:

typedef  struct  _IMAGE_RESOURCE_DIRECTORY{DWORD  Characteristics;    //资源属性标识DWORD  TimeDateStamp;  //资源建立的时间WORD    MajorVersion;      //资源主版本WORD    MinorVersion;       //资源子版本WORD    NumberOfNamedEntries;  //资源名称条目个数WORD    NumberOfIdEntries;   //资源ID条目个数} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

  结构体IMAGE_RESOURCE_DIRECTORY_ENTRY:

typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY{union {struct {        DWORD NameOffset:31;    //资源名偏移DWORD NameIsString:1;   //资源名为字符串};        DWORD Name;        //资源/语言类型WORD Id;           //资源数字ID};union{DWORD OffsetToData;     //数据偏移地址struct {DWORD OffsetToDirectory:31;   //子目录偏移地址DWORD DataIsDirectory:1;      //数据为目录};};}IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
   其中的Name成员当此结构体位于第一层目录中时,此字段保存有资源类型的值。当此结构体位于第三层目录中时,此字段保存有资源语言区域的类型值

    

  OffsetToDirectory和DataIsDirectory:当DataIsDirectory为1时,OffsetToDirectory的值指向下一层子目录的偏移。

   这个IMAGE_RESOURCE_DIRECTORY_ENTRY是由两个大小为4字节的联合体组成的,在不同情况下,两个联合体中的有效字段也不同。

        第一个联合体内的字段是根据当前结构体所处的目录层次来决定的,位于第一层目录时字段Name有效,保存的信息是资源类型;位于第二层目录时字段Id或结构体有效,这取决于此资源的索引方式,如果采用的是编号索引就是字段Id有效,否则结构体有效;位于第三层目录时字段Name有效,保存的信息是资源语言区域类型。
第二个联合体内的字段理论上是根据具体情况而定的,如果下一级是一个子目录的话,那么就是结构体生效,如果下一级是资源数据则是字段OffsetToData生效。

   在经过三层目录的索引后,最后会到达一个IMAGE_RESOURCE_DATA_ENTRY结构中,这个结构将指引我们找到资源数据。下面这个结构体描述的就是此结构。

typedef struct _IMAGE_RESOURCE_DATA_ENTRY{DWORD OffsetToData;   //资源数据的RAVDWORD Size  ;         //资源数据的长度DWORD CodePage;       //代码页DWORD Reserved;       //保留字段}IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;

   

0 0
原创粉丝点击