第九讲,资源表解析
找到位置后,我们对比结构体成员,看看是什么一次,因为这个是资源根目录,所以查看资源根目录结构体 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个数组是什么. ? 我们还是继续,看资源类型为3的,通过上图,我们得出,资源数据类型为三的(ICON)的高4个字节的高1位还是8 也就会80000140,那么意思就是又指向了一个新的"根目录" 5.继续寻找新的根目录 上图得出 偏移是140? FA = 7800 + 140? = 7940 那么文件位置7940是新的根目录,接着数16个字节. ? 我们看到7940位置是一个新的根目录,那么我们看出,它按照ID分类,就一项了,那么下面8个字节就是数据目录项了.(子目录) 那么我们由此得出,它的高位不是1, 现在的 00000238 高位不是1了,那么根据 "子目录"结构体的定义,高位不是1那么这个RVA偏移则是指向了一个文件结构体的偏移 我们继续计算FA,一致FA = 7800,得出的RVA = 238? 则FA = 7800+238 = 7A38h 6.定位资源数据(文件) 那么我们定义为7A38的位置,看下资源数据结构是什么样子 为了防止大家结构体忘记,重新拷贝到这里观看. typedef struct _IMAGE_RESOURCE_DATA_ENTRY { DWORD OffsetToData; DWORD Size; DWORD CodePage; DWORD Reserved; } IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY; 就第一个成员有用,4个字节,表示ICON的RVA偏移. 那么定位到7A38 ? 得出第一个成员的RVA偏移是 0001c018 RVA = 1C018 按照FA = RVA?,的知刚才的RVA = 1B000 求FA = ? FA = 1C018 - 1B000 + 7800 =? 8818 那么文件偏移8818的位置,则是ICON的数据了. 我们看下. (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |