在vmcs中设置 exception bitmap 拦截 #DB 异常,当调试器执行单步时,vmm可以正确识别到 rflags.TF 被置位从而触发 #DB 异常。
但是当我设置硬件断点时,却出现了问题。
dr0寄存器的值是正确的,该地址设置了硬件断点;rflags.TF 并未置位,表明此异常由硬件断点触发。
但是此时的 Dr6 和 Dr7 值并不正确。。。
Dr6 的值是直接从 vmm 当前环境中读取的(由vm进入vmm,dr6应该并未被修改),Dr7的值通过读取 GUEST_DR7 域获取的,应该没问题啊?
求大牛指点!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
ALwalker dr7的问题我已经发现了,但是dr6应该并未修改。如果是这样的话,由硬件断点触发,dr6.B0应该会置位才是。
ALwalker 意思是dr6置位的操作是在vmm切换到vm时,通过事件注入寻址IDT进行异常处理的过程中由CPU自动完成吗?
hzqst 他的意思是vmexit触发的优先级比硬件断点要高,所以进host的时候实际上并没有触发硬件断点。如果你要假装自己触发了硬件断点的话就自己用代码实现一遍硬件里的逻辑吧