总有人间一两风,填我十万八千梦

[Windows内核]获取和修改CR4寄存器的值

Windows C/C++ Zero、J 4620℃ 0评论

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寄存器的值

喜欢 (1)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址