恢复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 的时候,系统无情地崩溃了.
不得其解,待解....
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)