首页
社区
课程
招聘
[求助] 请问大佬们。API打开进程返回的句柄。到底是什么东西???
发表于: 2018-6-22 14:34 3355

[求助] 请问大佬们。API打开进程返回的句柄。到底是什么东西???

2018-6-22 14:34
3355
HANDLE 进程_打开(HANDLE PID)
{
HANDLE 进程句柄 = 0;
CLIENT_ID 进程ID;
NTSTATUS 返回值;
OBJECT_ATTRIBUTES 对象;
进程ID.UniqueThread = 0;
进程ID.UniqueProcess = PID;
对象.Length = sizeof(对象);
对象.RootDirectory = 0;
对象.ObjectName = 0;
对象.Attributes = 0;
对象.SecurityDescriptor = 0;
对象.SecurityQualityOfService = 0;

返回值 = ZwOpenProcess(&进程句柄, 2035711, &对象, &进程ID);
if (!NT_SUCCESS(返回值))
return 0;
DbgPrint("打开后返回的进程句柄=%p\n", 进程句柄);
return 进程句柄;
}
这个是我用驱动写的一个函数。。就是打开进程。。。。驱动加载的时候。我让他打开一次指定的进程。打印返回的句柄是一个64位地址。
但是。。。同时。我R3通信。指挥R0再次进入这个函数。打开的也同一个进程。返回的是句柄。。。我知道。。 ZwOpenProcess函数里肯定是判断来源了。然后返回地址或者句柄。。。。。我就想知道。句柄到底是什么???或者说。。我R0  ZwReadVirtualMemory 读内存。如何使用这个R3的句柄。或者有其他什么办法。。不通过打开进程。利用进程PID。获取到地址。给 ZwReadVirtualMemory 使用

经过我查询和咨询。已经确定。。内核打开进程。返回的是  EPROCESS里  HANDLE_TABLE 里的成员  附上连接:
http://www.mouseos.com/windows/kernel/%E4%B8%80%E4%BA%9B%E9%80%86%E5%90%91%E5%87%BA%E6%9D%A5%E7%9A%84%E5%87%BD%E6%95%B0%E5%AE%9E%E7%8E%B0.html#04

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2018-6-23 11:46 被xiaxiansheng编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
在windows中,句柄是内核对象在应用层的一个标识符、这个标识符对每个进程来说都是独立的。
就好比你在学校叫王小明,但是在家里就叫小明,结婚以后邻居都叫你老王,其实这些名字指向的都是同一个东西。这里这个王小明同学就是一个唯一的进程对象,他在各个场合被以各种叫法称呼,这就是句柄。
在学校老师不能体罚王小明同学,但是在家你爸妈可以揍小明,这就是句柄的权限。
最后于 2018-6-22 14:47 被hzqst编辑 ,原因:
2018-6-22 14:45
0
雪    币: 1660
活跃值: (2681)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
3
hzqst 在windows中,句柄是内核对象在应用层的一个标识符、这个标识符对每个进程来说都是独立的。就好比你在学校叫王小明,但是在家里就叫小明,结婚以后邻居都叫你老王,其实这些名字指向的都是同一个东西。这里这 ...
真形象
2018-6-22 15:06
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主晚上跟老婆睡觉的时候,老婆对楼主说,老娘抓住你的把柄了吧,然后就可以xxoo楼主
句柄也是差不多的概念,拿到句柄后,就可以xxoo
2018-6-22 17:42
0
雪    币: 106
活跃值: (574)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
程句柄标示这个句柄是代表这个进程而不是另一个
最后于 2018-6-22 19:22 被xtayaitak编辑 ,原因:
2018-6-22 19:22
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
哎。。大佬们。我不是问句柄的定义。。我是问句柄到底是什么。。我知道R3的句柄就是内核的一个地址而已。。句柄根据句柄表。按照算法能解出来。。。可是我的意思是,,,R0的地址。到底是什么。。EPROCESS    还是什么?
2018-6-22 23:20
0
雪    币: 407
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
xiaxiansheng 哎。。大佬们。我不是问句柄的定义。。我是问句柄到底是什么。。我知道R3的句柄就是内核的一个地址而已。。句柄根据句柄表。按照算法能解出来。。。可是我的意思是,,,R0的地址。到底是什么。。EPROCES ...
这种不同于GDI对象句柄的句柄,按照一定的算法,能够得到内核对象的地址。这个内核对象究竟是EPROCESS,还是FILE_OBJECT,还是别的,可以自己解对象头,也可以用API查
2018-6-23 00:20
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
有人告诉我可以用  ObReferenceObjectByHandle      函数转换成对象的内核地址。。。可是我测试了下。发现不行。。。
请问    ObReferenceObjectByHandle            函数如何写可以把R3的句柄转换成R0的地址给    ZwReadVirtualMemory  函数使用

status = ObReferenceObjectByHandle(
进程句柄,
STANDARD_RIGHTS_ALL,
*PsProcessType,
UserMode,
(PVOID*)&userEvent,
NULL);

我这样写的。。可以转换出来数据。但是不正确。。


HANDLE 进程_打开(HANDLE PID)
{
HANDLE 进程句柄 = 0;
CLIENT_ID 进程ID;
NTSTATUS 返回值;
OBJECT_ATTRIBUTES 对象;
进程ID.UniqueThread = 0;
进程ID.UniqueProcess = PID;
对象.Length = sizeof(对象);
对象.RootDirectory = 0;
对象.ObjectName = 0;
对象.Attributes = 0;
对象.SecurityDescriptor = 0;
对象.SecurityQualityOfService = 0;

返回值 = ZwOpenProcess(&进程句柄, STANDARD_RIGHTS_ALL, &对象, &进程ID);
if (!NT_SUCCESS(返回值))
return 0;
DbgPrint("打开后返回的进程句柄=%p\n", 进程句柄);

NTSTATUS    status;
PKEVENT      userEvent;
HANDLE        handle;


status = ObReferenceObjectByHandle(
进程句柄,
STANDARD_RIGHTS_ALL,
*PsProcessType,
UserMode,
(PVOID*)&userEvent,
NULL);

if (NT_SUCCESS(status))
{
// do something interesting here 
// KeSetEvent(userEvent, IO_NO_INCREMENT, FALSE);
// ObDereferenceObject(userEvent);
}

DbgPrint("转换后的句柄地址=%p\n", userEvent);

ULONG64 ADD = 0x4a4610;
ULONG64 LEN = 4;
ULONG 读取结果 = 0;
ULONG 成功读写数量 = NULL;
ZwReadVirtualMemory(userEvent, (ULONG64*)ADD, (ULONG64*)读取结果, LEN, &成功读写数量);

DbgPrint("读取结果=%d \n", 读取结果);
return 进程句柄;
}


请大佬们使用R3通信方式调用。现在完全蒙蔽了。。。







最后于 2018-6-23 09:14 被xiaxiansheng编辑 ,原因:
2018-6-23 09:10
0
游客
登录 | 注册 方可回帖
返回
//