首页
社区
课程
招聘
[求助] vt在接管中断时,想要自定义处理中断时,只有通过hook idt吗?
发表于: 2023-4-30 10:49 6812

[求助] vt在接管中断时,想要自定义处理中断时,只有通过hook idt吗?

2023-4-30 10:49
6812

如标题,比如我配置 `Exception Bitmap` 拦截 #DB 异常时,当测试程序执行 `popf` 指令置位 rflags.TF 时,执行流陷入vmm。


如果我想让 #DB 异常不在内核异常处理派发函数中进行派发(不让调试程序接管异常),简单的在vmm的处理函数中清除 guest rflags.TF 位,以为在resume后由于TF位被清除而导致程序继续执行。但是在实际执行时,在返回vm后程序始终会按照单步每执行一条指令后都会触发 #DB 异常。


我猜想是由于陷入vmm前的CPU处于单步模式,即使在vmm处理函数中清除 guest rflags.TF 位就像内核 _KiTrap01中清除TF位一样,而不影响触发异常的程序(内核异常处理程序在 iret 返回前会将栈帧中的 rflags.TF/RF 置1)。

在返回guest时,CPU仍处单步调试状态???为什么清除TF位没有生效?或者是置位RF依然无效。。。


如果通过 hook idt 动作太大,通过内存页读写分离实现?

有没有什么好的方法?


希望各位大牛指点以下!





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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
2
去检查一下PendingDebugException
2023-4-30 16:31
0
雪    币: 936
活跃值: (4945)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
はつゆき 去检查一下PendingDebugException
经过排查发现在guest返回前并没有更新GUEST_RFLAGS域
经过测试发现PendingDebugException始终为0,意思是没有未处理的调试异常是吗?
2023-5-1 09:28
0
雪    币: 936
活跃值: (4945)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
はつゆき 去检查一下PendingDebugException
目前可以通过修改rflags.TF实现单步调试无效化 
2023-5-1 09:29
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
5
ALwalker 经过排查发现在guest返回前并没有更新GUEST_RFLAGS域[em_26] 经过测试发现PendingDebugException始终为0,意思是没有未处理的调试异常是吗?
Guest的#DB,要么来自于注入事件,要么来自于PendingDebugException.BS置位,是否可以无效化单步也是取决于以上两点。修改TF的目的是为了后续避免产生#DB。
2023-5-1 12:31
0
雪    币: 4
活跃值: (659)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我猜是你自己的VMM处理不对吧。清除guest的TF位然后进入客户肯定不会再产生单步异常的。
PendingDebugException在你这个场景基本上不可能被置位的。
另外POPF之后要执行一条指令才会触发VMEXIT
2023-5-2 10:47
0
游客
登录 | 注册 方可回帖
返回
//