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

第九讲,资源表解析

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

    一丶熟悉Windows管理文件的方法

首先,为什么标题是这个,主要是为了下边讲解资源方便,因为资源结构体很乱.如果直接拿出来讲解,那么就会很晕.

1.windows管理文件方法

树形结构  

第九讲,资源表解析

可以看出结构

根目录

  子目录

    文件.xxx

  子目录

    子目录 (子目录里面还可以有文件夹)

  .....    

那么我们的资源也是这样存储的.

?

二丶资源结构体解析

首先,资源结构体分为很多个,但是有用的就3个.一般也分为三个

IMAGE_RESOURCE_DIRECTORY            根目录(资源目录头)

IMAGE_RESOURCE_DIRECTORY_ENTRY         子目录(资源目录项)其中根目录下可以有很多子目录(也就是说根目录下会有子目录的)

IMAGE_RESOURCE_DATA_ENTRY            文件(资源数据)
结构体解析:

1.资源目录头(也可以看做管理文件的根目录)

typedef struct _IMAGE_RESOURCE_DIRECTORY {
    DWORD   Characteristics;          资源属性
    DWORD   TimeDateStamp;           时间戳
    WORD    MajorVersion;            资源大版本号
    WORD    MinorVersion;            资源小版本号
    WORD    NumberOfNamedEntries;       按照名称命名的数量
    WORD    NumberOfIdEntries;         按照ID命名的数量
//  IMAGE_RESOURCE_DIRECTORY_ENTRY DirectoryEntries[];
} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;

首先我们看到资源目录头的结构体了,这里大家要知道,有用的就最后两个成员,还有一段注释.

1.按照名称命名的数量

意思就是我们的资源是字符串命名加载的有多少个

2.按照ID命名的数量

意思就是我们的资源如果按照ID有多少个.

一般都是用ID的.

最后两个字段主要是资源的标识,是以ID的有多少个,以字符串标识的有多少个.

2.资源目录项(子目录)

typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    union {
        struct {
            DWORD NameOffset:31;          位段: 低31位飘逝偏移 定义了目录项的名称或者ID
            DWORD NameIsString:1;          位段: 高位,如果这位为1,则表示31位的偏移指向的是一个Unicode字符串的指针偏移
        };                       这里列出结构体,自己去看,IMAGE_RESOURCE_DIR_STRING_U 里面是字符串长度还有字符串,不是结尾         
        DWORD   Name;                 
        WORD    Id;
    };
    union {
        DWORD   OffsetToData;            偏移RVA因为是联合体,所以有不同的解释
        struct {
            DWORD   OffsetToDirectory:31;    看高位,如果高位是1,那么RVA偏移指向的是新的(根目录)
            DWORD   DataIsDirectory:1;      
        };
    };
} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;

前边我们说了

根目录(资源目录头)下面存放的是这个结构体,这个结构体是一个联合体,所以会有不同的解释

1.首先,联合体是8个字节大小.

2.其中第一个DWORD大小,看高位,那么低31位是指向新的目录项名称的结构体IMAGE_RESOURCE_DIR_STRING_U?

3.如果高位为0,则是ID号,这个ID号说的是 资源ID类型,比如3类型指的就是ICON

具体,可以随便写个RT_XXX开头的宏去查看.

这里我写下,跟一下看看.

第九讲,资源表解析

4.第二个DWORD量,也是RVA偏移,如果高位为1,那么代表它还是一个目录,也就是指向了一个新的根目录了,这是个不断递归的过程.

如果不是,则指向文件偏移结构体了.

文件偏移结构体:(应该是资源数据结构体)

typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;          资源数据的偏移RVA
    DWORD   Size;               大小
    DWORD   CodePage;             代码页缓冲(CMD设置窗口的时候就是这个,没用)
    DWORD   Reserved;             保留
} IMAGE_RESOURCE_DATA_ENTRY,*PIMAGE_RESOURCE_DATA_ENTRY;

这个就很简单了,直接前边4个字节指向就是ICON资源的位置.

?

三丶实战演练,定位ICON资源.

看了上面结构体,可能会晕,因为联合体很多,不同的方式有不同的解释方法,那么一步一步的跟随

1.首先通过数据目录定位资源根目录(也就是根目录,占16个字节,第一个结构体)

?

第九讲,资源表解析

由此得出 RVA = 1B000?

然后查看属于哪个节

?

第九讲,资源表解析

由此得出,节的虚拟地址也是从1b000开始的,那么直接看文件偏移即可.

因为此时FA = RVA了,为了方便,一次截图就指明了,在文件的7800h位置

然后我们定位到7800h的位置

2.找到位置,查看结构体

(编辑:莆田站长网)

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

热点阅读