1.从ring0到ring3最开始是用的int2E,此模式切换过程设计不少次内存访问,还有两次查表操做机访问权限的检查,这致使模式切换的开销很大从PentiumII 处理器开始,Inter引入了新的指令sysenter/sysexit,来实现快速的模式切换。函数
2.其作法尽量避免内存访问,而经过处理器的内部寄存器来指定必要信息。sysenter使用3个MSR寄存器来指定跳转目的地址和栈位置。 能够在内核模式下经过 rdmsr/wrmsr 指令来设置这3个寄存器。(可想而知,在这能够HOOK)设计
HOOk代码:指针
NTSTATUS HookSYSENTER()
{
_asm mov ecx,0x176; // IA32_SYSENTER_EIP 在MSR的偏移为0x176
_asm rdmsr; // 将ECX+MSR在GDT所指向的值加载到 EDX:EAX
_asm mov OrigKiFastCallEntry,eax;
_asm mov eax,MyKiFastCallEntry;
_asm wrmsr; // 将 EDX:EAX 中的值写入ECX+MSR在GDT所指向地方
return STATUS_SUCCESS;
}blog
OrigKiFastCallEntry 是内核模式的入口函数,从ring0到ring3 入口点ip
3.sysenter 内部指令:
1.将IA32_SYSENTER_CS 和IA32_SYSENTER_EIP分别装到cs和eip寄存器中
2.将IA32_SYSENTER_CS+8 和IA32_SYSENTER_ESP 分别装载到ss和esp寄存器中,切换特权级0;内存
4.sysexit指令,它内部逻辑是:
1.将IA32_SYSENTER_CS+16装载到cs寄存器,将edx寄存器中的指令的指针装载到eip;
3.将IA32_SYSENTER_CS+24装载到ss寄存器中;
4.将ecx寄存器中的指针装载到esp中,切换到特权3.it
5.sysenter / sysexit 只使用固定值,或寄存器的值来完成跳转,从而达到快速切换代码段和栈段的目的。asm
流程以下:ast