[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大哥的<PsGetCurrentProcess为什么能定位活动进程链>

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值