首页
社区
课程
招聘
[原创]PE知识汇总
2020-9-23 11:13 3432

[原创]PE知识汇总

2020-9-23 11:13
3432

PE知识汇总(四)

前文:

PE知识汇总(一)
PE知识汇总(二)
PE知识汇总(三)

资源

  • Windows 程序的各种界面称之为资源,包括快捷键、位图、光标、对话框、图标、菜单、串标、工具栏和版本信息等。在PE文件的所有结构中,资源部分是最复杂的。
  • 资源结构

    资源用类似于磁盘目录的方式保存,目录通常包含3层。

img

  • 资源目录结构
    资源表由数据目录表的第三项(Resource Table)。它包含资源的RVA和大小
1
2
3
4
5
6
7
8
9
typedef struct _IMAGE_RESOURCE_DIRECTORY
{
    DWORD Characteristics;//理论上为资源的属性,不过事实上总是0
    DWORD TimeDateStamp;//资源的产生时刻
    WORD MajorVersion;//理论上为资源的版本,不过事实上总是0
    WORD MinorVersion;
    WORD NumberOfNamedEntries;//以名称(字符串)命名的入口数量
    WORD NumberOfIdEntries;//ID(整型数字)命名的入口数量
} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;

NumberOfNamedEntries字段是以字符命名的资源数量,NumberOfIdEntries字段是以整型数字命名的资源数量。两者加起来是本目录中的目录项总和,即紧随其后的IMAGE_RESOURCE_DIRECTORY_ENTRY结构的数量。

  • 资源目录入口结构
    紧跟资源目录结构的就是资源目录入口(Resource Dir Entries)结构,此结构长度为8字节,包含2个字段。

    1
    2
    3
    4
    5
    IMAGE_RESOURCE_DIRECTORY_ENTRY STRUCT
    {
      DWORD Name;            //目录项的名称字符串指针或ID
      DWORD OffsetToData;    //资源数据偏移地址或子目录偏移地址
    }

    Name
    当结构用于第一层目录时,定义的是资源类型;当结构用于第二层目录时,定义的是资源的名称;当结构用于第三层目录,定义的是代码页的编号。当最高位为0时,表示字段的值作为ID使用;当最高位为1时,表示字段的低位作为指针使用,这个指针不直接指向字符串,而是指向一个IMAGE_RESOURCE_DIR_STRING_U结构。定义如下

    1
    2
    3
    4
    5
    IMAGE_RESOURCE_DIR_STRING_U
    {
      WORD Length;// 字符串长度
      WCHAR NameString;// 字符串
    }

    OffsetToData:
    指针。当最高位(位31)为1时,低位数据指向下一层目录块的起始地址;当最高位为0时,指针指向IMAGE_RESOURCE_DATA_ENTRY结构。在将Name和OffsetToData 作为指针时需要注意,该指针从资源区块开始处计算偏移量,并非从RVA开始处计算偏移量。(资源区块地址 + 偏移)
    img

  • 资源数据入口
    经过三层IMAGE_RESOURCE_DIRECTORY_ENTRY,第三层目录结构中的OffsetToData将指向IMAGE_RESOURCE_DATA_ENTRY结构。该结构描述了资源数据的位置和大小,其定义如下:

    1
    2
    3
    4
    5
    6
    7
    IMAGE_RESOURCE_DATA_ENTRY
    {
      DWORD OffsetToData;    //资源数据的RVA
      DWORD Size;           //资源数据的长度
      DWORD CodePage;       //代码页
      DWORD Reserved;       //保留字段
    }

    多层结构的指向后,获取资源数据的RVA(OffsetToData)

  • 实例:

    测试软件:notepad.exe

  1. 使用PEView 查看Resource Table(一般情况都在.rsrc块)
    图片描述
    图片描述
    计算得出资源块的FileOffset为0xBC00
  2. 使用16进制编辑器打开exe,并且跳转到0xBC00
    图片描述
    00 00 00 00 00 00 00 00 00 00 00 00 01 00 05 00
    NumberOfNameEntries:1
    NumberOfIdEntries:5
    即一共存在6个资源项,使用工具查看确实满足6个资源
    图片描述
    分别是:
    第一项.
    00 04 00 80 40 00 00 80
    第二项.
    02 00 00 00 58 00 00 80
    第三项.
    03 00 00 00 70 00 00 80
    第四项.
    0E 00 00 00 E8 00 00 80
    第五项.
    10 00 00 00 00 01 00 80
    第六项.
    18 00 00 00 18 01 00 80

  3. 以第一个资源项为例
    第一项
    00 04 00 80
    40 00 00 80
    Name = 80000400

    高位为1,所以是指向IMAGE_RESOURCE_DIR_STRING_U结构。FileOffset = BC00(资源块开始地址) + 0400 = C000
    图片描述
    Length = 03
    NameString = "MUI"

    OffsetToData = 80000040;指向第二层(BC40)
    第一项第二层
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
    NumberOfNameEntries:1
    NumberOfIdEntries:0
    只有1项
    01 00 00 00
    30 01 00 80
    ID = 1
    OffsetToData = 80000130;指向第三层(BD30)
    第一项第二层第一项第三层
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00
    NumberOfNameEntries:1
    NumberOfIdEntries:0
    只有1项
    09 04 00 00
    E0 02 00 00
    ID=409
    OffsetToData = 2E0;指向IMAGE_RESOURCE_DATA_ENTRY结构(BEE0)
    IMAGE_RESOURCE_DATA_ENTRY结构:
    图片描述
    70 E0 02 00 OffsetToData = 02E070
    F0 00 00 00 Size = F0
    00 00 00 00
    00 00 00 00
    所以指向资源的RVA为2E070,计算得出FileOffset = 2E070-F000+BC00 = 2AC70,资源大小为F0
    图片描述
    通过工具查看:
    图片描述

总结:这4篇PE相关的文章所有知识点来自于《加解密(第四版)》,这里只是自己对这部分知识的大概理解。挖个坑,之后有时间写一篇关于PE工具制作的帖子。


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞3
打赏
分享
最新回复 (2)
雪    币: 4863
活跃值: (2504)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Deterior 2020-9-23 22:04
2
0
图片挂了一个
雪    币: 799
活跃值: (1733)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
老伙计 2020-9-24 14:34
3
0
Deterior 图片挂了一个

挂掉的图片

上传的附件:
游客
登录 | 注册 方可回帖
返回