文档章节

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

simpower
 simpower
发布于 2019/12/13 11:05
字数 468
阅读 174
收藏 0

3 月,跳不动了?>>>

在内核程序开发中,我们常常需要取得某进程的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

本文转载自:https://blog.csdn.net/whatday/article/details/52493546

simpower
粉丝 29
博文 708
码字总数 53502
作品 0
海淀
程序员
私信 提问
加载中

评论(0)

WinDBG如何滥用令牌来提升内核权限

     本文的目的是在更高的层次上,让你学会不用编写任何内核代码,而是使用WinDBG滥用令牌来提升内核权限。其中,会涉及两个技巧:   1. 令牌窃取或替换:将低权限令牌替换为高权限令...

嘶吼RoarTalk
02/05
0
0
什么是句柄?为什么会有句柄?HANDLE

转载自http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html 关键字:句柄, HANDLE, WINDOWS SDK, windows.h, 从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做...

zray4u
2016/07/14
16
0
初探Windows用户态调试机制

我们在感叹Onlydbg强大与便利的同时,是否考虑过它实现的原理呢? 作为一个技术人员知其然必知其所以然,这才是我们追求的本心。 最近在学习张银奎老师的《软件调试》,获益良多。熟悉Windo...

simpower
2018/08/24
45
0
详解Windows渗透测试工具Mimikatz的内核驱动

      一、概述   Mimikatz通过其中包含的Mimidrv驱动程序,提供了利用内核模式的功能。Mimidrv是已经签名的Windows驱动模型(WDM)内核模式软件驱动程序,在相关命令前加上感叹号(!...

嘶吼RoarTalk
01/27
0
0
任意代码保护与内核代码注入的那些事儿

  严正声明:本文仅限于技术探讨,严禁用于其他用途。       写在前面的话   类似 WannaCry 和 Slingshot 这样的恶意软件最常用的一种攻击技术就是内核代码注入,在近期刚刚发布的 ...

FreeBuf
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

每年营收翻倍的 AfterShip 是如何体系化做新员工培训(下)

AfterShip 自 2012 年成立以来,每年业务都可实现 100% 的复合增长。对于这家公司来说,组建团队是一件更重要的事情,并且尤为重视工程师团队文化的建设,他们推崇团队文化多元化及相互包容性...

爱客科技
23分钟前
10
0
如何在企业内部实现云信私有化

在信息安全愈发重要的今天,企业越来越重视和业务有关的数据,视其为企业的生命线,云信针对这一特点专门构建了一整套私有化方案,并且在多家行业龙头企业内部稳定运行,成为企业内部发展的助...

真正稳定的网易云信
24分钟前
13
0
动态代理的实际应用

原文链接 前言 最近在用 Python 的 SQLAlchemy 库时(一个类似于 Hibernate 的 ORM 框架),发现它的 Events 事件还挺好用。 简单说就是当某张表的数据发生变化(曾、删、改)时会有一个事件...

crossoverJie
28分钟前
10
0
视频直播技术之如何搭建流媒体服务器?

实时视频直播是这两年非常火的技术形态,已经渗透到教育、在线互娱等各种业务场景中。但要搭建一套实时视频直播系统,并非易事,下面针对直播系统的的搭建做一下说明: 1.1 通常的直播系统的...

图玩智能科技
29分钟前
28
0
SpringTask任务调度详解+SpringBoot整合

1 定时任务的框架 Quartz:整合了Spring SpringTask:轻量 SpringBoot整合SpringTask:两行代码即可搞定 1.1.说说定时任务的应用场景 1. 月底扣话费2. 会员到期3. 生日祝福4. qq好友生日祝...

漫路h
29分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部