PsGetCurrentProcess
PsGetCurrentThread
这2个函数
前者是获取当前进程
后者是获取当前线程。
--------
他们的反汇编代码如下
lkd> u IoGetCurrentProcess
nt!PsGetCurrentProcess:
8052c2ee 64a124010000 mov eax,dword ptr fs:[00000124h]
8052c2f4 8b4044 mov eax,dword ptr [eax+44h]
8052c2f7 c3 ret
lkd> u PsGetCurrentThread
nt!PsGetCurrentThread:
8052c312 64a124010000 mov eax,dword ptr fs:[00000124h]
8052c318 c3 ret
------------------------
可以看出都操作了FS寄存器。
而FS寄存器其实就是
_KPCR
结构
这个结构如下:
lkd> dt _kpcr
nt!_KPCR
+0x000 NtTib : _NT_TIB
+0x01c SelfPcr : Ptr32 _KPCR
+0x020 Prcb : Ptr32 _KPRCB
+0x024 Irql : UChar
+0x028 IRR : Uint4B
+0x02c IrrActive : Uint4B
+0x030 IDR : Uint4B
+0x034 KdVersionBlock : Ptr32 Void
+0x038 IDT : Ptr32 _KIDTENTRY
+0x03c GDT : Ptr32 _KGDTENTRY
+0x040 TSS : Ptr32 _KTSS
+0x044 MajorVersion : Uint2B
+0x046 MinorVersion : Uint2B
+0x048 SetMember : Uint4B
+0x04c StallScaleFactor : Uint4B
+0x050 DebugActive : UChar
+0x051 Number : UChar
+0x052 Spare0 : UChar
+0x053 SecondLevelCacheAssociativity : UChar
+0x054 VdmAlert : Uint4B
+0x058 KernelReserved : [14] Uint4B
+0x090 SecondLevelCacheSize : Uint4B
+0x094 HalReserved : [16] Uint4B
+0x0d4 InterruptMode : Uint4B
+0x0d8 Spare1 : UChar
+0x0dc KernelReserved2 : [17] Uint4B
+0x120 PrcbData : _KPRCB
----------
+0x120 PrcbData : _KPRCB
+0x000 MinorVersion : Uint2B
+0x002 MajorVersion : Uint2B
+0x004 CurrentThread : Ptr32 _KTHREAD //后者就是根据该成员取得当前线程的
+0x008 NextThread : Ptr32 _KTHREAD
+0x00c IdleThread : Ptr32 _KTHREAD
-------
那么前者呢。
lkd> dt _KTHREAD -r1
ntdll!_KTHREAD
.............省略..............
+0x034 ApcState : _KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY
+0x010 Process : Ptr32 _KPROCESS //就是这个位置