首页
社区
课程
招聘
ZwAllocateVirtualMemory 申请用户内存成功 但是MmIsAddressValid显示不可用
发表于: 2019-4-28 19:22 7148

ZwAllocateVirtualMemory 申请用户内存成功 但是MmIsAddressValid显示不可用

2019-4-28 19:22
7148
NTSTATUS status = ObOpenObjectByPointer((PVOID)epGame,
				OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,
				NULL,
				GENERIC_ALL,
				*PsProcessType,
				KernelMode,
				&handle
			);

			if (status != STATUS_SUCCESS)
			{
				KdPrint(("ObOpenObjectByPoINTer error\n"));
			}

			status = ZwAllocateVirtualMemory(handle, &pMallocMemoryAddr, 0, &length, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

			if (status != STATUS_SUCCESS)
			{
				
				KdPrint(("ZwAllocateVirtualMemory %p,%p , %d\n", pMallocMemoryAddr , &pMallocMemoryAddr, status));
			}

			if (NULL != epGame) {
				
				
				KeStackAttachProcess(epGame,&apcState);		

				
				

				if (MmIsAddressValid(pMallocMemoryAddr)) {

					char test[] = { 0x12,0x12,0x12 ,0x12 ,0x12,0x12 ,0x12 ,0x12  };

					RtlCopyMemory(pMallocMemoryAddr, test, 8);

				}

				

				KeUnstackDetachProcess(&apcState);
				ObDereferenceObject(epGame);//清除对象

				MallocMemoryAddrress = (ULONG64)pMallocMemoryAddr;

				RtlCopyMemory(pIoBuffer, &MallocMemoryAddrress, 8);//返回8字节长度值

				nStatus = STATUS_SUCCESS;

大家好,我有个困惑的问题,x64位驱动申请指定进程空间的内存,申请成功了,但是KeStackAttachProcess后使用MmIsAddressValid显示不可用的,导致不能使用RtlCopyMemory等。
用CE查看该地址也是申请成功的,是不是哪里错了,希望大神们解答下。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 12
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
。。。。。。。
TheMmIsAddressValid    routine checks whether a page fault will occur for a read or write operation at a given virtual address.
然后你那个。。。。无力吐槽
最后于 2019-4-28 20:35 被MaMy编辑 ,原因:
2019-4-28 20:32
0
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3


.......
Status = ZwAVM()
....!NT_SUCCESS(Status )
2019-4-28 22:52
0
雪    币: 460
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢答复,不过还是有些不明白,
1.这个申请出来的内存是属于非分页内存吧,
2.而且这个函数分配出来的空间比较大,我看了下资料是根据系统决定的吧,有没有更好的内核向其他进程申请内存方法呢
2019-4-28 23:56
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
5
分配给r3的话 probeforread吧
2019-4-29 01:35
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
ZwAllocate只管分配VAD,具体的PTE PFN什么的 都是pagefault分配的,MmIsAddressValid只看PTE
顺便:牢饭香不?
2019-4-29 07:06
0
雪    币: 914
活跃值: (2473)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
7
牢里见
2019-4-29 08:30
0
雪    币: 460
活跃值: (483)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在牢里还能发贴,真好,,,哈哈~好的,谢谢各位大神,明白了,
2019-4-30 12:00
0
雪    币: 1036
活跃值: (1311)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
9
MMCopyVirtualMemory 拷一个字节就有了
2019-4-30 14:02
0
雪    币: 2250
活跃值: (3797)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
10
hzqst ZwAllocate只管分配VAD,具体的PTE PFN什么的 都是pagefault分配的,MmIsAddressValid只看PTE 顺便:牢饭香不?
真心头疼 在ntdll load的时候 驱动回调 中 让另外线程 执行 ZwAllocateVirtualMemory 时 会延迟申请内存 他成功了 也返回了内存地址 但是函数内是用不了他的内存的 !PTE 时他是没有映射内存的 值为0  
看到你的回复我顿悟了
2023-4-8 01:23
0
雪    币: 1
活跃值: (217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
逍遥m 真心头疼 在ntdll load的时候 驱动回调 中 让另外线程 执行 ZwAllocateVirtualMemory 时 会延迟申请内存 他成功了 也返回了内存地址 但是函数内是用不了他的内存的 ! ...
道理懂了  咋能解决这个问题呢
2023-9-30 17:29
0
游客
登录 | 注册 方可回帖
返回
//