【问题标题】:Windows virtual memory and kernel modeWindows 虚拟内存和内核模式
【发布时间】:2014-06-17 06:27:10
【问题描述】:

我知道在 32 位架构中,内核模式虚拟内存映射在 0x800000000xFFFFFFFF 之间。

它包含一些结构,如EPROCESSETHREAD ...等,还有当前进程的页面目录和表。

虽然尝试获取某个函数的虚拟地址是 ntoskrnl,但假设是“nt!NtReadFile”,我发现它映射到内核虚拟地址 0x89421130 中。

我尝试在RET 之后使用随机指令修补一些 nop,当切换到另一个进程上下文时,我发现我输入的指令仍然存在。

这是否意味着加载 Ntoskrnl 的虚拟内存在每个进程虚拟地址空间中保持不变?

谢谢。

【问题讨论】:

  • afaik 这不应该发生,因为这些内核页面正在为每个进程从物理内存映射到虚拟内存。您也不应该能够实际修改这样的页面,因为它们是代码页。页管理器应阻止对代码页的写访问。我不是很喜欢 os dev,但如果你没有运气,你可以在这里问:wiki.osdev.org/Main_Page(见论坛)
  • DLL 函数和数据在进程之间共享。这就是重点。
  • 其实我是在WinDbg下使用内核模式调试打补丁的
  • 内核例程是独一无二的,它们通常驻留在非分页池中。重复的是用于访问它们的表和结构,因为它们通常具有每个 CPU 的数据。我不记得 Windows 操作系统的内部结构,但在深入研究类似的东西之前,你绝对应该学习内核驱动程序编程。另外:假设您有权限这样做并且您可以在那里修补一些字节,请记住,除非您知道自己在做什么,否则修补/修改内核内存肯定会导致灾难(堆栈保护会让您呕吐)。
  • @Marco: 很多 Windows 内核函数不在 NPP 中(因此不能在高 IRQL 下调用)。此外,修补代码不会触发堆栈保护 - 它不在堆栈上。您可能会想到 PatchGuard。

标签: c++ c windows memory internals


【解决方案1】:

这是否意味着加载 Ntoskrnl 的虚拟内存在每个进程虚拟地址空间中保持不变?

是的。在运行的 Windows 系统上,内存中有一个内核副本,并且完全相同的内核地址空间(即 32 位上的 0x80000000-0xFFFFFFFF)映射到每个进程。

【讨论】:

    猜你喜欢
    • 2020-05-21
    • 2011-12-05
    • 2022-01-12
    • 1970-01-01
    • 2015-07-08
    • 2020-10-15
    • 2014-01-22
    • 2012-01-18
    • 2015-09-01
    相关资源
    最近更新 更多