首页
社区
课程
招聘
[讨论]一次Vista下恢复SSDT致使系统崩溃的原因浅探
发表于: 2010-3-24 23:07 4962

[讨论]一次Vista下恢复SSDT致使系统崩溃的原因浅探

2010-3-24 23:07
4962
恢复SSDT没什么好说的,网上遍地都是,都用烂了;

而我在Vista下恢复SSDT,偶然地发现了崩溃,其它系统我未试;

代码完成时,在很多种情况下测试,都没发现问题;很偶然地,在系统重启后的几分钟后(甚至可能更长),期间没有什么操作,再恢复SSDT,蓝屏出现了;

当时就很奇怪,并且,重启后的时间的长短,是很难把握的,经过N次尝试,崩溃终于重现;(在这里要感谢一下VMware的快照功能)

驱动里面主要是这样恢复ssdt的

关中断,禁用内存保护机制 -> nt!memcpy(SSDT表, 已填好的原始SSDT表, 字节大小) -> 开中断,启用内存保护机制;

现在已证明,这样的流程是错误的,因为已经导致了系统崩溃;

nt!memcpy:
818a9d20 55              push    ebp
818a9d21 8bec            mov     ebp,esp
818a9d23 57              push    edi
818a9d24 56              push    esi
818a9d25 8b750c          mov     esi,dword ptr [ebp+0Ch]
818a9d28 8b4d10          mov     ecx,dword ptr [ebp+10h]
818a9d2b 8b7d08          mov     edi,dword ptr [ebp+8]
818a9d2e 8bc1            mov     eax,ecx
818a9d30 8bd1            mov     edx,ecx
818a9d32 03c6            add     eax,esi
818a9d34 3bfe            cmp     edi,esi
818a9d36 7608            jbe     nt!memcpy+0x20 (818a9d40)

nt!memcpy+0x18:
818a9d38 3bf8            cmp     edi,eax
818a9d3a 0f827c010000    jb      nt!memcpy+0x19c (818a9ebc)

nt!memcpy+0x20:
818a9d40 f7c703000000    test    edi,3
818a9d46 7514            jne     nt!memcpy+0x3c (818a9d5c)

nt!memcpy+0x28:
818a9d48 c1e902          shr     ecx,2
818a9d4b 83e203          and     edx,3
818a9d4e 83f908          cmp     ecx,8
818a9d51 7229            jb      nt!memcpy+0x5c (818a9d7c)

nt!memcpy+0x33:
818a9d53 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
818a9d55 ff24956c9e8a81  jmp     dword ptr nt!memcpy+0x14c (818a9e6c)[edx*4]


核心就是这句

818a9d53 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]

当eip指向这句的时候, 一切都是那么的美好, edi 是对的, esi 是对的, ecx 是对的, ebp 是对的, ..... 等等

当执行这句后, 即把SSDT表填了之后, ebp 变成了一个不认识的值, 还有其它一些寄存器的值也看似混乱了,....

memcpy当然是要返回,无奈ebp的值已经被破坏,  ret 的时候,系统无情地崩溃了.

不得其解,待解....

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
从不恢复SSDT的路过~
2010-3-25 13:28
0
雪    币: 8196
活跃值: (2791)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
不是这办法错误.是你恢复的时候注意的细节够不够?

你关闭系统内存保护使用的是什么办法?

多核竞争问题你考虑进去了么?

如果用远古的那套CR0欺骗.然后提升IRQL是肯定行不通的.

没有次次蓝就不错了.
2010-3-25 13:33
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
KfRaiseIrql(HIGH_LEVEL)
如此足以~
2010-3-25 13:37
0
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
。。。。。。。。
2010-3-25 16:32
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
-------> 答案极有可能就在这里,谢谢指导!
2010-3-25 20:30
0
游客
登录 | 注册 方可回帖
返回
//