【发布时间】:2014-06-17 06:27:10
【问题描述】:
我知道在 32 位架构中,内核模式虚拟内存映射在 0x80000000 和 0xFFFFFFFF 之间。
它包含一些结构,如EPROCESS、ETHREAD ...等,还有当前进程的页面目录和表。
虽然尝试获取某个函数的虚拟地址是 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