看流星社区

 找回密码
 注册账号
查看: 1975|回复: 0

VT系列二:检测是否支持虚拟化

[复制链接]

该用户从未签到

发表于 2017-6-1 12:17:39 | 显示全部楼层 |阅读模式



本文只是学习此视频后的一些总结 不当之处还请指出

视频作者:小宝来了

视频连接:http://bbs.pediy.com/showthread.php?t=211973

约定:

本文中出现的名词

虚拟机 客户机 GUEST 都是被监控的操作系统或应用程序

宿主机 HOST Hypervisor都是指监控虚拟机的“原”操作系统




VMM:当客户机发生退出事件时,进入的就是VMM

VM:当客户机正常运行时就是VM

VMM监控VM





步骤在Intel手册35.1章
1.使用CPUID指令查看CPU信息

需要关注的是ECX(RCX)寄存器

这里只讲x86
返回的ecx是一个
  1. typedefunion
  2. {
  3. struct
  4. {
  5.            unsigned SSE3:1;
  6.            unsigned PCLMULQDQ:1;
  7.            unsigned DTES64:1;
  8.            unsigned MONITOR:1;
  9.            unsigned DS_CPL:1;
  10.            unsigned VMX:1;
  11.            unsigned SMX:1;
  12.            unsigned EIST:1;
  13.            unsigned TM2:1;
  14.            unsigned SSSE3:1;
  15.            unsigned Reserved:22;
  16. };
  17. }_CPUID_ECX;
复制代码

我们需要判断其中VMX位是否为1 是支持VT 否则不支持




2.查看CR0 CR4控制寄存器
CR0寄存器的PE、PG、NE位必须为1
  如果不为1 则是在BIOS中没有启用VT
CR4寄存器的VMXE位是否为1
  如果为1则说明已经有VT存在了
用到的结构圷:
  1. typedefunion
  2. {
  3. struct
  4. {
  5.            unsigned PE:1;
  6.            unsigned MP:1;
  7.            unsigned EM:1;
  8.            unsigned TS:1;
  9.            unsigned ET:1;
  10.            unsigned NE:1;
  11.            unsigned Reserved_1:10;
  12.            unsigned WP:1;
  13.            unsigned Reserved_2:1;
  14.            unsigned AM:1;
  15.            unsigned Reserved_3:10;
  16.            unsigned NW:1;
  17.            unsigned CD:1;
  18.            unsigned PG:1;
  19.            //unsigned Reserved_64:32;
  20. };
  21. }_CR0;
  22. typedef union
  23. {
  24. struct{
  25.            unsigned VME:1;
  26.            unsigned PVI:1;
  27.            unsigned TSD:1;
  28.            unsigned DE:1;
  29.            unsigned PSE:1;
  30.            unsigned PAE:1;
  31.            unsigned MCE:1;
  32.            unsigned PGE:1;
  33.            unsigned PCE:1;
  34.            unsigned OSFXSR:1;
  35.            unsigned PSXMMEXCPT:1;
  36.            unsigned UNKONOWN_1:1;             //These are zero
  37.            unsigned UNKONOWN_2:1;             //These are zero
  38.            unsigned VMXE:1;                     //It's zero in normal
  39.            unsigned Reserved:18;             //These are zero
  40.            //unsigned Reserved_64:32;
  41. };
  42. }_CR4;
复制代码


3.检查MSR寄存器(MSR_IA32_FEATURE_CONTROL)
MSR_IA32_FEATURE_CONTROL的lock位是否为1
如果不为1则VT指令没有开启无法使用某些VT指令
用到的结构如下:
  1. typedefstruct _IA32_FEATURE_CONTROL_MSR
  2. {
  3. unsigned Lock                    :1;              // Bit 0 is the lock bit - cannotbe modified once lock is set
  4. unsigned Reserved1                  :1;              //Undefined
  5. unsigned EnableVmxon   :1;              // Bit 2. Ifthis bit is clear, VMXON causes a general protection exception
  6. unsigned Reserved2                  :29;  //Undefined
  7. unsigned Reserved3                  :32;  //Undefined
  8. } IA32_FEATURE_CONTROL_MSR;
复制代码
代码如下:
  1. #pragma once
  2. #include <ntddk.h>
  3. #include "vtsystem.h"
  4. #include "vtasm.h"
  5. BOOLEAN bCheckCpuSuppert()
  6. {
  7.         //1.执行CPUID
  8.         ULONG uRet_Eax, uRet_Ebx, uRet_Ecx , uRet_Edx;
  9.         _CR0 cr0;
  10.         _CR4 cr4;
  11.         _CPUID_ECX uCpuId_Ecx;
  12.         IA32_FEATURE_CONTROL_MSR msr;
  13.         Asm_CPUID(1, &uRet_Eax, &uRet_Ebx, &uRet_Ecx, &uRet_Edx);
  14.         *((PULONG)&uCpuId_Ecx) = uRet_Ecx;
  15.         if (uCpuId_Ecx.VMX != 1)
  16.         {
  17.                 DbgPrint("当前CPU不支持VT!\n");
  18.                 return FALSE;
  19.         }
  20.         //2.CR0 CR4
  21.         cr0 = Asm_GetCr0Ex();
  22.         if (cr0.PE != 1 || cr0.PG != 1 || cr0.NE != 1)
  23.         {
  24.                 DbgPrint("请在Bios里面设置VT选项!\n");
  25.                 return FALSE;
  26.         }
  27.         cr4 = Asm_GetCr4Ex();
  28.         if (cr4.VMXE == 1)
  29.         {
  30.                 DbgPrint("已经有VT啦!\n");
  31.                 return FALSE;
  32.         }
  33.         //3.Msr
  34.         Asm_ReadMsrEx(MSR_IA32_FEATURE_CONTROL, (PMSR)&msr);
  35.         if (msr.Lock != 1)
  36.         {
  37.                 DbgPrint("VT 指令没有锁定!\n");
  38.                 return FALSE;
  39.         }
  40.         DbgPrint("当前CPU支持VT!\n");
  41.         return TRUE;
  42. }
复制代码
下一章将讲退出事件的分发


   





点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 13:54

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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