如何在 PE 文件中获取重定位的基地址?
How to get relocated base address in PE Files?
我正在尝试制作 Simple PE Packer。我的 PE 查看器显示基地址 0x40000000
,但 OllyDbg 显示 0x01900400
或其他地址。
估计是地址重定位
- 如何获取搬迁地址?
- 什么使打包程序成为简单序列?
一个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