Windows用户态到内核态

Windows提供了API接口供程序使用,可以使用操作系统提供的功能。

大部分的API具体实现代码都在内核态R0层,用户态R3层的接口仅仅只有一小部分代码,用于调用内核态的代码。

早期的OS一般都通过中断门来实现从R3级切换到R0级,比如Linux下的int 80h、Windows NT和Windows 2000下的int 2eh。

在Windows 2000中通过中断指令int 2E进入内核态,EAX寄存器保存函数编号,用于在系统服务表中找到对应的函数。

int 2E会找到IDT表中索引为0x2E对应的函数,在windbg中可以使用!idt 2E指令查看分发系统服务函数的函数为nt!KiSystemService

通过中断调用系统服务,切换过程繁琐,CPU必须从内存中分别加载门描述符和段描述符才能得到KiSystemService()的地址,速度慢,还需要进行权限检查。

 

为了实现快速系统调用,奔腾Ⅱ处理器引入了Sysenter/SYSEXIT指令,AMD K7引入了SYSCALL/SYSRET指令。

Windows XP及以后采用快速系统调用sysenter和sysexit来进行系统调用和返回。在64位系统下使用syscall指令进行系统调用。

 

在全局描述符中存放了建立四个断描述符。

供SYSENTER指令使用的MSR寄存器如下:

SYSENTER_CS_MSR    MSR地址为174h     含义为:目标代码段的CS选择子   在windbg中使用  rdmsr 174

SYSENTER_ESP_MSR  MSR地址为175h     含义为:目标ESP    在windbg中使用  rdmsr 175

SYSENTER_EIP_MSR   MSR地址为176h     含义为:目标EIP     在windbg中使用  rdmsr 176   对应nt!KiFastCallEntry

下面是系统调用的指令分别对应入口函数及返回指令、函数

INT 2E    对应KiSystemService   返回指令 iret  返回时的内核函数 KiSystemCallExit

sysenter 对应KiFastCallEntry      返回指令  sysexit  返回时的内核函数 KiSystemCallExit2

syscall    对应KiFastCallEntry      返回指令  sysret  返回时的内核函数 KiSystemCallExit2

 

从内核态到用户态可以通过如下方式:

nt!KeUserModeCallback   这是通过传入一个索引值,然后在PEB中的kernelcallbacktable表中寻找对应函数,调用完成后通过CallBackReturn类似函数中的 int 2B指令返回内核。

posted @ 2022-10-26 22:01  psj00  阅读(352)  评论(0)    收藏  举报