-
-
[原创]PE知识汇总
-
2020-9-23 11:13
3432
-
PE知识汇总(四)
前文:
PE知识汇总(一)
PE知识汇总(二)
PE知识汇总(三)
资源
- Windows 程序的各种界面称之为资源,包括快捷键、位图、光标、对话框、图标、菜单、串标、工具栏和版本信息等。在PE文件的所有结构中,资源部分是最复杂的。
- 资源结构
资源用类似于磁盘目录的方式保存,目录通常包含3层。
- 资源目录结构
资源表由数据目录表的第三项(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结构的数量。
- 使用PEView 查看Resource Table(一般情况都在.rsrc块)
计算得出资源块的FileOffset为0xBC00
使用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
以第一个资源项为例
第一项:
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世界