找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6010|回复: 4

VmExitEvent为什么会死循环呢...

[复制链接]

2

主题

32

回帖

0

精华

铜牌会员

积分
68
发表于 2018-1-22 11:41:03 | 显示全部楼层 |阅读模式
看了TA大大之前,关于VT的帖子【链接我就不发了,想看的坛友们,还是自己找一找吧,说不定有其他主题你也喜欢呢】

一直都感觉vt很神秘,很想自己尝试一下,于是在github上找到一些vt的源码,包括之前 落笔飞花 在论坛里分享给我们的源码,还找一份比较简单直接的源码。HyperBone~这个大家可以在github上直接搜索找到,我就不再贴链接了。

刚开始接触,连项目属性怎么设置都不知道,编译总是不通过,附件代码是修改过项目属性的,win7debug和win10debug大家可以放心使用,如果想编译其他平台,请仔细修改项目属性BuildEvent中的Post-build Event,应该是代码作者自己修改的。。。

回到问题上,编译没有问题,然后我再win7x64平台,windbg开始调试了。

因为我是这两天才开始看vt的,基础很薄弱,就不和大家瞎扯看懂了什么了,就直接说问题吧。在整个vt建立完成之后,就是VmxpExitHandler作为主要处理函数了,根据中断事件分配给不同的函数处理,像我们正常驱动的DeviceIOControl一样,ring3发消息,ring0接收处理一样。
驱动加载完成,我打开c盘就卡死了,断点下到VmExitEvent之后,一直走INTERRUPT_SOFTWARE_EXCEPTION中的VECTOR_BREAKPOINT_EXCEPTION,虚拟机已经卡死。
  1. VOID VmExitEvent( IN PGUEST_STATE GuestState )
  2. {
  3.     INTERRUPT_INFO_FIELD Event = { 0 };
  4.     ULONG64 ErrorCode = 0;
  5.     ULONG InstructionLength = (ULONG)VmcsRead( VM_EXIT_INSTRUCTION_LEN );

  6.     Event.All = (ULONG32)VmcsRead( VM_EXIT_INTR_INFO );
  7.     ErrorCode = VmcsRead( VM_EXIT_INTR_ERROR_CODE );
  8.     if (Event.Fields.ErrorCodeValid)
  9.         __vmx_vmwrite( VM_ENTRY_EXCEPTION_ERROR_CODE, ErrorCode );

  10.     switch (Event.Fields.Type)
  11.     {
  12.     case INTERRUPT_NMI:
  13.         DPRINT( "HyperBone: CPU %d: %s: HandleNmi()\n", CPU_IDX, __FUNCTION__ );
  14.         VmxInjectEvent( INTERRUPT_NMI, VECTOR_NMI_INTERRUPT, 0 );
  15.         ASSERT( FALSE );
  16.         break;

  17.     case INTERRUPT_HARDWARE_EXCEPTION:
  18.         DPRINT( "HyperBone: CPU %d: %s: Hardware Exception (vector = 0x%x)\n", CPU_IDX, __FUNCTION__, Event.Fields.Vector );
  19.         VmxInjectEvent( Event.Fields.Type, Event.Fields.Vector, InstructionLength );
  20.         break;

  21.     case INTERRUPT_SOFTWARE_EXCEPTION:
  22.         switch (Event.Fields.Vector)
  23.         {
  24.         case VECTOR_BREAKPOINT_EXCEPTION:
  25.             DPRINT( "HyperBone: CPU %d: %s: int3 EIP = 0x%p\n", CPU_IDX, __FUNCTION__, GuestState->GuestRip );
  26.             VmxInjectEvent( INTERRUPT_SOFTWARE_EXCEPTION, VECTOR_BREAKPOINT_EXCEPTION, InstructionLength );
  27.             break;

  28.         default:
  29.             DPRINT( "HyperBone: CPU %d: %s: Software Exception (vector = 0x%X)\n", CPU_IDX, __FUNCTION__, Event.Fields.Vector );
  30.             VmxInjectEvent( Event.Fields.Type, Event.Fields.Vector, InstructionLength );
  31.             break;
  32.         }
  33.         break;

  34.     default:
  35.         DPRINT( "HyperBone: CPU %d: %s: Unhandled event type %d\n", CPU_IDX, __FUNCTION__, Event.Fields.Type );
  36.         VmxInjectEvent( Event.Fields.Type, Event.Fields.Vector, InstructionLength );
  37.         break;
  38.     }
  39. }
复制代码


我真的是新手,不会找什么资料,希望知道的大神可以指点一下,教育也好侮辱也好,求指条明路,这个问题到底是什么情况,我该怎么才能更好理解vt
lx_clip1516592264049.jpg

HyperBone-master.zip

63.74 KB, 下载次数: 2402

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2018-1-22 15:04:07 | 显示全部楼层
这不是死循环,而是多次触发VMEXIT。

此外INTEL的VT框架建议参考INTEL官方工程HAXM

2

主题

32

回帖

0

精华

铜牌会员

积分
68
 楼主| 发表于 2018-1-22 16:45:03 | 显示全部楼层
Tesla.Angela 发表于 2018-1-22 15:04
这不是死循环,而是多次触发VMEXIT。

此外INTEL的VT框架建议参考INTEL官方工程HAXM。 ...

谢谢TA大大,我会去看看HAXM。

我能知道为什么会多次触发VMEXIT吗,VT加载完成后都没事儿,但是打开vs调试软件就会直接卡死【vs远程调试器只是其中一种情况】

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2018-6-26 16:14:13 | 显示全部楼层
本帖最后由 tangptr@126.com 于 2018-10-13 03:54 编辑

详情请看Intel 64与IA-32架构程序员开发手册第三卷第25章第2节与第26章第5节第1.2次节。
你的问题在这手册的这两节里有描述。
HyperBone会直接把拦截到的软件异常直接传回给Guest,而Guest同时也没处理好异常而产生了嵌入异常,这个嵌入异常引发了VM-Exit,由于异常性质和前一次完全一样,被HyperBone再次扔回了Guest,以此类推,就是一个死循环。
HyperBone这货真心不建议用,值得参考甚至拿来抄的VT框架,个人看来大概就ksm(有实验性的VT嵌套功能),haxm(处理行为绝对标准,不过这货是安卓模拟器)啥的了。有的大佬是直接抄xen的引擎;如果要抄xen的引擎那就很考验编译器使用能力了,拿IDE基本上是没法玩的。
上述的VT框架都是可跨平台的,放到其他运行在Intel处理器上的操作系统也是能玩的。HyperBone不仅不能跨平台,连32位Windows都玩不了。

2

主题

32

回帖

0

精华

铜牌会员

积分
68
 楼主| 发表于 2018-8-20 10:13:52 | 显示全部楼层
tangptr@126.com 发表于 2018-6-26 16:14
详情请看Intel 64与IA-32架构程序员开发手册第三卷第25章第2节与第26章第5节第1.2次节。
你的问题在这手册 ...

谢谢大佬解惑,我好好看看你说的ksm,谢谢谢谢~~~
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表