流水账笔记:PE文件格式(资源表)

来源:互联网 发布:微信公众号js sdk 编辑:程序博客网 时间:2024/05/16 08:50

定位到到数据目录下的资源表地址:

这里写图片描述

这里写图片描述

资源表示例下载

Windows 对资源的管理采用树形结构,模仿磁盘的管理方式来管理。

资源表的结构体

_IMAGE_RESOURCE_DIRECTORY

第一个结构体如图,表示 目录层资源文件 的项数,不管这一层是目录层资源文件,都会有这个结构体:

这里写图片描述

其中前四个成员不重要,不作解释了。

NumberOfNamedEntries & NumberOfIdEntries

资源有两种描述方法,一种是按照名称来描述,一种是按照 ID 来描述。这 4 个字节分别表示 用字符串描述的资源 有几项或 用 ID 描述的资源 有几项。但是一般都是用 ID 描述资源,很少会用字符串来描述资源(几乎不会出现)。如图中表示有 7 项用 ID 描述的资源。

这里写图片描述

这 7 项不一定代表的就是 资源文件,或许也是新的 目录层

_IMAGE_RESOURCE_DIRECTORY_ENTRY

结构体如下:

这里写图片描述

结合文件中的数据理解,因为是用 ID 来描述,这个结构体的前两个字节,在 第一层 中表示资源的类型。

这里写图片描述

资源的类型编号可以参考定义的宏

这里写图片描述


后四个字节的高位 1,表示下一层是 目录层;如果是 0,表示下一层就是 资源文件 。在这里,低 31 位表示的是 目录层 或者 资源文件 的偏移。指向的偏移又是一个 _IMAGE_RESOURCE_DIRECTORY 的结构体。如果是一个目录层,与之相连的结构体就是 _IMAGE_RESOURCE_DIRECTORY_ENTRY,如此 递归,直至到资源文件这一层。

偏移指的是相对于数 据目录中 资源表地址 的偏移


图中显示高位为 1,所以下一层表示的是 目录层。定位到第二层,绿框 表示 目录(_IMAGE_RESOURCE_DIRECTORY)蓝框 表示 目录层(_IMAGE_RESOURCE_DIRECTORY_ENTRY)

这里写图片描述

在接下来的层数中,_IMAGE_RESOURCE_DIRECTORY_ENTRY 这个结构体的第一个成员,不再表示资源类型,而是表示资源的 ID 或者资源的名称。其中如果高位为 1,则是字符串表示的资源;如果高位为 0,则是 ID 表示的资源。(实战中一般都为 0,用 ID 表示)。

_IMAGE_RESOURCE_DATA_ENTRY

这里写图片描述

_IMAGE_RESOURCE_DIRECTORY_ENTRY 结构体的第二个成员高位为 0 时,那么 低位的偏移地址 存放的数据应该用这个结构体来解释。如图中 紫框 内显示高位为 0,那么在文件 0x7a38 的位置就是结构体 _IMAGE_RESOURCE_DATA_ENTRY

此时第一个成员 0x804 没有意义,并不代表这个 icon 的 ID 号。因为上一层已经已经

这里写图片描述

0x1c018 表示资源的偏移地址(RVA), 0x2E8 表示资源的大小。

这里写图片描述

FindResource & LoadResource

FindResource 通过查询资源表,来获得_IMAGE_RESOURCE_DATA_ENTRY 结构体的数据,返回的值就是这个结构体的地址;LoadResource 得到的句柄就是_IMAGE_RESOURCE_DIRECTORY_ENTRY 这个结构体的第一个成员的值。

这里写图片描述

阅读全文
0 0
原创粉丝点击