深入理解PE结构中的资源表
以1个实际的例子来理解数据目录项的各个字段的意义:

资源目录项位于数据目录下的第2项(下标为2)

通过数据目录项2项找到资源的位置:
0x4000<---------转成FOA为---->0x1800
0x0D8430
typedef struct _IMAGE_RESOURCE_DIRECTORY{
dword Characteristcs; //资源属性,保留将来使用,必须为0
dword TimeDataStamp; //资源创建的时间
dword MajorVersion; //资源大版本号
dword MinorVersion; //资源小版本号
dword NumberOfNameEntries; //以名称命名的资源个数
dword NumberOfIdEntries; //以id命名的资源个数
}Image_Resource_Dir,*lpImage_Resource_Dir;
我们只关心最后2个字段


共计5个资源,每个资源的结构如下
typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY{
union {
struct {
dword NameOffset:31; //位段或位域
dword NameIsString:1 ; //最高位为1,那么低31位为指向unicode的结构体指针
}; //最高位为0,那么低31位是一个数字,这个数字是1个编号
dword Name;
word Id;
};
union {
dword OffsetToData;
struct {
dword OffsetToDirectory:31 ;
dword DataIsDirectory:1 ; //最高位为1,那么低31位+第一层的资源目录地址 = 下一次目录结点的起始位置(这个计算,类似于重定位表计算地址那样:文件加载内存地址+资源地址转成FOA+低31位)
}; //最高位为0,那么低31位是一个数字,这个数字是1个编号
};
}IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
windows在前期定义了16种数据资源,以为这16种资源够用了,现在发现远远不够.



可以通过递归的方式查找资源:
如果最高位是1,那么就是目录,先通过资源目录内偏移找到对应资源目录的位置
如果最高位是0,那么就是数据,先通过资源目录内偏移找到对应的数据位置
通过数据位置找到对应的RVA和size

浙公网安备 33010602011771号