如何检查我是否在 x64 CPU 上的 ring 0 / ring 3 中运行

逆向工程 内核模式 x86-64
2021-06-26 20:16:50

我读过可以用 CS 寄存器的第 3 位检查环电平。

是否有另一个寄存器真正包含环值(2 位)

1个回答

你在找这个吗?

0:002> dx (( ntdll!_KTHREAD *) @$thread)->PreviousMode
(( ntdll!_KTHREAD *) @$thread)->PreviousMode : 0 [Type: char]
0:002> ?? (( ntdll!_KTHREAD *) @$thread)->PreviousMode
char 0n0 ''

或在 kmode

0: kd> dq gs:[188] l1
002b:00000000`00000188  ffff8889`d75ce080
0: kd> ? @$thread
Evaluate expression: -131349371625344 = ffff8889`d75ce080
0: kd> dx @$thread->Tcb.PreviousMode
@$thread->Tcb.PreviousMode : 1 [Type: char]
0: kd> uf nt!ExGetPreviousMode
nt!ExGetPreviousMode:
fffff804`41c45f00 65488b042588010000 mov   rax,qword ptr gs:[188h]
fffff804`41c45f09 0fb68032020000  movzx   eax,byte ptr [rax+232h]
fffff804`41c45f10 c3              ret
0: kd> ?? #FIELD_OFFSET(nt!_KTHREAD , PreviousMode)
long 0n562
0: kd> ? 0n562
Evaluate expression: 562 = 00000000`00000232