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

Jam*_*mes 0 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部分)并对该部分中的所有位执行按位操作,并在下一部分之前结束操作.

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

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

500*_*ror 5

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

我希望这有帮助.