大多数这些结构可以用windbg查询
如果你在用户模式下运行 ntdll.pdb 有这些类型信息
如果你在内核模式下运行 ntos/ntkr/ aka nt*.pdb 有这些类型信息
您可以使用来自 sysinternals 的 livekd 和windbg 之类的工具来进行本地内核调试会话
以下是 win7 x86 机器上 livekd 的输出,命令尽可能与操作系统/版本无关
当前进程可以查询为?@$proc
kd> ? @$proc
Evaluate expression: -2050188616 = 85cc9ab8
kd>
在一个问号?代表您可以使用的 masm 表达式评估器?? 问号打开 C++ 表达式评估器
kd> ?? @$proc->UniqueProcessId
void * 0x00000538
kd>
上面Current process pid 也用@$tpid 表示
kd> ? @$tpid
Evaluate expression: 1336 = 00000538
kd> ?? @$tpid
unsigned int 0x538
kd>
pcr 由@$pcr表示
您可以混合和匹配表达式求值器 @@() 允许您将 C++ 表达式插入到 masm 求值中
kd> ? @$pcr
Evaluate expression: -2097779712 = 82f66c00
kd> ? @@(@$pcr->PrcbData.CurrentThread)
Evaluate expression: -2048806120 = 85e1b318
kd>
在我的系统中 PsGetCurrentProcess 如下
kd> uf nt!PsGetCurrentThread
nt!PsGetCurrentThread:
82e72b99 64a124010000 mov eax,dword ptr fs:[00000124h]
82e72b9f c3 ret
kd>
您可以直接获取该段的原始内容:offset
kd> ? poi(fs:00000124)
Evaluate expression: -2048806120 = 85e1b318
kd>
当前线程由@$thread表示
kd> ? @$thread
Evaluate expression: -2048806120 = 85e1b318
kd>
ApcState 不是数组而是结构
kd> ?? @$thread->Tcb.ApcState
struct _KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY [ 0x85e1b358 - 0x85e1b358 ]
+0x010 Process : 0x85cc9ab8 _KPROCESS
+0x014 KernelApcInProgress : 0 ''
+0x015 KernelApcPending : 0 ''
+0x016 UserApcPending : 0 ''
kd>
您可以在这样的帖子中获得对 Process 提及的偏移量
kd> ?? &(@$thread->Tcb.ApcState.Process)
struct _KPROCESS ** 0x85e1b368
kd> ?? *(unsigned long *)&(@$thread->Tcb.ApcState.Process)
unsigned long 0x85cc9ab8
kd>
在我的系统中 PsGetCurrentProcss 如下
kd> uf nt!PsGetCurrentProcess
nt!PsGetCurrentProcess:
82ec5fce 64a124010000 mov eax,dword ptr fs:[00000124h]
82ec5fd4 8b4050 mov eax,dword ptr [eax+50h]
82ec5fd7 c3 ret
kd>
原始查询
kd> ? poi(30:124)
Evaluate expression: -2048806120 = 85e1b318
kd> ? poi(poi(30:124)+50)
Evaluate expression: -2050188616 = 85cc9ab8
kd>
表达式查询
kd> ? @@(@$prcb->CurrentThread->ApcState.Process)
Evaluate expression: -2050188616 = 85cc9ab8
kd>