第九讲,资源表解析
|
找到位置后,我们对比结构体成员,看看是什么一次,因为这个是资源根目录,所以查看资源根目录结构体 typedef struct _IMAGE_RESOURCE_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
WORD NumberOfNamedEntries;
WORD NumberOfIdEntries;
// IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
我们发现,意思就是按照ID分类的资源有多少个,我们得出是7个,字符串标识的资源有0个,所以不用看了. 3.定位资源目录项(子目录) 我们知道,资源根目录下面是子目录,现在有7个按照ID分类的资源,那么就有7个资源目录项(子目录) 看下结构体 typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
union {
struct {
DWORD NameOffset:31;
DWORD NameIsString:1;
};
DWORD Name;
WORD Id;
};
union {
DWORD OffsetToData;
struct {
DWORD OffsetToDirectory:31;
DWORD DataIsDirectory:1;
};
};
} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
首先,我们不要被这个结构体弄晕.我们首先要知道结构体的大小 结构体是2个union(联合体,共用体),而里面的最大类型是DWORD,所以这个结构体大小是8个字节. 那么我们就知道了,在资源根目录下有7各这样的数组大小,也就是 7 * 8 = 56字节,整个数组占56个字节 那么我们看下
第二个红色箭头没有弄完,截图就完了,不好意思,第二个箭头的意思就是,整个56个字节,是资源目录项,其中黄色区域,属于第一个资源目录项 那么根据上面的结构体,我们先看黄色区域的第一的4个字节,看看高位是否是1 这里有两种解释方式 1.如果高位为1,那么表示一个字符串,那么低31位指向了一个字符串结构体 2.如果高位为0,那么表示是一个双字节的ID (资源类型) 现在得出? 00000003? 很显然,高位为0,那么表示一个资源类型,而资源类型上面看过了,3表示是一个ICON 那么在看黄色区域的第二的4个字节 1.高位为1,那么低31位表示指向了一个新的"根目录" (结构体大小还是16个字节,还是最后4个字节有用,也就是上面第一个结构体) 2.如果高位为0,那么低31位表示指向了一个资源数据结构体(可以表示为文件) 现在得出,80000048? 很显然高位为1,因为高1位是个8,那么低31位则表示指向一个新的"根目录" 得出RVA偏移得48 那么根据刚才的FA = RVA? FA = 7800 那么现在新的目录的FA = 7800 + 48 = 7848 那么在7848h表示新的根目录,跟过去看下. 4.定位新的根目录
可以看出,有是4个新的数据目录项,那么我们接着看下4个数组是什么. (编辑:网站开发网_盐城站长网 ) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



