流水账笔记:PE文件格式(手工增加节)
来源:互联网 发布:快三数据接口 编辑:程序博客网 时间:2024/06/05 01:58
为方便理解,仅以“Hello, PE!”的小程序为例,使用工具 010 Editor:
练习文件下载
当前程序目前有 2 个节区,且节头部分有足够的空间来增加另一个节头。
增加节的步骤
#1
将文件头的 NumberOfSection (节区数量) 改为 3
#2
在最后一个节区头后面增加一个节区头,假设新的节区在文件中占 200h,由于该程序的内存和文件的映射关系如图:
所以新增的节区的 RVA 要从 3000h开始,FOA 要从 800h开始,所填数据如下表:
#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 ~ 0x200 0x200 0x201 ~ 0x400 0x400 0x401 ~ 0x600 0x600 … …
PointerToRawData
在该节区中,从文件的哪个位置开始,映射到内存。建议该值为 文件对齐值 的倍数。如在该程序中,如果该值被修改为 0x805,那么操作系统依然会从 0x800 的位置开始映射。
- 流水账笔记:PE文件格式(手工增加节)
- 流水账笔记:PE文件格式(Dos Header)
- 流水账笔记:PE文件格式(FileHeader)
- 流水账笔记:PE文件格式(OptionalHeader 上)
- 流水账笔记:PE文件格式(IAT)
- 流水账笔记:PE文件格式(OptionalHeader 下)
- 流水账笔记:PE文件格式(SectionHeaders)
- 流水账笔记:PE文件格式(RVA & FOA)
- 流水账笔记:PE文件格式(关于dump)
- 流水账笔记:PE文件格式(导出表)
- 流水账笔记:PE文件格式(TLS)
- 流水账笔记:PE文件格式(资源表)
- 流水账笔记:PE文件格式(导入表注入---手动)
- 流水账笔记:PE文件格式(重定位表)
- 流水账笔记:PE文件格式(TLS手动注入)
- PE文件格式详解(手工实现一个可执行文件)
- PE文件格式笔记
- PE文件格式学习笔记
- ipv6地址分类
- 【Unity3d】在Unity3d中播放视频:AVPro Video的使用
- spring cloud 之Spring Cloud Config 尝鲜
- python统计函数库scipy.stats的用法1/3
- 字符与字符串--字符及转义字符
- 流水账笔记:PE文件格式(手工增加节)
- 在APACHE服务器上的访问方式上去除index.php
- 我国数学基础教育的困境
- 字符与字符串
- 选自器
- oracle之plsql连接oracle配置
- 【Leetcode】【python】Sqrt(x)
- 职场回头草,可吃得?
- JS入门