【Windows内核】(4) 数据段权限检查

数据段权限检查

一、CPL DPL RPL

CPL :CPL是当前执行的程序或任务的特权级。它被存储在CS和SS的第0位和第1位上。通常情况下,CPL代表代码所在的段的特权级。当程序转移到不同特权级的代码段时,处理器将改变CPL。只有0和3两个值,分别表示用户态和内核态。

DPL :如果你想访问我,你应该具备什么样的权限

RPL :用什么权限去访问一个段 RPL是通过段选择子的第0和第1位表现出来的。

数据段权限检查遵循以下规则:

CPL<=DPL RPL<=DPL (数值上的比较)

2、如何查看程序处于几环?

CPL(Current Privilege Level) :当前特权级

CS和SS中存储的段选择子后2位为CPL

3、DPL(Descriptor Privilege Level) 描述符特权级别

DPL存储在段描述符中,规定了访问该段所需要的特权级别是什么.

通俗的理解:

如果你想访问我,那么你应该具备什么特权.

举例说明:

mov DS,AX

如果AX指向的段DPL = 0 但当前程序的CPL = 3 这行指令是不会成功的!

4、RPL(Request Privilege Level) 请求特权级别

RPL是针对段选择子而言的,每个段的选择子都有自己的RPL。

练习

<1> 在3环能加载的数据段有哪些?
3环CPL=3,只能加载DPL=3的数据段。

<2> 在0环能加载的数据段有哪些?
0环CPL=0,满足RPL<=DPL的数据段都可以加载。

<3> 详细描述这下面代码的执行过程:
mov ax,0x23
mov ds,ax
段选择子是0x0023,RPL=11b=3,属于最低权限,只能访问DPL=3的数据段。而CPL则无影响,不管是0环还是3环,都满足CPL<=RPL,只要RPL满足,CPL也一定满足。

当执行 mov ds,ax 时,CPU先解析段选择子0023,然后去GDT表找段描述符,检查段描述符P位是否有效,然后检查S位,确认是数据段或代码段,然后检查TYPE域确认是数据段,然后看DPL是否等于3.只要上述条件都满足,则mov指令执行成功,只要有一条不满足,mov失败。

posted @ 2021-03-08 09:32  一窝吉尼斯  阅读(185)  评论(0)    收藏  举报