非托管PE文件资源结构剖析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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的理解。读者可以根据资源段的分析,在对资源结构充分理解的基础上,提