标题: 莫名其妙的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]
fffff800
89cc35c9 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 = ffff9806
04373080
kd> ? @$thread
Evaluate expression: -114323368759168 = ffff980604373080
kd> ? poi(gs:0x188)
Evaluate expression: -114323368759168 = ffff9806
04373080
注意伪寄存器@$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]
fffff800
5d6efaa9 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