希望高手们飘过,小弟只是把学习心得记一下,以备以后查找,
用WINDBG反汇编IoGetCurrentProcess
如下:
kd> uf IoGetCurrentProcess
nt!PsGetCurrentProcess:
804ef4f2 64a124010000 mov eax,dword ptr fs:[00000124h]
804ef4f8 8b4044 mov eax,dword ptr [eax+44h]
804ef4fb c3 ret
可见 IoGetCurrentProcess- 实际调用->PsCetCurrentProcess
在WDK 文档中了解到PsGetCurrentProcess
如下:
PEPROCESS
PsGetCurrentProcess(
VOID
);
看来返回的是一个EPROCESS 的指针
从反汇编中返回的是EAX
mov eax,dword ptr fs:[00000124h]
在内核模式下FS指向的是KPCR(Kernel's Processor Control Region)结构而不是RING3 下PEB
至于KPCR结构的作用我还不了解至知道与线程调度有关,好像每个CPU都有系统给他分配的一个KPCR结构 用于调度线程,
以后再分析
看一下KPCR结构
kd> 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
既然FS:[0]指向KPCR
那么,eax,dword ptr fs:[00000124h]
是KPCR 120处 KPRCB(内核进程控制快在内中而EPROCESS 在执行层的进程信息快,两者不同)偏移4的一个至给了EAX
接下来看一下KPRCB结构
nt!_KPRCB
+0x000 MinorVersion : Uint2B
+0x002 MajorVersion : Uint2B
+0x004 CurrentThread : Ptr32 _KTHREAD
+0x008 NextThread : Ptr32 _KTHREAD
+0x00c IdleThread : Ptr32 _KTHREAD
..................................结构太大了就不全部列出来了
他的004偏移处就是指向_KTHREAD(内核线程)指针
那么PsGetCurrentProcess
第一句返汇编就出来了
804ef4f2 64a124010000 mov eax,dword ptr fs:[00000124h] eax=KPCR(fs:[120])->KPRCB偏移4处的地址( CurrentThread : Ptr32 _KTHREAD)
得到EAX就是当前线程的KTHREAD结构
查看KTHREAD结构以展开的形式
kd> dt _KTHREAD -v -r
nt!_KTHREAD
struct _KTHREAD, 74 elements, 0x1c0 bytes
+0x000 Header : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes
+0x000 Type : UChar
+0x001 Absolute : UChar
+0x002 Size : UChar
+0x003 Inserted : UChar
+0x004 SignalState : Int4B
+0x008 WaitListHead : struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x010 MutantListHead : struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x018 InitialStack : Ptr32 to Void
+0x01c StackLimit : Ptr32 to Void
+0x020 Teb : Ptr32 to Void
+0x024 TlsArray : Ptr32 to Void
+0x028 KernelStack : Ptr32 to 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 : struct _KAPC_STATE, 5 elements, 0x18 bytes
+0x000 ApcListHead : [2] struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x010 Process : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes
第二句反汇编:804ef4f8 8b4044 mov eax,dword ptr [eax+44h]
既然已经知道EAX->KTHREAD结构那么 这里的EAX=KTHREAD 44偏移处的内容
从上结构得到 44处 +0x010 Process : Ptr32 to struct _KPROCESS, 29 elements, 0x6c bytes
所以此时EAX=KPROCESS结构的地址,
到此为之 PsGetCurrentProcess 就返回了 RET 那就想不是WDK帮助中不是说返回EPROCESS 的指针吗?这里怎么返回
了KPROCESS PCB的指针地址呢,,纳闷啊,我想了半天才明白,
原因是EPROCESS 的第一项就只KPROCESS PCB 既然得到了EPROCESS第一项的地址,也就可以说得到了EPROCESS的地址啊,
所以说PsGetCurrentProcess 既返回了当前进程的KPROCESS PCB 结构又返回了执行体的EPROCESS结构
EPROCESS 如下:
kd> dt _EPROCESS
nt!_EPROCESS
+0x000 Pcb : _KPROCESS
+0x06c ProcessLock : _EX_PUSH_LOCK
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
.........................
大部分从网上学习而来,我也在不断探索中,希望对大家有帮助,这样的文摘网上多的是,我也是为了自己学习留下笔记,
有什么错误大家指出,我们共同进步,,谢谢,