首页
论坛
课程
招聘

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

2008-1-9 21:49 8852

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

2008-1-9 21:49
8852
本来偶在学习内核线程调度的东西,发现里面有关于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这些手段会有更进一步的印象了~

[推荐]看雪企服平台,提供项目众包、渗透测试、安全分析、定制项目开发、APP等级保护等安全服务!

上传的附件:
最新回复 (14)
combojiang 26 2008-1-9 21:53
2
0
终于看到下载的附件了,先顶起来再慢慢看,大米好样的。鼓掌。。
经过偶实地考察,发现WRK、reactOS都靠不住。
没有风 10 2008-1-10 09:08
3
0
支持,我也下载一个学习、学习
sudami 25 2008-1-10 09:37
4
0
一点儿学习心得,存档,方便供以后的同学参考。

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

写的很烂,见笑呀
北极星2003 25 2008-1-10 13:02
5
0
写的很好!有时间贴上来吧
vecri 2008-1-10 13:44
6
0
我是一个菜鸟, 正在学习win32底层知识。。
想问下学习windows内核知识。有什么好书吗。。?
希望不吝赐教
sudami 25 2008-1-10 14:10
7
0
书有一部分。网上有一些电子书:

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

要到书店买也可能买的到,不过估计都在100元上下。
还有好多逆向啊,底层的英文书籍,在Rootkit.com上有介绍,一本少说也得200多元~~~
炉子 3 2008-1-10 15:34
8
0
nice job   btw:看楼主的汉字应该很成熟 哈哈。
Aker 4 2008-1-10 17:49
9
0
学习

sudami , 大米
好多大米
softworm 30 2008-1-10 19:20
10
0
学习,钢笔字写得很漂亮
jiangshx 2008-1-11 16:27
11
0
好东西,收藏
xPLK 3 2008-1-11 21:58
12
0
用Windows Kernel Research吧~

方便。
gdlian 2008-4-25 09:58
13
0
贴上代码,以供研究,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
yiyiguxing 1 2008-4-25 11:50
14
0
大米同学很用功  我也要努力!
TGOS 2008-7-19 21:51
15
0
学习``````学习
游客
登录 | 注册 方可回帖
返回