三环进入零环的细节(KiFastCallEntry函数分析)
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
三环进入零环的细节(KiFastCallEntry函数分析)
1. 从三环进入零环的方式
从三环进入零环,其存在两种:快速调用与中断调用int21
对于如何进入,取决于一个数据结构 _KUSER_SHARED_DATA,该数据结构是三环与零环的共享内存。
该结构中 _KUSER_SHARED_DATA+0x300(SystemCall)与+0x304(SystemCallReturn),分别记录了从进入内核与退出内核的函数。
当操作系统初始化时,其会通过CPUID指令查询当前CPU是否支持快速调用,如果支持则这里填写通过快速调用进入零环,否则通过中断进入零环。
快速调用的本质就是借助MSR寄存器保存一部分三环的寄存器,不用保存到内存中,这样加快进入零环的速度。
2. KiSystemService与KiSerivceExit函数
如果是快速调用,则是KiServiceExit函数进入零环;如果是中断,则通过KiSystemService进入零环。
但是,注意,KiSystemService 最终会执行到 KiServiceExit 的一部分,然后继续往下执行,其效果如下:
3.系统服务表 SSDT/SSSDT
下面这篇博客详细介绍了系统服务描述符表中的函数,很好理解。
4. KiFastCallEntry函数分析