我对文件中的偏移有疑问。例如" .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,
答案 0 :(得分:0)
如果您使用的是Windows,则可以将Image Loader加载(即解压缩)PE映像到内存中。然后,您可以相对于图像库直接使用RVA来定位所需的数据。
另一种选择是实现一些函数来解析PE头和节表。节表包含有关PE文件中每个节的信息,例如它在文件中的位置(原始文件偏移量),以及它应该在内存中解压缩的位置,相对于图像库地址。通过section表,您可以编写一个函数,将RVA转换为相应的原始文件偏移量。
您唯一应该注意的是,并非每个RVA都可以映射回文件偏移量。例如,许多部分在末尾具有零初始化数据的区域,该区域未在二进制文件中明确表示。相反,加载程序将在加载时根据每个部分的虚拟大小(也在部分表条目中找到)用零填充这些部分。