如何在 PE 文件中获取重定位的基地址?

How to get relocated base address in PE Files?

我正在尝试制作 Simple PE Packer。我的 PE 查看器显示基地址 0x40000000,但 OllyDbg 显示 0x01900400 或其他地址。

估计是地址重定位

  1. 如何获取搬迁地址?
  2. 什么使打包程序成为简单序列?

一个PE文件有一个首选基地址。如果您正在编写 PE 查看器,那么听起来它只会分析 PE 文件。这是一个静态分析,所以你只会得到首选的基址,即 0x40000000.

OllyDbg 是一个调试器,它与 PE 查看器完全不同。调试器在运行时执行动态分析。在运行时,PE 文件可能已加载到不同的地址,因为首选地址已被使用。

因此,在我看来,您的 PE 查看器程序做了它应该做的事情 - 除非您想编写调试器。

Thomas 已经解释过,基地址只是一个首选地址,它不能保证您的文件只会加载到该地址。 尽管如此,在大多数情况下,它应该是 400000。如果您使用的是 Windows XP,则大多数情况下都满足此条件。但是从 Windows Vista 和 Windows 7 开始,引入了一个称为 ASLR 的新概念。 当您在调试器中加载文件时看到其他地址时,这是因为 ASLR(Address Space Randomization).

什么是 ASLR? Address Space Layout Randomization 根据处理器的时间戳计数器计算PE文件在内存中的地址。 公式 = ([SHR4(时间戳计数器) mod 254] + 1)*64KB **公式需要确认

为什么选择 ASLR? ASL 背后的主要座右铭是阻止恶意软件作者使用各种内存结构缺陷,如缓冲区溢出等。随机排列的内存结构和 mod 规则猜测内存地址(他们希望放置恶意代码的位置)对他们来说很难。

现在,回到您的问题:如何获得搬迁地址: 如果你能找到 CPU 时间戳,我怀疑这是可能的,你可以计算可执行文件的基本位置。How to bypass ASLR

否则,您无法在 ASLR 之后从 PE 文件结构中检索此地址(对于 Windows Vista 及更高版本)。

另外,你可以参考这个: https://security.stackexchange.com/questions/18556/how-do-aslr-and-dep-work