您的位置:首页 > 其它

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

2015-08-26 19:40 357 查看
     资源是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; //资源数据的RAV
DWORD Size ; //资源数据的长度
DWORD CodePage; //代码页
DWORD Reserved; //保留字段
}IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息