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

2023-11-12

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

视频作者:小宝来了

视频连接: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是一个

typedefunion
{
struct
{
           unsigned SSE3:1;
           unsigned PCLMULQDQ:1;
           unsigned DTES64:1;
           unsigned MONITOR:1;
           unsigned DS_CPL:1;
           unsigned VMX:1;
           unsigned SMX:1;
           unsigned EIST:1;
           unsigned TM2:1;
           unsigned SSSE3:1;
           unsigned Reserved:22;
};
 
}_CPUID_ECX;

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


2.查看CR0 CR4控制寄存器

CR0寄存器的PE、PG、NE位必须为1

     如果不为1 则是在BIOS中没有启用VT

CR4寄存器的VMXE位是否为1

     如果为1则说明已经有VT存在了

用到的结构圷:

typedefunion
{
struct
{
           unsigned PE:1;
           unsigned MP:1;
           unsigned EM:1;
           unsigned TS:1;
           unsigned ET:1;
           unsigned NE:1;
           unsigned Reserved_1:10;
           unsigned WP:1;
           unsigned Reserved_2:1;
           unsigned AM:1;
           unsigned Reserved_3:10;
           unsigned NW:1;
           unsigned CD:1;
           unsigned PG:1;
           //unsigned Reserved_64:32;
};
 
}_CR0;
 
typedef union
{
struct{
           unsigned VME:1;
           unsigned PVI:1;
           unsigned TSD:1;
           unsigned DE:1;
           unsigned PSE:1;
           unsigned PAE:1;
           unsigned MCE:1;
           unsigned PGE:1;
           unsigned PCE:1;
           unsigned OSFXSR:1;
           unsigned PSXMMEXCPT:1;
           unsigned UNKONOWN_1:1;             //These are zero
           unsigned UNKONOWN_2:1;             //These are zero
           unsigned VMXE:1;                     //It's zero in normal
           unsigned Reserved:18;             //These are zero
           //unsigned Reserved_64:32;
};
}_CR4;


3.检查MSR寄存器(MSR_IA32_FEATURE_CONTROL)

MSR_IA32_FEATURE_CONTROL的lock位是否为1

 如果不为1则VT指令没有开启无法使用某些VT指令

 用到的结构如下:

typedefstruct _IA32_FEATURE_CONTROL_MSR
{
unsigned Lock                    :1;              // Bit 0 is the lock bit - cannotbe modified once lock is set
unsigned Reserved1                  :1;              //Undefined
unsigned EnableVmxon   :1;              // Bit 2. Ifthis bit is clear, VMXON causes a general protection exception
unsigned Reserved2                  :29;  //Undefined
unsigned Reserved3                  :32;  //Undefined
 
} IA32_FEATURE_CONTROL_MSR;

代码如下:

#pragma once

#include <ntddk.h>
#include "vtsystem.h"
#include "vtasm.h"


BOOLEAN bCheckCpuSuppert()
{

	//1.执行CPUID

	ULONG uRet_Eax, uRet_Ebx, uRet_Ecx , uRet_Edx;
	_CR0 cr0;
	_CR4 cr4;
	_CPUID_ECX uCpuId_Ecx;
	IA32_FEATURE_CONTROL_MSR msr;

	Asm_CPUID(1, &uRet_Eax, &uRet_Ebx, &uRet_Ecx, &uRet_Edx);

	*((PULONG)&uCpuId_Ecx) = uRet_Ecx;

	if (uCpuId_Ecx.VMX != 1)
	{
		DbgPrint("当前CPU不支持VT!\n");
		return FALSE;
	}


	//2.CR0 CR4

	cr0 = Asm_GetCr0Ex();

	if (cr0.PE != 1 || cr0.PG != 1 || cr0.NE != 1)
	{
		DbgPrint("请在Bios里面设置VT选项!\n");
		return FALSE;
	}

	cr4 = Asm_GetCr4Ex();

	if (cr4.VMXE == 1)
	{
		DbgPrint("已经有VT啦!\n");
		return FALSE;
	}

	//3.Msr
	Asm_ReadMsrEx(MSR_IA32_FEATURE_CONTROL, (PMSR)&msr);

	if (msr.Lock != 1)
	{
		DbgPrint("VT 指令没有锁定!\n");
		return FALSE;
	}

	DbgPrint("当前CPU支持VT!\n");

	return TRUE;
}

下一章将讲退出事件的分发


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VT系列二:检测是否支持虚拟化 的相关文章

  • 嵌入式(TCP、IP协议原理)

    TCP IP协议网络封包格式 以太网头 IP头 TCP头 TCP是一种面向连接的 可靠的数据传输 一 TCP的可靠传输 通过确认和重发机制 1 TCP把所有要发送的数据进行编号 每一个字节用一个号 2 发送时从当前数据位置 发送window
  • 【图片标注】推荐一款特别好用的图片分割标注工具EIseg

    前言 最近在百度飞浆的公众号看到一个特别有趣的图片标注工具EIseg 它labelme等标记工具不同的是 它是一个通过深度学习来标注的工具 使用鼠标点一下就能完成标注任务 下面是工具的演示 本文章仅供学习 操作演示 标注效果 绿色的点为正样
  • java jps监控_java性能监控工具jps-windows

    jps Lists the instrumented Java Virtual Machines JVMs on the target system This command is experimental and unsupported
  • mybatis jdbcType: DATE ,TIMESTAMP 区别:

    1 mybatis中 jdbcType 时间类型 当jdbcType DATE 时 只传入了 年月日 jdbcType TIMESTAMP 年月日 时分秒 2 jdbcType 是否必须 使用时 没有加jdbcType 正常 加上jdbcT
  • 【零知ESP8266教程】AP模式下WIFI UDP协议通信示例

    本帖主要讲解ESP8266 WIFI功能关于UDP协议网络传输的应用 这里演示了ESP8266在AP模式下UDP通信的示例 1 硬件 零知ESP8266开发板 2 软件 1 代码如下 文件 udp server ino by 零知实验室 u
  • 为什么 DeFi 需要探索以太坊外的世界?

    由于DeFi生态系统的总锁仓价值超过130亿美元 DeFi创造了最近几周的最高纪录 可以说 DeFi是当前加密货币行业发展最快的一个领域 在短短几个月内吸引了大量资本和市场参与者 在这一强劲势头下 以太坊仍是DeFi市场的主宰 占据了96
  • 联想网络同传系统_皮层网络结构的联想学习“理论”

    本文来自公众号 吴思Lab计算神经科学及类脑计算 AI科技评论 获授权转载 如需转载 请联系吴思Lab 编者按 张单可博士是我们课题组已毕业的博士生 最近刚从美国东北大学做完博士后回来 在中国科学院深圳先进技术研究院工作 这是他在博士后期间
  • 平台使用篇

    本课程提供的实验平台总体可以分成两个部分 硬件平台和软件平台 本讲简要介绍各个部分的基本组成及实验开发流程 平台使用篇 RflySim飞控底层实验平台配置介绍 01 电脑配置 1 1推荐配置 系统 Windows 10 x64系统 版本大于
  • MySQL如何查询表中重复的数据

    文章目录 一 查询重复记录 二 总结 一 查询重复记录 例 查询员工表里出现重复姓名的记录 思路 1 查看重复记录 首先要使用分组函数 group by 再用聚合函数中的计数函数count name 给姓名列计数 且使用group by 后
  • 【论文阅读】BGRL:Bootstrapped Representation Learning on Graphs

    目录 摘要 1 引言 2 Bootstrapped Graph Latents BGRL 2 1 BGRL组件 2 2 BGRL更新步骤 2 2 1 更新 2 2 2 更新
  • 解密全产业供应关系,助力企业寻找客户资源,洞察商机

    在当今商业竞争日益激烈的时代 企业要实现长期可持续的发展 需要深入了解供应链关系 抢先捕获商机 拓展优质的客户资源 然而 供应链关系错综复杂 商机 客户隐藏在其中 如何挖掘和洞察成为了企业亟需解决的难题 五度易链基于产业链上下游的视角 帮助
  • 合并两个有序数组(go实现

    合并两个有序数组 go实现 题目描述 解题思路 代码示例 执行结果 更多 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并
  • 机器学习python实现,自我总结

    机器学习代码及套用 网上很多机器学习的资料 我看了很多 最后发现用的时候其实没有那么复杂 也不需要了解很多的数学知识 也庆幸自己没有在上机器学习的课时放弃 写篇文章来总结总结吧 本文使用python来套 导入机器学习模块 自己随便百度一下机
  • centos网页/phpmyadmin 打不开_苹果手机Safari打不开网页?按下一个键,马上就能用...

    Safari 苹果手机自带的一个浏览器 很多人都认为是个垃圾 甚至把它卸载 但其实 Safari是当时乔布斯最看重的一个苹果武器 如果真要好好利用起来 这个自带软件远远比你想象的厉害
  • 下载LAMBDA Group的代码

    LAMBDA Group 的文章在其主页有公布代码和数据集 具体在其 主页 gt 数据与代码 下面的 代码 栏列了文章 比如点开第一篇 AcMR 里面有个下载代码的链接 code 但点开会发现 无法链接到服务器 根据杨嘉祺的邮件回复 在网址

随机推荐

  • Google前工程经理王忻:如何准备软件工程师的面试

    2010 10 20 10 48 4639次阅读 来源 伯乐在线 职场博客 已有0条评论 发表评论 关键词 Google 软件工程师 面试 作者 人力资源 收藏这篇资讯 导读 原文作者王忻 Google前工程经理 2003年月加入Googl
  • 【华为OD机试真题2023B卷 JAVA&JS】人气最高的店铺

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 人气最高的店铺 知识点贪心排序 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 某购物城有m个商铺 现决定举办一场活动选出人气最高店铺 活动共有n位市民参与 每位市民只能
  • 微信小程序Token登录验证

    上图是微信开发文档提供的图 最近开发一款小程序 看了许久的微信文档 这里来记录一下其中的登录与授权过程 总体流程 前端执行wx login 获取code传给后端 后端通过微信官方的登录凭证校验接口获取到session key与openid
  • 使用PHP语言实现ETH 及 token转账

    以太坊转账 废话不多说直接上代码 代码下载地址 https download csdn net download u012841825 11021920 github代码 用你们可爱的小手 点一下星星 https github com zc
  • Angular 模态框 入坑记

    今天用到了ui bootstrap中的modal 觉得用起来还不错 也比较简单 博主以前用个ngDialog做的模态框 虽然不知道对不对 但这个插件也还可以 这貌似是我目前为止用过最简单的功能了 所以博客内容也很简单 大家一看就能懂 因为博
  • Qt中布局管理使用总结

    目录 1 五大布局 1 1 QVBoxLayout垂直布局 1 2 QHBoxLayout水平布局 1 3 QGridLayout网格布局 1 4 QFormLayout表单布局 1 5 QStackedLayout分组布局 1 6 五大布
  • linux下多线程:经典生产者和消费者示例

    生产者和消费者典型案例 include
  • 使用db doctor批量更新库

    之前旧版本的封装库 在更新candence软件后 需要使用db doctor对其进行更新 但是一个一个更新太慢 搜了半天 没有找到如何批处理更新 直接硬钢 于是将放置封装库文件目录下任意类型文件全部设置 将原来选中的文件名和后缀替换为 点击
  • Mac远程Win桌面官方工具——Microsoft Remote Desktop for mac

    微软官方专门为Mac用户提供了一款类Windows mstsc的远程桌面工具 Microsoft Remote Desktop for mac 专门用于远程控制Windows桌面 但是 苹果Appstore中国区无法搜索到该软件 不知道什么
  • 简单几步升级Spring security4.x升级到5.x

    本次升级源自一次安全漏洞提醒 Spring Security 身份认证绕过漏洞 CVE 2022 22978 现将漏洞相关详情下发 如系统使用了受影响版本软件 请参照处置建议及时完成处理 风险名称 Spring Security 身份认证绕
  • oracle自动生成uuid的实现方法

    oracle自动生成uuid方法 1 创建一个表 1 create table t user id varchar2 200 name varchar2 200 2 生成uuid的语句 1 2 alter table t user modi
  • Android Studio出现ERROR: AdbHostServer.cpp:102: Unable to connect to adb daemon on port: 5037问题

    打开android studio自带模拟机出现问题 原因是adb exe因为被阻止不能启动 具体错误代码如下 Emulator emulator ERROR AdbHostServer cpp 102 Unable to connect t
  • 性能不输 x265!国产开源 AVS2 高清实时编码器 xAVS2

    2018 年 1 月 31 日 北京大学数字视频编解码技术国家工程实验室视频编码算法研究室 PKU VCL 开源了 AVS2 高清实时编码器 xAVS2 V1 0 AVS2 是我国新一代视频编码国家标准 和第一代 AVS 视频编码标准相比
  • jenkins添加网页链接方法

    代码 li 外网页测试链接 a href http www baidu com 百度 a li li 本地网页测试链接 a href http 192 168 0 236 8080 seed package index html 我的本地h
  • 高德地图实现点聚合功能的详细步骤加截取地图图片 (附源码)

    目录 介绍 准备工作 1 注册并登录高德地图开放平台 申请密钥 2 在Vue项目中安装高德地图的相关库 插件 一 点聚合 1 引入高德地图API font color purple initializeMap font color purp
  • Codeforces ZeptoLab Code Rush 2015

    Codeforces ZeptoLab Code Rush 2015 比赛链接 http codeforces com contest 526 A King of Thieves time limit per test 1 second m
  • python不能创建字典的是_python字典key不能是可以是啥类型

    python中字典的key不能是可变类型 字典可存储任意类型对象 其中值可以取任何数据类型 但键必须是不可变的 如字符串 数字或元组 语法格式 d key1 value1 key2 value2 字典是另一种可变容器模型 且可存储任意类型对
  • c++的类与对象(下)

    1 初始化列表 在创建对象时 编译器通过调用构造函数 给对象中各个成员变量一个合适的初始值 构造函数体中的语句只能将其称作为赋初值 而不能称作初始化 因为初始化只能初始化一次 初始化的本质就是只能初始化一次 而构造函数体内可以多次赋值 以一
  • 漫话算法[二分查找]:不用背你也能写出漂亮的二分查找框架并秒杀至少5道题!

    快来和叮当学习算法吧 B站同步更新 同步到开源项目Github传送门 Easy Programming及微信公众号 CVBear 项目内含Leetcode五杀刷题指南 致力于通过5个问题带你入门掌握算法套路 漫话算法 二分查找 算法模板 一
  • VT系列二:检测是否支持虚拟化

    本文只是学习此视频后的一些总结 不当之处还请指出 视频作者 小宝来了 视频连接 http bbs pediy com showthread php t 211973 约定 本文中出现的名词 虚拟机 客户机 GUEST 都是被监控的操作系统或