非托管PE文件资源结构剖析

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

非托管PE文件资源结构剖析

摘要简单介绍了pe文件的结构,介绍了怎样从pe中找到资源块,详细介绍了资源的三层结构,以及三层结构里面的一些细节。

关键词 pe文件;资源段;资源结构

中图分类号g210 文献标识码a 文章编号

1674-6708(2011)54-0178-01

1 pe文件结构简介

pe(portable executable)文件是windows操作系统上的程序文件,常见的exe、dll、sys等都是pe文件。pe文件有固定的结构,pe文件的结构如图1,所有pe文件都是由ms-dos文件头,ms-dos stub,pe文件头,段表,以及一组段体组成。段体包括代码段、数据段、输入表段、输出表段,以及资源段等。

ms-dos文件头ms-dos stub pe

文件头段表代码段数据段资源段输入表输

出表…

图1 pe文件结构图

资源段是段表下的某个段。我们可以通过ms-dos文件头,pe文件头和段表的数据找到资源段的位置。

2找到pe文件资源段

可以通过下面的步骤来查找pe资源段。

1)根据ms-dos文件头结构的成员e_lfanew,得到pe文件头在

文件中的位置;

2)确定pe件头在文件中的位置之后,就可以确定peheader 中的成员fileheader 和成员optionalheader 在文件中的位置。根据 fileheader中的成员numberofsections 的值,就可以确定文件中段的数目,也就是段表数组中元素的个数;

3)pe header 在文件中的位置加上pe header 结构的大小就可以得到段表在文件中的开始位置;

4)取得pe header 中的optional header 中的datadirectory 数组中的第三项的成员virtualaddress 的值,这个值就是在内存中资源段的rva。然后根据段的数目,遍历段表数组。找到其中成员virtualaddress 等于上面求得的rva的数组项,该数组项就是资源段的段表,其成员pointertorawdata 就是资源段在文件中的位置。

3 pe文件资源结构

资源段中存放了程序中用到的各种资源(如

icon ,dialog ,bitmap,menu,stringtable 等)资源段的结构一般分为三层结构,如图2所示。

图2

1)第一层为根节点层。表示资源类型,每个

image_resourse_directory_entry表示一个资源类型。包含一个image_resource_directory和多个

image_resourse_directory_entry结构。

image_resource_directory含有的两个word 类型的numberofnamedentries 和numberofidentries 字段值的和,表示在该结构之后的image_resource_directory_entry类型表的元素的个数,而每个image_resource_directory_entry元素包含指向另一个image resource directory结构入口描述的指针。

这两个结构体如下所示:

typedef struct _image_resource_directory {

dword characteristics;dword

timedatestamp;wordmajorversion;

wordminorversion;

wordnumberofnamedentries; //有真正名字的entry的数目

wordnumberofidentries;//以id作为名字的entry的数目

} image_resource_directory;

typedef struct _image_resource_directory_entry {

union {

struct {

dword nameoffset:31;dword nameisstring:1;

}; dword name;wordid;

};

union {

dword offsettodata;

struct {

dword offsettodirectory:31;dword dataisdirectory:1;

};

};

} image_resource_directory_entry;

2)第二层为每个资源的id或者name;这一层的每个

image_resourse_directory_entry结构表示一个资源。

3)第三层是资源的语言和真正的数据块,每种资源真正的数据块格式有着不同的格式。第二层的这一层的每个

image_resourse_directory_entry结构指向一个

image_resource_data_entry结构,这个结构再指向真正的数据块。这个结构里包含有资源的语言,大小等信息。此结构如下所示:typedef struct _image_resource_data_entry {

dword offsettodata;dword size;dword codepage;dword reserved;

} image_resource_data_entry

4结论

pe文件是windows操作系统的重要组成部分,同时资源段是pe 文件的重要组成部分,对资源段的分析,能加深对windows的理解。读者可以根据资源段的分析,在对资源结构充分理解的基础上,提

相关文档
最新文档