【发布时间】:2012-12-26 05:12:38
【问题描述】:
我已经尝试了大约两天,但没有成功。我一直在阅读许多 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段),对段中的所有位进行按位运算,并在下一段之前结束操作。
我不希望它看起来像我期待一个勺子,我只是想要一些澄清。
感谢您的时间/帮助,非常感谢。
【问题讨论】:
标签: c++ c portable-executable