首页
社区
课程
招聘
[求助] 请问大佬们。内核API方式读写。。。问题。
发表于: 2018-6-23 11:41 4038

[求助] 请问大佬们。内核API方式读写。。。问题。

2018-6-23 11:41
4038
我用内核ZwOpenProcess  打开进程。。。驱动初始化的时候打开一次。打印。得到的是内核地址。。。同时R3 通信指挥R0打开进程。返回的是句柄。。
请问这个句柄如何给  内核NtReadVirtualMemory 使用。  有人告诉我用: 下面这个函数,

status = ObReferenceObjectByHandle(

进程句柄,

STANDARD_RIGHTS_ALL,

*PsProcessType,

UserMode,

(PVOID*)&userEvent,

NULL);

可以把句柄转换成内核地址。但是测试发现。。值不对。。上图:

现在是大写的蒙蔽。。。求助大佬。。。如何做才能让R3通信打开得到内核地址。直接给  NtReadVirtualMemory函数使用?
附上我自己写的垃圾源码:

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 进程句柄;
}
跪求各位老爷别讽刺我用汉字。。。这个梗。。。。。。


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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
2
切换用户模式才能使用
2018-6-23 13:01
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
刘铠文 切换用户模式才能使用
请问,如何切换到用户模式。用户模式下读内存。是否会进入OBJECT钩子?  这样的话。我是否可以在打开进程这里切换到内核模式?
2018-6-23 13:28
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
4
修改PreviousMode切换,OpenProcess都会进入回调,其他的你可以自己想了
2018-6-23 13:51
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
那个你的参数是不是写错了
2018-6-23 16:56
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我还去查了一下源码...  ProcessHandle  -  Supplies  an  open  handle  to  a  process  object.
2018-6-23 17:08
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
wqmdyx 我还去查了一下源码... ProcessHandle - Supplies an open handle to a process object.
确定没写错    ZwOpenProcess    ZwReadVirtualMemory                                                                                             
ObReferenceObjectByHandle  这个函数有多个选项。我全部测试过。只有进程的才能返回数据。其他全是空
2018-6-23 22:03
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我WINDBG    强行修改    PreviousMode            为0      打开进程返回的还是句柄     
    +0x1f6  PreviousMode          :  0  ''
R3打开后返回的进程句柄=0000000000000164
读取结果=0 
通讯是返回的句柄=0000000000000164 
2018-6-24 00:02
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
刘铠文 修改PreviousMode切换,OpenProcess都会进入回调,其他的你可以自己想了
已经确定。修改访问模式无效      返回的还是句柄。不是内核地址
2018-6-24 00:17
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
1、修改PreviosMode不需要WPOFF
2、ZwOpenProcess打开的本来就是句柄,谁告诉你ZwOpenProcess能得到内核对象了
3、用PID/TID得到内核对象用PsLookup系列
2018-6-24 08:29
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
hzqst 1、修改PreviosMode不需要WPOFF 2、ZwOpenProcess打开的本来就是句柄,谁告诉你ZwOpenProcess能得到内核对象了 3、用PID/TID得到内核对象用PsLook ...
请看主页第一张图片。驱动加载时打开一次进程。得到的是地址。而不是句柄
2018-6-24 10:32
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
12
NtReadVirtualMemory  根本不接受ObReferenceObjectByHandle返回的内核对象好吧?谁跟你说的NtReadVirtualMemory  要配合ObReferenceObjectByHandle用的?快去揍他
最后于 2018-6-24 11:57 被hzqst编辑 ,原因:
2018-6-24 11:56
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
13
附加  -1
2018-6-24 17:33
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
我就想告诉你这个来着
2018-6-25 22:17
0
游客
登录 | 注册 方可回帖
返回
//