前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >内核程序中进程的pid,handle,eprocess之间相互转换的方法

内核程序中进程的pid,handle,eprocess之间相互转换的方法

作者头像
战神伽罗
发布2019-12-20 11:26:55
1.5K0
发布2019-12-20 11:26:55
举报
文章被收录于专栏:Eureka的技术时光轴

在内核程序开发中,我们常常需要取得某进程的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 st = ObReferenceObjectByHandle (ProcessHandle, PROCESS_TERMINATE, PsProcessType, KeGetPreviousModeByThread(&Self->Tcb), &Process, NULL); 5、eprocess->pid _EPROCESS.UniqueProcessId即为所求,虽然声明类型为HANDLE,但实际上是pid。 6、eprocess->handle Status = ObOpenObjectByPointer( Process, Attributes, &AccessState, 0, PsProcessType, PreviousMode, &Handle ); 总结: 这是句柄、句柄表、对象三者间的关系。 PspCidTable是全局的句柄表,用来存放进程、线程对象体,通过进、线程的pid作为索引可以在PspCidTable句柄表中找到pid所属进、线程的对象体(既EPROCESS或ETHREAD)。 其次,在进程内部,以handle作为索引,可以在进程的句柄表(ObjectTable)中找到handle代表的对象头,对象头+0x18就可得到对象体。以上内容全部可以通过在windbg下验证。 转载自:http://bbs.pediy.com/showthread.php?t=119193

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档