我一直试图这样做大约两天,没有成功。我一直在阅读许多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部分)并对该部分中的所有位执行按位操作,并在下一部分之前结束操作。
我不希望它看起来像我期待的勺子,我只是想要一些澄清。
感谢您的时间/帮助,非常感谢。
答案 0 :(得分:5)
我没有碰巧有规范或任何PE代码供我参考(我在我的iPad上用沙发写这篇文章;)但要实现的关键点是有两个模式要考虑:所有关于RVAs的讨论仅在PE映射到内存并且对齐有页面对齐时才相关。当您从磁盘读取文件时,偏移量是文件偏移量,每个部分都使用文件对齐。
我希望这会有所帮助。