PE文件加载过程揭秘(4)

2011年10月09日 星期日 16:25

转载自 cvvd
最终编辑 cvvd

相信大家通过前几篇对PE文件的学习,已经可以自己找到资源表了!没错它就是数据目录的第三项,从这里我们得到的是如下结构的RVA

前3x4byte空间一般为0,只有后面的NumberOfNamedEntries(以资源名表示的资源数目)和NumberOfIdEntries(以ID表示的资源数目)有用。PE资源被定义为一个树状的数据结构,它由数据目录(IMAGE_RESOURCE_DIRECTORY)+节点(IMAGE_RESOURCE_DIRECTORY_ENTRY)组成。

上图是DIRECTORY_ENTRY的C定义,它的汇编定义其实更简单更易懂:

IMAGE_RESOURCE_DIRECTORY_ENTRY STRUCT

Name dd ?

OffsetToData dd ?

IMAGE_RESOURCE_DIRECTORY_ENTRY ENDS

我用下面的文字图示表示一下:

00 00 00 00 | 00 00 00 00 | 00 00 | 00 00 | 00 00 | 03 00 <----数据目录

03 00 00 00 | 28 00 00 80 - 05 00 00 00 | 50 00 00 80 - 0E 00 00 00 | 68 00 00 80 <----其下的3个节点

事实上资源的树状结构分为3级目录:

Name字段:一级目录记录的是资源的类型,二级目录记录的是资源的名称,三级目录记录的是代码页编号

OffsetToData字段:如果最高位为0,其指向MAGE_RESOURCE_DATA_ENTRY,否则其指向的是数据目录(IMAGE_RESOURCE_DIRECTORY)(这里的指向其实是指下一个数据目录相对资源表头的偏移,而并不是常用的RVA)。

IMAGE_RESOURCE_DATA_ENTRY在资源的定位中起着至关重要的地位,因为这个结构记录着资源数据真实的RVA。其C定义如下:


之后大家都懂的,第一个字段是RVA,第二个是大小,找到了资源数据后,你就想怎么改就怎么改了。别做个熊猫烧香就行。清理起来麻烦~

posted @ 2012-07-08 10:52  麦小扣_刘  阅读(423)  评论(0编辑  收藏  举报