[note]KTHREAD结构相关

在用户模式下,段寄存器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大哥的

转载于:https://www.cnblogs.com/Tbit/archive/2010/05/12/1733915.html

你可能感兴趣的:(大数据)