能力值:
( LV9,RANK:280 )
|
-
-
2 楼
在windows中,句柄是内核对象在应用层的一个标识符、这个标识符对每个进程来说都是独立的。 就好比你在学校叫王小明,但是在家里就叫小明,结婚以后邻居都叫你老王,其实这些名字指向的都是同一个东西。这里这个王小明同学就是一个唯一的进程对象,他在各个场合被以各种叫法称呼,这就是句柄。 在学校老师不能体罚王小明同学,但是在家你爸妈可以揍小明,这就是句柄的权限。
最后于 2018-6-22 14:47
被hzqst编辑
,原因:
|
能力值:
( LV9,RANK:190 )
|
-
-
3 楼
hzqst
在windows中,句柄是内核对象在应用层的一个标识符、这个标识符对每个进程来说都是独立的。就好比你在学校叫王小明,但是在家里就叫小明,结婚以后邻居都叫你老王,其实这些名字指向的都是同一个东西。这里这 ...
真形象
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
楼主晚上跟老婆睡觉的时候,老婆对楼主说,老娘抓住你的把柄了吧,然后就可以xxoo楼主 句柄也是差不多的概念,拿到句柄后,就可以xxoo
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
程句柄标示这个句柄是代表这个进程而不是另一个
最后于 2018-6-22 19:22
被xtayaitak编辑
,原因:
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
哎。。大佬们。我不是问句柄的定义。。我是问句柄到底是什么。。我知道R3的句柄就是内核的一个地址而已。。句柄根据句柄表。按照算法能解出来。。。可是我的意思是,,,R0的地址。到底是什么。。EPROCESS 还是什么?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
xiaxiansheng
哎。。大佬们。我不是问句柄的定义。。我是问句柄到底是什么。。我知道R3的句柄就是内核的一个地址而已。。句柄根据句柄表。按照算法能解出来。。。可是我的意思是,,,R0的地址。到底是什么。。EPROCES ...
这种不同于GDI对象句柄的句柄,按照一定的算法,能够得到内核对象的地址。这个内核对象究竟是EPROCESS,还是FILE_OBJECT,还是别的,可以自己解对象头,也可以用API查
|
能力值:
( 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编辑
,原因:
|
|
|