sysenter/sysexit 原理

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

相关文章
相关标签/搜索