首页
社区
课程
招聘
[原创]win32内核程序中进程的pid,handle,eprocess之间相互转换的方法
发表于: 2010-8-25 16:34 18706

[原创]win32内核程序中进程的pid,handle,eprocess之间相互转换的方法

2010-8-25 16:34
18706

在win32内核程序开发中,我们常常需要取得某进程的pid或句柄,或者需要检索进程的eprocess结构,很多API函数需要的参数也不同,所以掌握pid<->handle<->eprocess相互转换的方法会大大提高我们的开发效率。

以下就是我自己在实际开发中总结出来的转换方法,在此记录下来,以供需要的朋友参考。

1、pid->handle

OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID clientid;
InitializeObjectAttributes(&ObjectAttributes, 0 ,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
clientid.UniqueProcess = (HANDLE)pid;
clientid.UniqueThread=0;
ZwOpenProcess(&handle, PROCESS_ALL_ACCESS, &ObjectAttributes, &clientid); 
handle即为所求。

2、handle->pid

PROCESS_BASIC_INFORMATION pbi;
ns = ZwQueryInformationProcess(ProcessHandle, ProcessBasicInformation, (PVOID)&pbi, sizeof(ProcessBasicInformation), NULL);
pid = pbi.UniqueProcessId; 
pid即为所求。

3、pid->eprocess

PEPROCESS pEProc;
PsLookupProcessByProcessId((HANDLE)pid, &pEProc);
ObDereferenceObject(pEProc); 
pEProc即为所求eprocess的指针。

4、handle->eprocess

暂未发现直接转换的方法,可由handle->pid->eprocess。

5、eprocess->pid

_EPROCESS.UniqueProcessId即为所求,虽然声明类型为HANDLE,但实际上是pid。

6、eprocess->handle

暂未发现直接转换的方法,可由eprocess->pid->handle。

以上方法在Windows XP SP2中验证通过,欢迎大家补充


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

收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
4、handle->eprocess

暂未发现直接转换的方法,可由handle->pid->eprocess。

这个我来完善吧.

    st = ObReferenceObjectByHandle (ProcessHandle,
                                    PROCESS_TERMINATE,
                                    PsProcessType,
                                    KeGetPreviousModeByThread(&Self->Tcb),
                                    &Process,
                                    NULL);

6、eprocess->handle

暂未发现直接转换的方法,可由eprocess->pid->handle。

这个也完善下.

        Status = ObOpenObjectByPointer(
                    Process,
                    Attributes,
                    &AccessState,
                    0,
                    PsProcessType,
                    PreviousMode,
                    &Handle
                    );
2010-8-25 17:17
0
雪    币: 68
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
嗯,这个要是能有个系统的总结还是对我等菜鸟比较有帮助的
2010-8-25 17:20
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
4
留个记号...
2010-8-25 17:55
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
标记,以后学习
2010-8-25 19:02
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很好 很实用 哈哈
2010-8-26 08:46
0
雪    币: 266
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
lz很体贴啊
2010-8-27 11:00
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个很有用

mark一下
2010-8-27 11:16
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
好东西 学习下
2010-8-27 16:28
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
根据pid可以从pspcidtable中找到eprocess
根据handle可以使用ObReferenceObjectByHandle找到eprocess,或者自己实现ObRef,直接从进程HandleTable里边找到eprocess
2010-8-27 19:14
0
雪    币: 156
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
嗯,感谢楼上几位的补充,我也学习了~
2010-8-28 22:50
0
雪    币: 132
活跃值: (30)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
OBJECT_ATTRIBUTES 这个结构里成员
PUNICODE_STRING ObjectName

这个ObjectName指的是什么? xx.exe吗?
2010-10-26 18:16
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
记一下。这个是好东西。还是新手
2010-10-27 01:00
0
雪    币: 138
活跃值: (461)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
mark.....
2010-10-30 05:37
0
雪    币: 93
活跃值: (365)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
我也谈谈我对以上内容的理解。

这是句柄、句柄表、对象三者间的关系。
   PspCidTable是全局的句柄表,用来存放进程、线程对象体,通过进、线程的pid作为索引可以在PspCidTable句柄表中找到pid所属进、线程的对象体(既EPROCESS或ETHREAD)。
  其次,在进程内部,以handle作为索引,可以在进程的句柄表(ObjectTable)中找到handle代表的对象头,对象头+0x18就可得到对象体。
以上内容全部可以通过在windbg下验证。
2010-10-30 10:24
0
雪    币: 342
活跃值: (55)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
留下脚印...
2010-10-30 18:12
0
雪    币: 81
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
标记,以后来看。。谢谢
2010-10-30 18:15
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
标记,以后用
2010-11-9 14:17
0
雪    币: 110
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
不错学习了......
2010-11-9 20:10
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不错。加油。mark
2011-1-12 17:48
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
MARK一个 呵呵 会用得着的。
2011-1-15 00:10
0
游客
登录 | 注册 方可回帖
返回
//