首页
社区
课程
招聘
[求助]MmIsAddressValid能否判定内存地址有效?
发表于: 2009-10-17 19:15 11853

[求助]MmIsAddressValid能否判定内存地址有效?

2009-10-17 19:15
11853
RT
ddk的解释:
Even if MmIsAddressValid returns TRUE, accessing the address can cause page faults unless the memory has been locked down or the address is a valid nonpaged pool address.
这样的话,有没有什么办法能判定内存地址有效?

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

收藏
免费 0
支持
分享
最新回复 (15)
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
2
。。。。。。没有
2009-10-17 21:02
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
额........
if(MmIsAddressValid(va))
{
*(PCHAR)va = 0;
}
这种代码是不是会蓝的.....
加上__try是不是也会蓝?

unless the memory has been locked down or the address is a valid nonpaged pool address
这个会不会是解决办法呢.
2009-10-17 21:17
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
MJ回答好干脆。。。有莫有什么好的方法莫有?
2009-10-18 15:49
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
是的啊.有米有好办法.
2009-10-18 16:12
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
http://hi.baidu.com/mj0011/blog/item/54bba21c069b0d8c86d6b676.html
MJ在这里有透露,可惜有点不懂...
2009-10-18 16:14
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
偶去hook KeBugCheckEx试试.
2009-10-18 16:17
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
抄mj的:
ZwQuerySystemInformation, 0,得到phyrange = physicalpage*pagesize,
physical = MmGetPhysicalAddress(virtualaddress)
if(physicalzddress > phyrange)
invalid
virtualaddress = MmGetVirtualAddress(physical); // 这个还要改回来?能不能直接用上边的virtualaddress啊?
2009-10-18 16:40
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
9
没有100% OK的方法。
2009-10-18 18:50
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
继续谷歌...
2009-10-19 15:35
0
雪    币: 1407
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
贴一段以前zzzevazzz大牛的话(原帖忘了 找不到了), 顺便请路过的各位鉴定下。
ps 下面的那几个函数2k下貌似没。

21
zzzevazzz  2009-04-07 22:10 | 回复
MmProbeAndLockPages肯定不行。对于分页地址,MmIsAddressValid也没用。
我以前也想过这个问题,最后我发现,WinDbg读内存不会引起系统崩溃,不管你读哪个位置,最多也就是返回一堆问号而已。
反汇编NtSystemDebugControl可以知道,系统用的是MmDbgCopyMemory,再继续反汇编,发现其中的MiDbgWriteCheck和MiDbgReleaseAddress用到了invlpg指令。恕我孤陋寡闻,不知道这是不是用来解决joanna所说的TLB corruption问题。
不过,即使有汇编代码,我还是没搞懂MmDbgCopyMemory到底是怎么保证读分页内存安全的。还是说其实根本就不读分页内存。那调试器是如何做到的呢?  

22
zzzevazzz  2009-04-07 22:49 | 回复
实际上,调试器把内核访问违例这个异常处理掉,就像处理用户态内存地址一样,这样就不会BugCheck,于是所有的地址都直接读也没关系了。
2009-10-19 17:22
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
12
invlpg是解决不了TLB污染问题的吧。

所以说调试器本身也不行,例如你可以挂上调试器,u一下一些万年不会调用的API,例如CmRegisterCallback,或者NTFS中对FSCTL_MASK_AS_SYSTEM_HIVE的处理代码,基本都是显示无效的。
2009-10-19 19:36
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不是没有,现成的函数没有。得靠你自己编
2009-10-19 20:38
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
感觉有点接近答案了.
2009-10-27 18:23
0
雪    币: 34
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
透露下方法哪~~~~给个思路~~~
2009-11-2 09:54
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
没有现成的,可以看看缺页中断处理代码,里面有查找磁盘页面的代码
2009-11-24 10:54
0
游客
登录 | 注册 方可回帖
返回
//