加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_宿迁站长网 (https://www.0527zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 系统 > 正文

第九讲,资源表解析

发布时间:2021-03-05 16:35:28 所属栏目:系统 来源:网络整理
导读:副标题#e# 一丶熟悉Windows管理文件的方法 首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕. 1.windows管理文件方法 树形结构 可以看出结构 根目录 子目录 文件.xxx 子目录 子目录 ( 子目录里面还可

找到位置后,我们对比结构体成员,看看是什么一次,因为这个是资源根目录,所以查看资源根目录结构体

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的数据了.

我们看下.

(编辑:云计算网_宿迁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!