CR0~CR4是一组控制寄存器,控制寄存器是改变或者控制CPU和其他一些数字设备一般行为的寄存器,通过这些控制寄存器可以完成像中断、寻址方式切换、分页控制等任务。CR0~CR3都可以通过mov操作获取到相应的值,然而并不存在 mov eax,cr4的操作,不能够直接获取到CR4的值。CR4寄存器用于保护模式,通过CR4可以获取到诸如是否开启分页模式、是否有物理地址扩展、是否开启保护模式等信息,如果需要获取到这些信息,就需要访问CR4了,这里给出2种访问的方法。
通过内联汇编的方法(x86)
//CPP--获取CR4 ULONG ul_CR4 = 0; //mov eax ,cr4 //用机器码 _emit 0x0F _emit 0x20 _emit 0xE0 mov ul_CR4,eax //保存CR4的结果 //修改CR4 mov eax,ul_CR4 _emit 0x0F // mov cr4,eax _emit 0x22 _emit 0xE0
通过_KSPECIAL_REGISTERS结构
_KSPECIAL_REGISTERS结构体中记录了内核的特殊寄存器的值,通过该结构可以获取到诸如CR0、CR2、CR3、CR4等寄存器的值,下面的操作是在已经获取到_KPRCB的的情况下(_KPCR的获取)
通过_KPRCB获取到_KPROCESSOR_STATE
0: kd> dt _KPRCB nt!_KPRCB +0x000 MinorVersion : Uint2B +0x002 MajorVersion : Uint2B +0x004 CurrentThread : Ptr32 _KTHREAD +0x008 NextThread : Ptr32 _KTHREAD +0x00c IdleThread : Ptr32 _KTHREAD +0x010 Number : Char +0x011 Reserved : Char +0x012 BuildType : Uint2B +0x014 SetMember : Uint4B +0x018 CpuType : Char +0x019 CpuID : Char +0x01a CpuStep : Uint2B +0x01c ProcessorState : <strong>_KPROCESSOR_STATE //获取到_KPROCESSOR_STATE ...
通过_KPROCESSOR_STATE 获取到_KSPECIAL_REGISTERS
0: kd> dt _KPROCESSOR_STATE nt!_KPROCESSOR_STATE +0x000 ContextFrame : _CONTEXT +0x2cc SpecialRegisters : _KSPECIAL_REGISTERS //获取到_KSPECIAL_REGISTERS
通过获取到相关的寄存器的值
0: kd> dt _KSPECIAL_REGISTERS nt!_KSPECIAL_REGISTERS +0x000 Cr0 : Uint4B +0x004 Cr2 : Uint4B +0x008 Cr3 : Uint4B +0x00c Cr4 : Uint4B +0x010 KernelDr0 : Uint4B +0x014 KernelDr1 : Uint4B +0x018 KernelDr2 : Uint4B +0x01c KernelDr3 : Uint4B +0x020 KernelDr6 : Uint4B +0x024 KernelDr7 : Uint4B +0x028 Gdtr : _DESCRIPTOR +0x030 Idtr : _DESCRIPTOR +0x038 Tr : Uint2B +0x03a Ldtr : Uint2B +0x03c Reserved : [6] Uint4B
转载请注明:悠然品鉴 » [Windows内核]获取和修改CR4寄存器的值