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