获取.text段代码PE文件格式的偏移量? VirtualAddress,PointerToRawData?

时间:2012-12-26 05:12:39

标签: c++ c portable-executable

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

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

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

根据我在PE文档中读到的,PointerToRawData是磁盘上部分中数据的第一个字节的假设偏移量(RVA ???)(我是否正确?),并且是对齐的倍数值(512)。问题是如何设置此值,以获取可用于访问节的数据的指针。在内存映射文件上,最好使用(VirtualAddress值+ imagebase值)来查找该节的第一个字节吗?

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

我希望这会有所帮助。