Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启

Windows内核调试

冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-07, 17:36 下午
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分析)
不知道什么原因,请前辈们指点一二,感激不尽

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-07, 19:19 下午
 等的好累啊~ 继续等~。~

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-07, 22:39 下午
试了下, 修改nt所在的P位重启,修改非nt所在的P位不重启。。。都是pde为什么会有这样的不同呢? 请老师前辈们指点 

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-08, 10:21 上午
周末哪都不去了继续等, 不弄明白 不吃饭了

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


格蠹老雷 2012-09-08, 18:47 下午

专研精神让人钦佩啊 ...

试过不同NT版本么?推测和PatchGuard有关

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-09, 09:24 上午
终于看到张老师了!好兴奋啊!晚辈不才让老师见笑了。
张老师,没有 PatchGuard,我的系统是XP的呀
还请老师指点迷津

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


格蠹老雷 2012-09-10, 12:58 下午

推测的重启过程:

A. 内核使用的PDE被改为无效

B. 因为中断或者DDI调用等执行到受影响的内核函数

C. CPU发现PDE无效,准备报Page Fault

D. CPU打算转去执行处理Page Fault的Trap函数,但是因为因为一个PDE最多对应于1024个页表,一个PDE被改为无效后,很多内核的内容都无效了,如果IDT或者Trap函数无效,那么会再次触发Page Fault

E. 以上两步无穷递归,系统便重启了,可能触发Double Fault,但是Double Fault的处理函数也可能无法执行了...

使用硬件调试器可能可以验证以上推测的...

 

 

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-10, 20:33 下午
感谢张老师回复!
之前也和张老师想的一样,然后又开始怀疑这个想法,因为是这样的:
调式我的驱动代码:
void MarkPdeNotPresent( PPDE pPde )
{  
  __asm
  {
    mov eax, pPde
    and dword ptr [eax], 0xFFFFFFFE  //mark the pde not present 
  }
}
这一句and dword ptr [eax], 0xFFFFFFFE 一执行系统便重启,这一句仅仅是一个内存操作,nt内核的tlb应该不会被刷新,即便被刷新,当前的引用代码和数据也还在我的驱动中(所在pde pte是存在的),驱动中在执行这个函数前也已经hook了缺页中断,系统的也是单核的,所以又怀疑了,是调试引起的(因为调试要调用内核调试引擎),就在真机上测,还是重启。个人认为cpu内部一些部件可能并不使用tlb,而是直接用的二级页转化寻址,发现不存在便重启。还是没弄明白
张老师,还有就是如果修改其他非nt内核的pde的P位不会出现重启现象,仅仅是nt才出现

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


格蠹老雷 2012-09-10, 21:11 下午

没有调试的时候,来个时钟中断或者切换一下线程就会引发刷新TLB,就引发上面说的过程了;在调试时,调试事件也会导致必须执行内核函数......

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


kkindof 2012-09-11, 10:56 上午
我个人理解认同张老师说的原因,也许就是会经过idt的缺页中断。

不知道你是怎么测试的,你能保证你自己的缺页中断处理能正确的处理回PDE为有效的情况吗?

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-11, 11:46 上午
老师,可是线程切换刷新的是非全局的tlb呀,nt的tlb是含有G全局的tlb,书上上这中的不会被刷掉啊

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-11, 11:47 上午
回kkindof
可是我已经在驱动中将缺页异常处理器替换到我的函数里了啊
请兄台指点

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


kkindof 2012-09-11, 13:04 下午
那又怎么样,你预期是想看到什么结果?

有可能执行了你的HOOK函数的话,你看得出来吗?

Re: 冰天雪地 7200。C 旋转 等待 张老师和其他前辈指点 手工修改pde重启


特来劲同学 2012-09-12, 09:08 上午
现在的预期就是不要看到重启,哪怕蓝屏都可以

Powered by Community Server Powered by CnForums.Net