windows - Windows 如何保护过渡到内核模式?

标签 windows winapi kernel

Windows 如何防止用户模式线程任意将 CPU 转换为内核模式?

我明白这些事情是真的:

  1. 当通过 NTDLL 进行系统调用时,用户模式线程确实会转换到内核模式。
  2. 到内核模式的转换是通过特定于处理器的指令完成的。

那么这些通过NTDLL进行的系统调用有什么特别之处呢?为什么用户模式线程不能伪装并执行特定于处理器的指令以转换到内核模式?我知道我在这里遗漏了 Windows 体系结构的一些关键部分...它是什么?

最佳答案

您可能认为在用户模式下运行的线程正在调用 Ring 0,但实际情况并非如此。用户模式线程导致由 Ring 0 代码捕获的异常。用户模式线程暂停,CPU 切换到内核/环 0 线程,然后可以检查用户模式线程的上下文(例如,调用堆栈和寄存器)以确定要做什么。在系统调用之前,它确实是一个异常,而不是专门调用 ring 0 代码的特殊异常。

如果您采纳其他回复的建议并阅读 the Intel manuals ,你会看到 syscall/sysenter 不带任何参数——操作系统决定发生什么。您不能调用任意代码。 WinNT 使用映射到用户模式代码将执行的内核模式函数的函数编号(例如,NtOpenFile 在我的 Windows XP 机器上是 fnc 75h(数字一直在变化;NTDll 的工作之一是映射一个函数调用一个 fnc 号码,将其放入 EAX,将 EDX 指向传入参数,然后调用 sysenter)。

关于windows - Windows 如何保护过渡到内核模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1059100/

相关文章:

c++ - 为什么socket在gdb下会失败?

c++ - 使用 GDI+ 绘制文本

c++ - 将两个缓冲区合并为 Win32 管道上的单个写入

architecture - 抢占和上下文切换的区别

windows - Windows 命令解释器中历史缓冲区的押韵或原因?

c++ - 创建自定义 Windows 7 登录

c++ - 将文本/图像写入 HWND 的最短代码是什么

process - 操作系统是一个进程吗?

c - 优化流程重新启动

javascript - 打开文件时停止了 JS 执行?