Re: 求助,搜索ntoskrnl内存,遇到问题
Windows内核调试
求助,搜索ntoskrnl内存,遇到问题
ezasm
2009-03-13, 01:09 上午
DriverEntry里搜索地址范围位于base和base+size之间内存,引起崩溃
加MmIsAddressValid()判断后,该函数返回false,
但是硬编码这个地址的函数,是可以直接调用执行的,不会出错,
这样的话似乎有些矛盾了,既然这里的内存可以执行,说明代码在内存中,或者被交换出去了,总之应该是可以读取和执行的,因为DriverEntry是运行在PASSIVE_LEVEL的.
既然这样,为什么搜索读取会蓝呢?
另外不同机器上,情况不同,虚拟机一般不会有这样的地址,测试了几个机器,出问题的地址都不尽相同.同样的系统,相同大小内存,不同cpu,出问题地方都不同
Re: 求助,搜索ntoskrnl内存,遇到问题
王宇
2009-03-13, 09:26 上午
猜测原因是没有意义的,还是分析dump吧。
Re: 求助,搜索ntoskrnl内存,遇到问题
ezasm
2009-03-13, 12:43 下午
找到原因了,当某地址内存被交换出去以后MmIsAddressValid返回false,但怎么判断内存是否真的有效呢(1.已被映射到物理内存并且未被交换,2.已被映射但交换出去了,这两种情况至少有一个为true)
Re: 求助,搜索ntoskrnl内存,遇到问题
王宇
2009-03-13, 14:37 下午
还是没太看懂楼主描述的问题...
MmIsAddressValid 其实就是判断PDE/PTE Present 位的有效性:
PointerPte->u.Hard.Valid
#define MI_PDE_MAPS_LARGE_PAGE(PDE) ((PDE)->u.Hard.LargePage == 1)
在 dispatch 及以上级别引发页错误肯定蓝屏
Re: 求助,搜索ntoskrnl内存,遇到问题
ezasm
2009-03-13, 15:09 下午
谢谢王老师的解答,我对MmIsAddressValid 的理解有错误,我错误的认为如果该页已经映射,但被交换出去了,也返回true
之前崩溃的地址(addr1),不是我要找的地址(addr2),而是addr2前面的某个地址,addr1所在页还未被使用,所以读取导致蓝屏,
后来加了MmIsAddressValid做判断,当搜索到地址addr2时,由于缺页,函数返回了false,于是搜索代码跳过了,当我使用调试器去反汇编addr2时发现可以读取,所以造成了我的误解
再次感谢王老师的热情回复,调试才是王道