|
看了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,虚拟机已经卡死。
- VOID VmExitEvent( IN PGUEST_STATE GuestState )
- {
- INTERRUPT_INFO_FIELD Event = { 0 };
- ULONG64 ErrorCode = 0;
- ULONG InstructionLength = (ULONG)VmcsRead( VM_EXIT_INSTRUCTION_LEN );
- Event.All = (ULONG32)VmcsRead( VM_EXIT_INTR_INFO );
- ErrorCode = VmcsRead( VM_EXIT_INTR_ERROR_CODE );
- if (Event.Fields.ErrorCodeValid)
- __vmx_vmwrite( VM_ENTRY_EXCEPTION_ERROR_CODE, ErrorCode );
- switch (Event.Fields.Type)
- {
- case INTERRUPT_NMI:
- DPRINT( "HyperBone: CPU %d: %s: HandleNmi()\n", CPU_IDX, __FUNCTION__ );
- VmxInjectEvent( INTERRUPT_NMI, VECTOR_NMI_INTERRUPT, 0 );
- ASSERT( FALSE );
- break;
- case INTERRUPT_HARDWARE_EXCEPTION:
- DPRINT( "HyperBone: CPU %d: %s: Hardware Exception (vector = 0x%x)\n", CPU_IDX, __FUNCTION__, Event.Fields.Vector );
- VmxInjectEvent( Event.Fields.Type, Event.Fields.Vector, InstructionLength );
- break;
- case INTERRUPT_SOFTWARE_EXCEPTION:
- switch (Event.Fields.Vector)
- {
- case VECTOR_BREAKPOINT_EXCEPTION:
- DPRINT( "HyperBone: CPU %d: %s: int3 EIP = 0x%p\n", CPU_IDX, __FUNCTION__, GuestState->GuestRip );
- VmxInjectEvent( INTERRUPT_SOFTWARE_EXCEPTION, VECTOR_BREAKPOINT_EXCEPTION, InstructionLength );
- break;
- default:
- DPRINT( "HyperBone: CPU %d: %s: Software Exception (vector = 0x%X)\n", CPU_IDX, __FUNCTION__, Event.Fields.Vector );
- VmxInjectEvent( Event.Fields.Type, Event.Fields.Vector, InstructionLength );
- break;
- }
- break;
- default:
- DPRINT( "HyperBone: CPU %d: %s: Unhandled event type %d\n", CPU_IDX, __FUNCTION__, Event.Fields.Type );
- VmxInjectEvent( Event.Fields.Type, Event.Fields.Vector, InstructionLength );
- break;
- }
- }
复制代码
我真的是新手,不会找什么资料,希望知道的大神可以指点一下,教育也好侮辱也好,求指条明路,这个问题到底是什么情况,我该怎么才能更好理解vt
|
|