【问题标题】:Getting the offset to .text section code PE file format? VirtualAddress, PointerToRawData?获取 .text 部分代码 PE 文件格式的偏移量?虚拟地址,指针到原始数据?
【发布时间】: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


    【解决方案1】:

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

    我希望这会有所帮助。

    【讨论】:

    • 好的,谢谢。为了澄清每当我打开带有文件映射的文件时,这意味着我将不得不处理 SectionAlignment 和 RVA 吗?并且像节表中的 PointerToRawData 这样的值将不如 VirtualAddress 有用?
    • 不,对不起,我无意中误导了:当我说映射到内存时,我的意思是当操作系统作为可执行模块加载时。使用内存映射这一事实不会改变您将图像作为文件访问的事实,因此您需要使用 PointerToRawData 值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2017-04-12
    • 1970-01-01
    • 2015-07-09
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多