标题: 莫名其妙的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 fffff800`89cc35c0 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 : 0xffff9806`04373080 _KTHREAD kd> ? @@(@$pcr->Prcb.CurrentThread) Evaluate expression: -114323368759168 = ffff9806`04373080 kd> ? @$thread Evaluate expression: -114323368759168 = ffff9806`04373080 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 fffff800`5d6efaa0 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