【问题标题】:Memory Address files内存地址文件
【发布时间】:2015-01-08 04:52:18
【问题描述】:

我对文件中的偏移量有疑问。例如“.exe”扩展名/文件,当您打开这样的文件时。

handle = open('file.exe', mode='rb')

现在,当您尝试访问第 10 个“字节”时,您可以使用 seek 功能。

handle.seek(10, 0) 

PE 头中的很多值都是 RVA 的,这意味着 Imagebase + RVA 是加载到内存中时的偏移量。问题是你不能用这个值来寻找。例如:

.idtata 部分有一个虚拟地址 (RVA) 和一个原始地址(基于图像)。现在使用前面的方法,您可以使用原始地址在正确的偏移量处读取。对于很多值,只给出了它不起作用的 RVA。

以这种方式打开文件从 0 开始,当加载到内存中时,大多数时候镜像库是 0x00400000。有没有办法可以将文件加载到内存中,从而在将文件加载到内存时使用精确的偏移值?因此,文件不是从 0 开始,而是从图像库开始,以便您可以查找 RVA?

致以诚挚的问候,

【问题讨论】:

  • 请注意,您不会“将 [executable] 文件加载到内存中”——操作系统会这样做。我认为对此没有明确的答案 - 请参阅memory address randomization

标签: python memory file-io portable-executable


【解决方案1】:

如果您使用的是 Windows,则可以让 Image Loader 为您将 PE 图像加载(即解压缩)到内存中。然后,您就可以直接使用 RVA(相对于图像库)来定位您想要的数据。

另一种选择是实现一些函数来解析 PE 标头和节表。节表包含有关 PE 文件中每个 节 的信息,例如它在文件中的位置(原始文件偏移量),以及它应该在内存中解包的位置,相对于图像库地址。通过节表,您可以编写一个函数,将 RVA 转换为相应的原始文件偏移量。

您应该注意的唯一一件事是,并非每个 RVA 都可以映射回文件偏移量。例如,许多节的末尾都有一个零初始化数据的区域,这在二进制文件中没有明确表示。相反,加载器会在加载时根据每个节的虚拟大小(也可以在节表条目中找到)用零填充这些节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2018-09-17
    • 2012-03-05
    • 2018-10-22
    • 1970-01-01
    • 2014-09-06
    • 2011-10-15
    相关资源
    最近更新 更多