Windows如何保护转换到内核模式?

noc*_*ura 13 windows winapi kernel

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

我理解这些事情是真的:

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

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

Ton*_*Lee 18

您可能认为在用户模式下运行的线程正在调用Ring 0,但这不是实际发生的事情.用户模式线程导致Ring 0代码捕获的异常.用户模式线程暂停,CPU切换到内核/环0线程,然后可以检查用户模式线程的上下文(例如,调用堆栈和寄存器)以确定要执行的操作.在系统调用之前,它实际上是一个异常,而不是特别用于调用ring 0代码的特殊异常.

如果您接受其他响应的建议并阅读英特尔手册,您将看到syscall/sysenter不接受任何参数 - 操作系统决定会发生什么.你不能调用任意代码.WINNT使用功能的数字映射到内核模式功能的用户模式代码执行(例如,NtOpenFile是我的Windows XP机器上FNC 75H(数字改变所有的时间,这是NTDLL的工作之一就是地图的功能调用fnc编号,将其放入EAX,将EDX指向传入参数,然后调用sysenter).


Fre*_*ool 9

英特尔CPU使用所谓的"保护环"来强制执行安全性.

其中有4个,从0到3编号.在0环上运行的代码具有最高权限; 它(实际上)可以用你的电脑随心所欲.另一方面,环3中的代码总是紧密牵引; 它只有有限的力量来影响事物.并且环1和2目前根本不用于任何目的.

在较高特权环(例如环0)中运行的线程可以随意转换到较低特权环(例如环1,2或3).但是,相反的过渡受到严格监管.这就是如何保持高特权资源(例如存储器)等的安全性.

当然,您的用户模式代码(应用程序和所有代码)在环3中运行,而OS的代码在环0中运行.这可确保用户模式线程不会弄乱操作系统的数据结构和其他关键资源.

有关这一切是如何被实际执行的细节,你可以阅读这个文章.此外,您可能还需要阅读英特尔手册,尤其是Vol 1和Vol 3A,您可以在此处下载.

这是英特尔处理器的故事.我确信其他架构也会有类似的东西.

  • 大多数其他处理器只打扰两个特权级别,基本上等效于x86环0和3.环1和2当时似乎是个好主意,但结果却没有为它们的复杂性增加任何价值. (2认同)

Chr*_*isW 7

我认为(我可能错了)它用于转换的机制很简单:

  • 用户模式代码执行软件中断
  • 这(中断)导致分支到中断描述符表(IDT)中指定的位置

阻止用户模式代码篡改的事情如下:你需要被授权写入IDT; 所以只有内核能够指定执行中断时会发生什么.