gpt4 book ai didi

c++ - PE : Adding code at the end of . txt 部分

转载 作者:可可西里 更新时间:2023-11-01 14:16:50 24 4
gpt4 key购买 nike

据我所知,在 PE 文件中,Virtual Size 显示加载期间为部分分配的空间大小,Raw Size 显示该部分在磁盘上的大小。

我遇到了这个执行以下操作的可执行文件:

它从原始数据大小(offset 0x10)中减去虚拟大小(offset 0x8)并确保有一些空间(例如 100 字节)。在文本部分标题的偏移量 0x14 处,它找到了该部分本身在文件中的偏移量。它将虚拟大小添加到此,找到该部分在文件中结束的位置。它复制了一些 shellcode(最终跳转到可执行文件的原始入口点以确保原始可执行文件运行)到二进制文件文本部分的末尾。

现在我在这里有点困惑,如果虚拟大小显示将分配给可执行文件的确切空间,不会在 .txt 部分末尾添加代码覆盖可执行文件的一些其他数据让它崩溃?谢谢。

最佳答案

这是一个很好的问题,说明了关于 Windows 加载程序如何计算内存大小的一个非常重要的观点(或者你可能会说怪癖)。

PE/COFF 规范确实将 VirtualSize 描述为“加载到内存中时该部分的总大小”。如果您认为 total 是包含该部分的 REAL 数据总量,这在技术上是正确的,但它不是 Windows 为该部分分配的内存总量。您会发现 VirtualSize 通常小于 Windows 为内存中的部分分配的数量,因为 VirtualSize 必须向上舍入到最接近的内存对齐值(在 PE 镜像中设置)。

换句话说,VirtualSize 表示该部分的未舍入大小,而 SizeOfRawData 是图像文件中数据的大小,但舍入到最接近的文件对齐填充值。这就是 VirtualSize 是内存或磁盘上数据真实“原始”大小的更好表示的原因。 PE/COFF 规范没有做出这种区分。为什么一个在图像文件中是圆形的,而另一个不是圆形的,这可能与向后兼容性有关。

这就是为什么您的 shellcode 使用 VirtualSize 来查找数据的“真实”端,即使它驻留在图像文件中也是如此。毫不奇怪,您可以通过将 VirtualSize 四舍五入到文件对齐值来计算 SizeOfRawData,至少在格式良好的 PE 文件中是这样。

shellcode 只是使用 VirtualSize 来找到 REAL 代码的结尾。在 SizeOfRawData 字节和 SizeOfRawData 字节之间,只是未使用的填充零,使其成为添加新代码而不影响文件大小或破坏 PE 文件内寻址偏移的主要位置。

总而言之,Windows 加载程序实质上采用 VirtualSize 值并将其四舍五入为内存对齐值以获得内存分配的实际大小(甚至可能四舍五入到最接近的 4k 最小内存页)。然后将最多 SizeOfRawData 字节从文件复制到内存部分的开头。如果小于该段在内存中的大小,则剩余部分补零。

关于c++ - PE : Adding code at the end of . txt 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44927518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com