0

我一直在尝试这样做大约两天,但没有成功。我一直在阅读许多 PE 文件格式教程,但无济于事。

我通过完美工作的 CreateFileMapping 将 32 位可执行文件映射到内存中。然后我的程序循环遍历节标题,并根据我的默认特征检查特征(以确保该部分是可执行的并且是代码)。如果为真,则程序将 (PIMAGE_SECTION_HEADER) 指针返回到该节标题(程序到目前为止运行良好)。

现在我有了指针,当我计算条目时,结构中有两个特定的条目让我感到困惑,那就是 PointerToRawData 和 VirtualAddress;VirtualSize = 4096,PointerToRawData = 1536。

从我在 PE 文档中读到的内容来看,PointerToRawData 是一个假定的偏移量(RVA???)到磁盘部分中数据的第一个字节(我正确吗?),并且是对齐值的倍数(512 )。问题是我应该将此值设置为什么,以获得可用于访问该部分数据的指针。在内存映射文件上,使用 (VirtualAddress value + the imagebase value) 来查找该部分的第一个字节会更好吗?

另一个混淆点是 VirtualSize 与 SizeOfRawData。这让我很困惑,因为在这篇文章 - http://msdn.microsoft.com/en-us/library/ms809762.aspx中,它说“SizeOfRawData 字段(似乎有点用词不当)稍后在结构中包含四舍五入的值”但我的 VirtualSize 大于我的 SizeOfRawData 值,这导致我应该使用哪个混淆。

该程序的目标是找到可执行段(.text 段)并对段中的所有位进行按位操作,并在下一段之前结束操作。

我不希望它看起来像我期待一个勺子,我只是想要一些澄清。

感谢您的时间/帮助,非常感谢。

4

1 回答 1

5

我碰巧手边没有规范或任何 PE 代码可供参考(我正在沙发上的 iPad 上写这个;)但要意识到的关键点是有两种模式需要考虑:全部讨论仅当 PE 映射到内存并且对齐存在页面对齐时,RVA 的数量才相关。当您从磁盘读取文件时,偏移量是文件偏移量,并且每个部分都使用文件对齐方式。

我希望这有帮助。

于 2012-12-26T05:19:51.393 回答