Skip to content

标题: 莫名其妙的NtCurrentTeb()->ReservedForDebuggerInstrumentation[15]

创建: 2018-01-17 12:12 更新: 2018-02-07 09:57 链接: https://scz.617.cn/windows/201801171212.txt

1) PsGetCurrentThread 2) PsGetCurrentProcess 3) KeGetCurrentPrcb

1) PsGetCurrentThread

在IDA里看nt模块,经常能看到这样的F5代码:

NtCurrentTeb()->ReservedForDebuggerInstrumentation[15]

其实际操作是

? poi(gs:0x188)

x64内核态GS:0指向nt!_KPCR,x64用户态GS:0指向ntdll!_TEB,显然Hex-Rays在此给 了误导性的逆向结果。

kd> uf nt!KeGetCurrentThread kd> uf nt!PsGetCurrentThread fffff80089cc35c0 65488b042588010000 mov rax,qword ptr gs:[188h] fffff80089cc35c9 c3 ret

kd> rdmsr[0xC0000101] kd> rdmsr 0xC0000101 msr[c0000101] = fffff800`88e26000

windbg中没必要读MSR,有伪寄存器:

kd> ? @$pcr Evaluate expression: -8793796485120 = fffff800`88e26000

kd> dt nt!_KPCR Prcb.CurrentThread +0x180 Prcb : +0x008 CurrentThread : Ptr64 _KTHREAD kd> dt nt!_KPCR Prcb.CurrentThread @$pcr +0x180 Prcb : +0x008 CurrentThread : 0xffff980604373080 _KTHREAD kd> ? @@(@$pcr->Prcb.CurrentThread) Evaluate expression: -114323368759168 = ffff980604373080 kd> ? @$thread Evaluate expression: -114323368759168 = ffff980604373080 kd> ? poi(gs:0x188) Evaluate expression: -114323368759168 = ffff980604373080

注意伪寄存器@$pcr、@$thread的使用。

以后看到莫名其妙的NtCurrentTeb()->ReservedForDebuggerInstrumentation[15], 直接将赋值操作的目标变量改名成CurrentThread之类的,然后指定类型PETHREAD。

2) PsGetCurrentProcess

IDA中还会看到:

((_QWORD )NtCurrentTeb()->ReservedForDebuggerInstrumentation[15] + 23)

这又是什么鬼呢?这是取从ETHREAD开始的偏移0xB8处的成员,为什么是0xB8:

23 * 8 = 184 = 0xB8

它取的是:

KeGetCurrentThread()->ApcState.Process

kd> dt nt!_ETHREAD Tcb.ApcState.Process +0x000 Tcb : +0x098 ApcState : +0x020 Process : Ptr64 _KPROCESS

前面那段鬼代码正是nt!PsGetCurrentProcess:

kd> uf nt!PsGetCurrentProcess fffff8005d6efaa0 65488b042588010000 mov rax,qword ptr gs:[188h] fffff8005d6efaa9 488b80b8000000 mov rax,qword ptr [rax+0B8h] fffff800`5d6efab0 c3 ret

将赋值操作的目标变量改名成CurrentProcess之类的,然后指定类型PEPROCESS。

3) KeGetCurrentPrcb

IDA中还会看到:

NtCurrentTeb()->NtTib.FiberData

如果在内核态,这实际是:

Prcb = KeGetCurrentPrcb();

kd> dt nt!_KPCR CurrentPrcb +0x020 CurrentPrcb : Ptr64 _KPRCB kd> dt ntdll!_TEB NtTib.FiberData +0x000 NtTib : +0x020 FiberData : Ptr64 Void