我知道在 32 位架构中,内核模式虚拟内存映射在 0x80000000
和 0xFFFFFFFF
之间。
它包含一些结构,例如 EPROCESS
、 ETHREAD
...等,以及当前进程的页目录和表。
当尝试获取某个函数的虚拟地址是 ntoskrnl 时,比如说“nt!NtReadFile”,我发现它被映射到内核虚拟地址 0x89421130
中。
我尝试使用随机指令在 RET
之后修补一些 nops,当切换到另一个进程上下文时,我发现我放置的指令仍然存在。
这是否意味着加载 Ntoskrnl 的虚拟内存在每个进程虚拟地址空间中保持不变?
谢谢。
最佳答案
Does that mean that virtual memory where Ntoskrnl is loaded stays unchanged in every process virtual address space?
是的。在运行的 Windows 系统上,内存中存在一份内核拷贝,并且完全相同的内核地址空间(即 32 位上的 0x80000000-0xFFFFFFFF
)被映射到每个进程。
关于c++ - Windows 虚拟内存和内核模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23396475/