在用户模式下,段寄存器FS指向当前线程的TEB,所以FS:[0X18]就是指针Self,其内容就是TEB的起点.
在内核模式下,FS指向的是KPCR(Kernel's Processor Control Region)结构,而
mov reg,FS:[124h] //reg可表示eax,edx,ebx,.....
这样就能获得当前线程的指针(KTHREAD结构体)
现在看看相关获取KTHREAD指针的相关内核函数
1.KeGetCurrentThread() , PsGetCurrentThread()
其实
#define PsGetCurrentThread ((PETHREAD)KeGetCurrentThread())
使用windbg查看下
kd> u nt!PsGetCurrentThread
nt!PsGetCurrentThread:
80527ae8 64a124010000 mov eax,dword ptr fs:[00000124h]
2.与PsGetCurrentThread()相对应,内核也提供了PsGetCurrentProcess()
使用该函数,可以获得KPROCESS指针.
其实
#define PsGetCurrentProcess IoGetCurrentProcess
查看下ReactOS的函数实现:
PEPROCESS
PsGetCurrentProcess(VOID)
{
/* Get the current process */
return (PEPROCESS)KeGetCurrentThread()->ApcState.Process;
}
发现PsGetCurrentProcess()也是通过,KeGetCurrentThread()实现的.
查看下windbg:
kd> u nt!PsGetCurrentProcess
nt!PsGetCurrentProcess:
804ef2e8 64a124010000 mov eax,dword ptr fs:[00000124h]
804ef2ee 8b4044 mov eax,dword ptr [eax+44h]
KeGetCurrentThread()获得KTHREAD结构,
+0x034 是成员ApcState,将ApcState(对应的结构是 _KAPC_STATE)展开,+0x10 就是EPROCESS的指针了.
具体如下:
kd> dt -r _kthread
nt!_KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x000 Type : UChar
+0x001 Absolute : UChar
+0x002 Size : UChar
+0x003 Inserted : UChar
+0x004 SignalState : Int4B
+0x008 WaitListHead : _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x010 MutantListHead : _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x018 InitialStack : Ptr32 Void
+0x01c StackLimit : Ptr32 Void
+0x020 Teb : Ptr32 Void
+0x024 TlsArray : Ptr32 Void
+0x028 KernelStack : Ptr32 Void
+0x02c DebugActive : UChar
+0x02d State : UChar
+0x02e Alerted : [2] UChar
+0x030 Iopl : UChar
+0x031 NpxState : UChar
+0x032 Saturation : Char
+0x033 Priority : Char
+0x034 ApcState : _KAPC_STATE
+0x000 ApcListHead : [2] _LIST_ENTRY
+0x000 Flink : Ptr32 _LIST_ENTRY
+0x004 Blink : Ptr32 _LIST_ENTRY
+0x010 Process : Ptr32 _KPROCESS
相关内容可以参考下RB大哥的