流水账笔记:PE文件格式(手工增加节)

为方便理解,仅以“Hello, PE!”的小程序为例,使用工具 010 Editor

这里写图片描述

练习文件下载

当前程序目前有 2 个节区,且节头部分有足够的空间来增加另一个节头。

这里写图片描述

增加节的步骤


#1

将文件头的 NumberOfSection (节区数量) 改为 3

这里写图片描述

#2

在最后一个节区头后面增加一个节区头,假设新的节区在文件中占 200h,由于该程序的内存和文件的映射关系如图:

内存中的地址文件中的地址
0x00400000 ~ 0x004010000x000 ~ 0x400
0x00401000 ~ 0x004020000x400 ~ 0x600
0x00402000 ~ 0x004030000x600 ~ 0x800

所以新增的节区的 RVA 要从 3000h开始,FOA 要从 800h开始,所填数据如下表:

成员名称
Name.MyCode
Misc48
VirtualAddress3000h
SizeOfRawData200h
PointerToRawData800h

这里写图片描述

#3

将文件头(FileHeader)中的 SizeOfImage 修改为 4000h(比原来多映射了一个页)

这里写图片描述

#4

于是可以在 800h ~ 0A00h 的范围内填写数据了。如果直接将 代码节 的数据拷贝过来,把入口点改为0x0040300C,点击程序,程序也是可以正常运行的。用 OD 打开程序,我们可以看到,0x0040300c 有我们所增加的数据。

这里写图片描述

只不过它是运行在了我们所增加的节区的数据,可以用此方法注入程序。

节头字段


Misc

指该节区实际从文件拷贝到内存的字节数。

  • 如果把改字段修改为 2 或者 0。运行时,从文件到内存并不是只拷贝了 2 个字节,而是根据 SizeOfRawData 的大小拷贝 。
  • 如果把该值修改为 0x1000 以上的值,则程序将 无法启动
  • 如果将 SizeOfImage 的值修改为 5000h,则该节 Misc 的值的上限位 2000h
    暂时得出结论:该值不能随便修改 ,且大小与 SizeOfImage 的值有关←_←

VirtualAddress

表示该节在虚拟内存中的位置(RVA)。该值应该与 SectionAlignment 对齐,并且与上一个节的位置相连。如上一个节的地址范围为 0x2000 ~ 0x3000,那么这个只能为 0x3000,否则程序将无法正常启动。

SizeOfRawData

该节区中,连续从文件拷贝到内存的字节数。建议该值应该是文件对齐值的倍数。如果将该值修改为 1。该程序依然能够正常运行,用 OD 打开后,我们发现映射到内存的数据依然是文件中 0x800 ~ 0x9FF 的数据。

这里写图片描述

如果我们将该值修改为 201h,我们发现映射到内存的数据是文件中 0x800 ~ 0xBFF 的数据。

猜测:该值与映射到内存的数据大小呈下表关系:

SizeOfRawData映射到内存的大小
0 ~ 0x2000x200
0x201 ~ 0x4000x400
0x401 ~ 0x6000x600

PointerToRawData

在该节区中,从文件的哪个位置开始,映射到内存。建议该值为 文件对齐值 的倍数。如在该程序中,如果该值被修改为 0x805,那么操作系统依然会从 0x800 的位置开始映射

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页