首页
社区
课程
招聘
未解决 [已解决]关于VT项目HyperBone的Invalid Guest State问题
发表于: 2023-6-19 10:01 6490

未解决 [已解决]关于VT项目HyperBone的Invalid Guest State问题

2023-6-19 10:01
6490

我的运行环境是单核,Win10

 

驱动跑起来之后 触发好多次Exit 28号事件,由于我也是第一次跑通VT项目,也不知道这个正不正常,在触发28号函数多次(有的时候10几次,有的时候几百次)触发 33号 直接G。

 

每次的共同点是 Dbg输出 覆写CPU0结束之后还能执行几次28号Exit事件,然后就执行了一次 33 号Exit事件,ExitQualification为0。查了Intel白皮书是无效的客户区状态

1
33. VM-entry failure due to invalid guest state. A VM entry failed one of the checks identified in Section 27.3.1.

这问题就出现了0.0 明明 28 号 Exit 事件就是客户机发起的吧,为什么在执行这么多次28 号事件后 又爆出 客户机无效 的错误啊(是我理解的执行过程有问题吗。。。。)

 

我输出了 每一条28号函数修改的寄存器,发现都是对CR3的写操作
以下是覆写CPU0之后对 33号事件 对控制寄存器的读写操作(它只操作了CR3且都是写操作)
VmExitCR: write CR 3, val=15f5b002
VmExitCR: write CR 3, val=1ad002
VmExitCR: write CR 3, val=da41002
VmExitCR: write CR 3, val=595a002
VmExitCR: write CR 3, val=da41002
VmExitCR: write CR 3, val=6ef99002
VmExitCR: write CR 3, val=e4e1002
VmExitCR: write CR 3, val=e4e0001
VmExitCR: write CR 3, val=ffffce001c2fdb28

 

为什么他要写这么长的。。。。

1
ffffce001c2fdb28:1111 1111 1111 1111 1100 1110 0000 0000 0001 1100 0010 1111 1101 1011 0010 1000

查了Intel开发手册27.3.1.1 Checks on Guest Control Registers, Debug Registers, and MSRs

1
The CR3 field must be such that bits 63:52 and bits in the range 51:32 beyond the processor’s physicaladdress width are 0

上述Exit事件号
\====================================
28 EXIT_REASON_CR_ACCESS
33 EXIT_REASON_INVALID_GUEST_STATE
\====================================

 

Dbg输出结果
\====================================
HyperBone: CPU 0: DriverEntry: Subverting started...
ExitHandler cnt: 1, reason: 28
ExitHandler cnt: 2, reason: 28
ExitHandler cnt: 3, reason: 28
ExitHandler cnt: 4, reason: 28
ExitHandler cnt: 5, reason: 28
ExitHandler cnt: 6, reason: 28
ExitHandler cnt: 7, reason: 28
HyperBone: CPU 0: DriverEntry: Subverting finished
ExitHandler cnt: 8, reason: 28
ExitHandler cnt: 9, reason: 28
ExitHandler cnt: 10, reason: 28
ExitHandler cnt: 11, reason: 28
ExitHandler cnt: 12, reason: 28
ExitHandler cnt: 13, reason: 28
ExitHandler cnt: 14, reason: 28
ExitHandler cnt: 15, reason: 28
ExitHandler cnt: 16, reason: 28
ExitHandler cnt: 17, reason: 33
HyperBone: CPU 0: VmExitStartFailed: Failed to enter VM, reason 33, code 0

 

最后的蓝屏错误是自己弹出的 Hyper V ERROR。。。。


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

最后于 2023-6-19 22:13 被hr_0515编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 1343
活跃值: (244)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

在GitHub上翻到一个不知名的人 更新了源代码 我一直没有注意到。 就算没找到那个源码我也快找到真相了。额。。。。

我输出了很多相关信息,当我发现当前执行的寄存器索引是4的时候,我猜到与RSP有关了,但是还是不知道咋弄。

最后偶然找到了hub上的代码 是这样的:
if (data->Fields.Register == 4) {
    regValue = GuestState->GuestRsp;
}
之后再把regValue 写入到 CR3,这样就不会报33号错误了。

它的英文注释是:
Because its RSP and as we didn't save RSP correctly (because of pushes) so we have make it points to the GUEST_RSP

最后于 2023-6-19 22:11 被hr_0515编辑 ,原因:
2023-6-19 22:10
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
你好,DPC_WATCHDOG_VIOLATION蓝屏怎么解决?
2023-9-13 10:50
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
花了一点时间来编译启动, 给后来者看
修改 两个地方 
1. VmxSetupVMCS
   加上      vmCpuCtl2Requested.Fields.EnableINVPCID = TRUE;

2. VmExitCR  函数加上     
if (data->Fields.Register == 4)
    {
        INT64 RSP = 0;
        __vmx_vmread(GUEST_RSP, &RSP);
        *regPtr = RSP;
    }
__vmx_vmwrite( GUEST_CR3, *regPtr ); 改成 __vmx_vmwrite(GUEST_CR3, (*regPtr & ~(1ULL << 63)));

这是那个博客地址  https://rayanfam.com/topics/hypervisor-from-scratch-part-6/
GitHub地址  https://github.com/SinaKarvandi/Hypervisor-From-Scratch
2024-8-13 13:55
0
游客
登录 | 注册 方可回帖
返回
//