PE文件加载过程揭秘(4)
2011年10月09日 星期日 16:25
相信大家通过前几篇对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定义如下:
|