【问题标题】:Is the PEB address (0x07FFDA00) a RVA from the base addr of the loaded process?PEB 地址 (0x07FFDA00) 是否是来自已加载进程的基地址的 RVA?
【发布时间】:2013-05-24 11:12:18
【问题描述】:

我正在尝试使用 C/ASM 中的 PEB 结构,但在我想了解一些基础知识之前。 我在某处读到大多数进程的PEB 地址为0x07FFDA00

现在这个地址是相对于进程基地址的,即(0x00400000 + 0x07FFDA00 == PEB base addr)

因为所有进程当然不能将其PEB 发送到此地址。

【问题讨论】:

  • 为什么不用NtQueryInformationProcess 查找而不是假设?
  • 因为只是一个虚拟地址,所以每个进程都可以是一样的。它不是 RVA - 内存中的东西很少是 RVA,RVA 更像是 PE。 fs:[30](32bit)或gs:[0x60](64bit)直接指向PEB,不需要偏移。顺便说一句,他们不是说 0x7FFDA000 吗?此外,进程并没有真正的基地址,图像有。

标签: c windows assembly


【解决方案1】:

因为所有进程当然不能将它们的PEB发送到这个地址。

如果0x07FFDA000x00400000 一样是一个虚拟地址,那么所有进程都可以在这个地址上拥有它们的PEB

正如您在this thread 中看到的,0x07FFDA00 不是RVA,它只是相对于进程物理地址的VA,因此0x00400000 + 0x07FFDA00 没有任何意义。

您可以使用 NtQueryInformationProcess 进行检查,例如:

DWORD pid = GetCurrentProcessId();
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
PROCESS_BASIC_INFORMATION pbi;
NTSTATUS status = NtQueryInformationProcess(hProcess,
                                            ProcessBasicInformation,
                                            &pbi,
                                            sizeof(pbi),
                                            NULL);
PPEB peb_addr = pbi.PebBaseAddress;

【讨论】:

  • 好的,谢谢,实际上,虚拟地址只是为了让事情变得更简单?所以每个进程都有一个从 0x0 到 0xFFFFFFFF 的虚拟地址空间?最后,7FFDA00-400000 是 RVA 吗?嗯,我会挖掘物理地址空间和 VAS。谢谢
  • RVA 确实与某些 VA 相关,但它仅在图像文件在虚拟内存空间中重定位的情况下才有意义。这里没有 RVA。有关 VA/RVA 的更多信息,请参阅this thread
  • 好吧,最后一个问题...对某些人来说这听起来很容易,但我仍然想知道。再次感谢
猜你喜欢
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多