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;
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;
相关文章推荐
- 自学成才的秘密:115个 web Develop 资源
- C#中使用资源的方法分析
- Shell脚本实现Linux系统和进程资源监控
- Android资源命名规范 分享
- C#使用Dispose模式实现手动对资源的释放
- .net非托管资源的回收方法
- Smarty使用自定义资源的方法
- python实现计算资源图标crc值的方法
- Xcode5.0.2 资源更新问题
- 海外网站资源索引
- 条款14:在资源管理中小心copying行为
- 条款15:在资源管理类中提供对原始资源的访问
- 一些有用的资源
- 锐起无盘管理器 及相关资源
- 如何理解VMware内存资源管理
- Linux查看系统配置常用命令
- 简单说说PHP优化
- 挖掘Win7系统自带宝藏:善用资源监视器
- IIS7.5 如何完整看到500详细错误
- 提取ipa里面的资源图片