您的位置:首页 > 其它

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

2017-10-16 04:19 267 查看
为方便理解,仅以“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 的位置开始映射。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: