首页
社区
课程
招聘
[求助]r0层 读取不存在的虚拟内存地址会炸
发表于: 2019-4-22 18:38 4247

[求助]r0层 读取不存在的虚拟内存地址会炸

2019-4-22 18:38
4247
RT
用MDL的方式读取内存 
正常读取一个软件的地址没啥问题
比如 0x4A4710这种 
但是如果手动传入一个0x0
直接就炸了 

我已经用了MmIsaddressValid判断
也用try except 包起来了
有点头疼
	KeStackAttachProcess(Process, &ApcState);
	attach = TRUE;
	if (!MmIsAddressValid(TargetAddr))
		return STATUS_ABANDONED;
	PMDL mdl = IoAllocateMdl((PVOID)TargetAddr, (ULONG)uSize, FALSE, FALSE, NULL);
	if (mdl == NULL)
	{
		KeUnstackDetachProcess(&ApcState);
		return STATUS_NOT_MAPPED_DATA;
	}
	havemdl = TRUE;

	__try
	{
		MmBuildMdlForNonPagedPool(mdl);
		MmProbeAndLockPages(mdl, KernelMode, IoReadAccess);

		lockpage = TRUE;
		MappedAddress = MmMapLockedPagesSpecifyCache(mdl,
			KernelMode,
			MmCached,
			NULL,
			FALSE,
			NormalPagePriority);

		if(MappedAddress)
		{
			KeUnstackDetachProcess(&ApcState);
			attach = FALSE;
			maplockpage = TRUE;
			if(MmIsAddressValid(Buffer))
			{
				memcpy(Buffer, MappedAddress, uSize);
			}	
		}
	}
	__except (1)
	{
		;
	}
	if (maplockpage)
		MmUnmapLockedPages(MappedAddress, mdl);
	if (lockpage)
		MmUnlockPages(mdl);
	if (havemdl)
		IoFreeMdl(mdl);
	if (attach)
		KeUnstackDetachProcess(&ApcState);


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

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 914
活跃值: (2463)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
2
MmCopy********************
2019-4-22 22:24
0
雪    币: 7544
活跃值: (5387)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
MmIsaddressValid无法验证R0地址,请使用:
__try
{
    ProbeForRead(Address, Length, sizeof(CHAR));
}__except (EXCEPTION_EXECUTE_HANDLER){};
2019-4-22 22:46
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
4
lononan MmIsaddressValid无法验证R0地址,请使用: __try { ProbeForRead(Address, Length, sizeof(CHAR)); }__except ...
如果我没记错的话 msdn上有说过 ProbeForRead 只能检测r3内存区域是否可读 并不能检测r0
按道理来讲 MmIsaddressValid 是可以判定 0x0 为一个无效地址 返回FALSE的 建议分析一下蓝屏dmp 确定蓝屏代码是哪一行
2019-4-23 06:07
0
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
5
因为 MmIsaddressValid 并不是判定地址是否可读或可写 而是判断地址是否合法,0x0 明显不是一个正确合法的地址
最后于 2019-4-23 06:09 被Sprite雪碧编辑 ,原因:
2019-4-23 06:08
0
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢各位老哥。
2019-4-23 07:15
0
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
lononan MmIsaddressValid无法验证R0地址,请使用: __try { ProbeForRead(Address, Length, sizeof(CHAR)); }__except ...
主要是用于内核层的。。。
2019-4-23 09:14
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
8
不考虑分页内存可以用手工解析页表的方式读取
考虑分页内存,目前无解

千言万语汇成一句话:牢饭真香
最后于 2019-4-23 15:19 被hzqst编辑 ,原因:
2019-4-23 15:18
0
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
hzqst 不考虑分页内存可以用手工解析页表的方式读取考虑分页内存,目前无解 千言万语汇成一句话:牢饭真香
谢谢大表哥
2019-4-23 15:55
0
游客
登录 | 注册 方可回帖
返回
//