Zero-Tang / NoirVisor

The Grimoire Hypervisor solution for x86 Processors with experimental nested virtualization support. Remastering with Rust in progress.
MIT License
474 stars 81 forks source link

随机MSR导致的崩溃问题 #9

Closed huoji120 closed 4 years ago

huoji120 commented 4 years ago

我发现在windows版本 1909 以后 系统会随机的写和读一些奇奇怪怪的msr 比如:读 0x40000105 错误信息如下: Unexpected rdmsr is intercepted! Index=0x40000105 谷歌了一下发现 KVM Hyper-V based guests can notify hypervisor about occurred guest crash by writing into Hyper-V crash MSR's. This patch does handling and migration of HV_X64_MSR_CRASH_P0-P4, HV_X64_MSR_CRASH_CTL msrs. User can enable these MSR's by 'hv-crash' option. 不是很懂,这个是指自己crash了 还是这个windows上其他的hv crash了?

huoji120 commented 4 years ago

另外,在 出现 Unexpected rdmsr is intercepted! Index=0x40000105 后 系统自己蹦了

Zero-Tang commented 4 years ago

挂了调试器看了看,这可能是我没把MSR-Hook针对Windows 10写好。在调试器上看调用栈应该可以到看到NoirVisor!noir_system_call。至于0x40000100-0x40000105这6个MSR寄存器,Windows在虚拟机中时,如果系统崩溃了就直接操作这些MSR来把系统Crash掉,这个过程由VMM处理,从Windows Server 2012版本开始,系统崩溃就会读写这些寄存器。早在Windows Server 2008 R2版本,Windows就会检测虚拟机是否提供符合微软规定的接口并且使用。你或许会注意到cpuid[eax=0x400000xx]以及msr[ecx=0x40000xxx]等等的调用。VMware, Hyper-V, KVM, Xen等虚拟机软件都提供这些接口。在运行NoirVisor时,这些调用会被NoirVisor拦截,而不再是上级虚拟机软件,比如VMware。 如果你用VMware,可以修改虚拟机的.vmx文件,在最后加上一行hypervisor.cpuid.v0 = "FALSE",这使得VMware不再对虚拟机提供微软规定的虚拟机接口。虽然运行NoirVisor还是会崩溃,但是Windows就不会读写那些MSR了。 现在NoirVisor的开发重心不在于兼容新Windows 10,所以这个问题暂时不予修复。

huoji120 commented 4 years ago

好了,我修复了问题. 进一步查询资料发现了已经有人提出了这个问题,解决方法也被这个人写在了里面: https://revers.engineering/patchguard-detection-of-hypervisor-based-instrospection-p1/ https://revers.engineering/patchguard-detection-of-hypervisor-based-instrospection-p2/ 代码就不合并了,因为我这边用VS开发的,不好合并.