【发布时间】:2020-06-19 23:37:47
【问题描述】:
所以,我试图读取一个 DLL 文件,一切都很好,直到我到达可选头数据目录,特别是它的第一个成员,导出表。
我的问题是我无法移动阅读器的偏移量,因为虚拟地址成员基于内存 VA,而我的阅读器基于文件偏移量。愿一个可视化的例子有帮助:
如您所见,此 PE 查看器从数据目录(可选标头)的导出表地址处读取的加载虚拟地址为值 0x00002630(从现在开始将其称为 hex1)。
但是,当我单击导出表查看实际内容时,程序会将此地址从内存转换为文件偏移量,结果将我重定向到此地址:
它重定向我的地址是 0x00001a30(从现在开始我们将其称为 hex2)。
我自己做了一些测试,比如将 hex1 除以 8,因为我认为它可能是从 4096 的内存对齐和 512 的文件对齐的过渡,但它没有给我与 hex2 相同的结果。我也做了一些奇怪的事情来尝试得到这个公式,但它给了我更奇怪的结果。
所以,我的问题是,如果我只知道数据目录 (hex1) 的内存偏移量,我如何获取/计算该文件偏移量(hex2)?
【问题讨论】: