首页
社区
课程
招聘
[分享]PsLookupProcessByProcessId执行流程学习笔记
发表于: 2008-1-9 21:49 12023

[分享]PsLookupProcessByProcessId执行流程学习笔记

2008-1-9 21:49
12023

本来偶在学习内核线程调度的东西,发现里面有关于HANDLE_TABLE的知识.于是参照WRK把附带的一些东西深入学习了一下子--关于PsLookupProcessByProcessId的执行流程
[写点心得存档,供以后学习的同学参考.老鸟飘过~ ]

NtOpenProcess->PsLookupProcessByProcessId->ExMapHandleToPointer->ExpLookupHandleTableEntry

关于RKARK,大概都很关注PsLookupProcessByProcessId吧.无论是HOOK还是DKOM,还是其他的,都先得把函数在底层的实现细节完全搞明白才行. so,the following may be helpful for you and me:

---->
进入PsLookupProcessByProcessId内,它有2个参数
    __in HANDLE ProcessId,                       // 传进来进程ID
   __deref_out PEPROCESS *Process // 传出去进程的EPROCESS

首先使当前线程的内核APC无效,然后调用 ExMapHandleToPointer 函数.它有2个参数
    __in PHANDLE_TABLE HandleTable,
    __in HANDLE Handle
第1个参数传进来是全局变量 PspCidTable (它包含了系统所有进程的线程对象的指针);第2个参数传进来进程ID (它被赋予给 EXHANDLE 结构体中的 GenericHandleOverlay 变量)
---->
进入此函数后,将进程ID加入到 EXHANDLE 结构体中,进行必要的检查,确保ID的有效性:

EXHANDLE 是一个union, 其中的 Index 即是 GenericHandleOverlay 的低30位.这个检查是确保 2~109位存在,即3层表的0级的索引存在.

然后该函数调用 ExpLookupHandleTableEntry 函数,同样为此函数传递上面的2个参数,不过此时的第2个参数已经转换成另一种形式----EXHANDLE结构了[关于它的内部实现细节及注释过程, 句柄3层表,一些结构体。见附件]
最终它返回一个 HANDLE_TABLE_ENTRY 的地址,里面的前4字节包含了指定进程的对象地址.
---->
返回到 ExMapHandleToPointer 函数中后,此函数获得控制权,便接着往下执行.它会调用
ExpLockHandleTableEntry 来锁定当前的 handle table entry (InterlockedCompareExchangePointer ---->InterlockedCompareExchange).如果不成功或者ExpLookupHandleTableEntry返回结果为0,则可能是进程句柄处于被调试状态, 通过 HANDLE_TABLE 结构中的 DebugInfo 来判断当前句柄是否处于被调试状态.
若是,则调用 ExpUpdateDebugInfo 函数填充 HANDLE_TRACE_DEBUG_INFO 结构体以保存当前的调试信息; 否则返回NULL,调用失败.
当函数调用成功时,便返回从ExpLookupHandleTableEntry得到的HANDLE_TABLE_ENTRY 的地址.
---->
这样就回到了PsLookupProcessByProcessId函数中,它将 HANDLE_TABLE_ENTRY 中的Object转化为EPROCESS类型,确保这个对象是ProcessObject且有继承权限,将此对象的计数+1:


然后将此EPROCESS装入到参数2中, 解锁当前的handle table entry,恢复当前线程的内核APC,成功返回.


这个是用相机扫的图,用软件处理了下,懒得画了~~

-------------------------------------------------------------------------------------

这只是茫茫内核函数中的一个,相关联的还有比如很重要的PspTerminateThreadByPointer,大家可以参照WRK、reactOS学习,对理解RK运用DKOM这些手段会有更进一步的印象了~


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
2
终于看到下载的附件了,先顶起来再慢慢看,大米好样的。鼓掌。。
经过偶实地考察,发现WRK、reactOS都靠不住。
2008-1-9 21:53
0
雪    币: 486
活跃值: (13)
能力值: ( LV9,RANK:430 )
在线值:
发帖
回帖
粉丝
3
支持,我也下载一个学习、学习
2008-1-10 09:08
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
一点儿学习心得,存档,方便供以后的同学参考。

偶一开始查WINXP 下 关于3层句柄的资料,少的可怜啊,折腾了很久才搞明白。
于是意识到木有资料存档的话,后来人学习就会走很多弯路了~

写的很烂,见笑呀
2008-1-10 09:37
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
5
写的很好!有时间贴上来吧
2008-1-10 13:02
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是一个菜鸟, 正在学习win32底层知识。。
想问下学习windows内核知识。有什么好书吗。。?
希望不吝赐教
2008-1-10 13:44
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
7
书有一部分。网上有一些电子书:

《Rootkits: Subverting the Windows Kernel》、
《WINDOWS INTERNELS》、
《UndocWindowsNT》、
《NTFSI》、
《楚狂人的文件过滤驱动教程》、
《Windows深入剖析-内核篇》
...

要到书店买也可能买的到,不过估计都在100元上下。
还有好多逆向啊,底层的英文书籍,在Rootkit.com上有介绍,一本少说也得200多元~~~
2008-1-10 14:10
0
雪    币: 66
活跃值: (16)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
nice job   btw:看楼主的汉字应该很成熟 哈哈。
2008-1-10 15:34
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
9
学习

sudami , 大米
好多大米
2008-1-10 17:49
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
10
学习,钢笔字写得很漂亮
2008-1-10 19:20
0
雪    币: 233
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
好东西,收藏
2008-1-11 16:27
0
雪    币: 375
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
12
用Windows Kernel Research吧~

方便。
2008-1-11 21:58
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
贴上代码,以供研究,XP SP2

lkd> x *!PsLookupProcessByProcessId
805d2966 nt!PsLookupProcessByProcessId = <no type information>
lkd> uf 805d2966
nt!PsLookupProcessByProcessId:
805d2966 8bff            mov     edi,edi
805d2968 55              push    ebp
805d2969 8bec            mov     ebp,esp
805d296b 53              push    ebx
805d296c 56              push    esi
805d296d 64a124010000    mov     eax,dword ptr fs:[00000124h]
805d2973 ff7508          push    dword ptr [ebp+8]
805d2976 8bf0            mov     esi,eax
805d2978 ff8ed4000000    dec     dword ptr [esi+0D4h]
805d297e ff35c0385680    push    dword ptr [nt!PspCidTable (805638c0)]
805d2984 e801ad0300      call    nt!ExMapHandleToPointer (8060d68a)
805d2989 8bd8            mov     ebx,eax
805d298b 85db            test    ebx,ebx
805d298d c745080d0000c0  mov     dword ptr [ebp+8],0C000000Dh
805d2994 7432            je      nt!PsLookupProcessByProcessId+0x62 (805d29c8)

nt!PsLookupProcessByProcessId+0x30:
805d2996 57              push    edi
805d2997 8b3b            mov     edi,dword ptr [ebx]
805d2999 803f03          cmp     byte ptr [edi],3
805d299c 751d            jne     nt!PsLookupProcessByProcessId+0x55 (805d29bb)

nt!PsLookupProcessByProcessId+0x38:
805d299e 83bfa401000000  cmp     dword ptr [edi+1A4h],0
805d29a5 7414            je      nt!PsLookupProcessByProcessId+0x55 (805d29bb)

nt!PsLookupProcessByProcessId+0x41:
805d29a7 8bcf            mov     ecx,edi
805d29a9 e86e3ff5ff      call    nt!ObReferenceObjectSafe (8052691c)
805d29ae 84c0            test    al,al
805d29b0 7409            je      nt!PsLookupProcessByProcessId+0x55 (805d29bb)

nt!PsLookupProcessByProcessId+0x4c:
805d29b2 8b450c          mov     eax,dword ptr [ebp+0Ch]
805d29b5 83650800        and     dword ptr [ebp+8],0
805d29b9 8938            mov     dword ptr [eax],edi

nt!PsLookupProcessByProcessId+0x55:
805d29bb 53              push    ebx
805d29bc ff35c0385680    push    dword ptr [nt!PspCidTable (805638c0)]
805d29c2 e8dba60300      call    nt!ExUnlockHandleTableEntry (8060d0a2)
805d29c7 5f              pop     edi

nt!PsLookupProcessByProcessId+0x62:
805d29c8 ff86d4000000    inc     dword ptr [esi+0D4h]
805d29ce 7513            jne     nt!PsLookupProcessByProcessId+0x7d (805d29e3)

nt!PsLookupProcessByProcessId+0x6a:
805d29d0 8d4634          lea     eax,[esi+34h]
805d29d3 3900            cmp     dword ptr [eax],eax
805d29d5 740c            je      nt!PsLookupProcessByProcessId+0x7d (805d29e3)

nt!PsLookupProcessByProcessId+0x71:
805d29d7 b101            mov     cl,1
805d29d9 c6464901        mov     byte ptr [esi+49h],1
805d29dd ff150c914d80    call    dword ptr [nt!_imp_HalRequestSoftwareInterrupt (804d910c)]

nt!PsLookupProcessByProcessId+0x7d:
805d29e3 8b4508          mov     eax,dword ptr [ebp+8]
805d29e6 5e              pop     esi
805d29e7 5b              pop     ebx
805d29e8 5d              pop     ebp
805d29e9 c20800          ret     8
2008-4-25 09:58
0
雪    币: 70
活跃值: (74)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
大米同学很用功  我也要努力!
2008-4-25 11:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
学习``````学习
2008-7-19 21:51
0
游客
登录 | 注册 方可回帖
返回
//