【问题标题】:I am confused about PE file relocations我对 PE 文件重定位感到困惑
【发布时间】:2021-03-06 02:22:55
【问题描述】:

维基百科是这样说搬迁的:

PE 文件通常不包含与位置无关的代码。反而 它们被编译为首选基地址,并且所有地址 编译器/链接器发出的提前修复。如果一个 PE 文件 无法在其首选地址加载(因为它已被占用 通过别的东西),操作系统将重新设置它。这涉及 重新计算每个绝对地址并修改代码以使用 新的价值观。加载程序通过比较首选和实际 加载地址,并计算增量值。然后将其添加到 提供内存新地址的首选地址 地点。基本重定位存储在列表中,并根据需要添加, 到现有的内存位置。

我很困惑为什么0x00400000(默认首选基地址)除了进程的基地址之外还有其他内容。我的理解是,在虚拟内存中,进程可以看到一个空的内存空间,它是唯一存在的东西。考虑到这一点,最初在流程本身之前会有什么东西?

【问题讨论】:

  • DLL 很重要,DLL 也是 PE 文件。在 0x00400000 加载 EXE 的天数大约超过 as well

标签: winapi portable-executable


【解决方案1】:

事实上,在大多数情况下,当进程启动时,首选基地址没有问题!在某些情况下,例如“Process Hollowing”(一种应用程序替换内存中另一个应用程序的技术),首选基地址是必须处理的重要问题。有关与首选地址相关的此问题的更多(低级)技术详细信息,请参阅以下链接。

Introduction to Process Hollowing

【讨论】:

  • 是的,这就是我感到困惑的地方。我不相信这些进程会共享内存空间,所以 0x00400000 在它的内存视图中不会总是可供进程使用吗? ASLR 是否不太可能在其首选基址上生成进程?
  • 是的,因为有了 ASLR,我们不能再依赖进程会在其首选基址启动。
  • 我已经实现了你给我的链接中提供的代码。每当我运行它时,它都会说源库始终位于0000000000400000,但随后又说目标库是00007FF68CE20000。你能解释一下为什么我会得到这个输出吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多