内存地址文件

时间:2014-11-11 15:24:47

标签: python memory file-io portable-executable

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

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

现在,当您尝试访问第10个“Byte”时,你可以使用搜索功能。

handle.seek(10, 0) 

PE标头中的许多值都是RVA,这意味着Imagebase + RVA是加载到内存中时的偏移量。问题是你无法寻求这个价值。例如:

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

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

with Kinds Regards,

1 个答案:

答案 0 :(得分:0)

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

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

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