首页
社区
课程
招聘
[求助]手工修改pde重启
发表于: 2012-9-7 17:31 7696

[求助]手工修改pde重启

2012-9-7 17:31
7696
void MarkPdeNotPresent( PPDE pPde )
{       
        __asm
        {
                mov eax, pPde
                and dword ptr [eax], 0xFFFFFFFE        //mark the pde not present
        }

}
想做拦截页错误处理,hook后驱动中自己修改pde,在执行到这一句时and dword ptr [eax], 0xFFFFFFFE,cpu重启,没有蓝屏(所以也没有dump分析)
不知道什么原因,请前辈们指点一二,感激不尽

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
等的好累啊
继续等
希望大牛出现
2012-9-7 19:20
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
计算 PPDE  的算法不对 你用的应该是简化掉不支持PAE的算法
这一句 仅相当于and一下 不会出问题的
2012-9-7 19:56
0
雪    币: 2484
活跃值: (2154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
首先你要确认传入的pPde是否正确,其次不能对nt模块和hal模块所在内存页的P位设0
因为nt模块和hal模块都是大内存分页
2012-9-7 20:18
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
感谢whipk回复
我调试pPde是正确的
whipk所说 “不能对nt模块和hal模块所在内存页的P位设0 因为nt模块和hal模块都是大内存分页”为什么大分页内存不可以呢? 原因何在仅仅是大页么?还是某些其他引起cpu的错误?
and dword ptr [eax], 0xFFFFFFFE 修改内存的时候 cpu会检测到什么吗?
请前辈指点
2012-9-7 21:57
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
回loqich兄
ppde的地址是对的,我单步跟着看的
是的我的环境是单核 非PAE环境下的
2012-9-7 21:59
0
雪    币: 952
活跃值: (1821)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
你下载的是一个od插件源码吧,我以前测试单核非PAE下是没问题的
你看这个代码 里面好像记得有类似的东西
http://bbs.pediy.com/showthread.php?t=154384
2012-9-7 22:29
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
回whipk兄
我清除其他大页的P位没事。。。 为什么nt的不可以呢,此时我也未引用其数据和代码啊,即便引用了此时tlb也应该在cpu里了,不是么,还请前辈指点缘由
2012-9-7 22:35
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
回loqich兄
不是od插件,是自己的驱动里操作的
2012-9-7 22:36
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
周末继续苦等, 不弄明白 不吃饭了
2012-9-8 10:20
0
雪    币: 2484
活跃值: (2154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
nt和hal模块是系统内最底层的东西的,无时无刻都有其代码运行中
一旦nt模块所在内存页的P位为0,等于整个内核突然从电脑系统中消失,如果你开调试器观察的话,会发现内核空间内的所有指令都变为??

Intel的官方手册明确规定软件系统(windows, linux)不能依赖和假设tlb机制,tlb缓存的产生和消亡对于软件系统来说只是有限可控的,tlb缓存中不一定有nt或hal模块的tlb entry,内核运行指令运行时一旦产生缺页异常,这时连idt表找不到了

and dword ptr [eax], 0xFFFFFFFE导致cpu重启的情况,我只在将nt模块所在的内存页p位设为0时遇到过。
除此之外都很正常,我建议你自己申请一块内块,然后对那块内存mark page not present试试。
2012-9-8 12:12
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
whipk兄 感谢回复
确实,如您所说,我测试其他非nt大页的都没有关系.
但是没有完全弄明白: 当前代码运行于我的驱动模块内,其所在pde固然不是nt的pde,执行"and dword ptr [eax], 0xFFFFFFFE"句时,仅仅是对内存做了个赋值操作,此时不论(nt所在大页)tlb是否存在,个人认为应该不影响当前的执行环境,因为没有引用其代码和数据,如果说等到引用到相应的nt代码或数据重启还可以理解,而且此时应该不影响原来的nt的tlb呢
个人理解,还请多拍砖
2012-9-8 17:19
0
雪    币: 2484
活跃值: (2154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
为什么你要对pde的p位设0呢?除非目标线性地址确实是在大内存分页内
普通的驱动如程序如果不在注册表中指定加载为大内存分页,那么就是4K的内存页了
普通4K分页下1个pde下面有1024个pte,一旦对pde p位设0后,就等于1024个pte都失效

你的缺页异常处理程序应该在你的驱动程序地址空间内吧?缺页异常处理程序所在的内存页P位不能为0
如果p位为0的时候一旦其它地方产生缺页异常,cpu搜索idt表0xE向量号时,会因为找不到缺页异常处理程序,产生一个双重错误异常,进而系统蓝屏
2012-9-8 19:59
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
回复whipk兄
是的,正如whipk所言,缺页异常在我的驱动中呢,而且是设置好了之后再操作的pde
我真希望它蓝屏啊,可是没有蓝屏,没有dump看,只是cpu重启呢,所以很郁闷~
2012-9-9 09:21
0
雪    币: 507
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
请各位壮士`豪杰指教
2012-9-10 20:55
0
游客
登录 | 注册 方可回帖
返回
//