首页 > 其他分享 >VT-X的学习历程(一)

VT-X的学习历程(一)

时间:2024-01-17 15:38:34浏览次数:20  
标签:__ cpuInfo 历程 检测 学习 VT kIa32FeatureControl include

学习的目标

就是如何实现一个简单VT框架并拦截指令的调用以及EPTHOOK的实现。

大概的流程

  1. 检测是否允许开启VT。
    a. 我们可以从白皮书的24.6 DISCOVERING SUPPORT FOR VMX章节中得到这样的信息

    b. 其次就是设置smx

    c. 检测CPUID是否支持VT


    cpuid第5位是否为1

Define.h

#pragma once
/// See: MODEL-SPECIFIC REGISTERS (MSRS)
enum class Msr : unsigned int {
	kIa32ApicBase = 0x01B,

	kIa32FeatureControl = 0x03A,

	kIa32SysenterCs = 0x174,
	kIa32SysenterEsp = 0x175,
	kIa32SysenterEip = 0x176,

	kIa32Debugctl = 0x1D9,

	kIa32MtrrCap = 0xFE,
	kIa32MtrrDefType = 0x2FF,
	kIa32MtrrPhysBaseN = 0x200,
	kIa32MtrrPhysMaskN = 0x201,
	kIa32MtrrFix64k00000 = 0x250,
	kIa32MtrrFix16k80000 = 0x258,
	kIa32MtrrFix16kA0000 = 0x259,
	kIa32MtrrFix4kC0000 = 0x268,
	kIa32MtrrFix4kC8000 = 0x269,
	kIa32MtrrFix4kD0000 = 0x26A,
	kIa32MtrrFix4kD8000 = 0x26B,
	kIa32MtrrFix4kE0000 = 0x26C,
	kIa32MtrrFix4kE8000 = 0x26D,
	kIa32MtrrFix4kF0000 = 0x26E,
	kIa32MtrrFix4kF8000 = 0x26F,

	kIa32VmxBasic = 0x480,
	kIa32VmxPinbasedCtls = 0x481,
	kIa32VmxProcBasedCtls = 0x482,
	kIa32VmxExitCtls = 0x483,
	kIa32VmxEntryCtls = 0x484,
	kIa32VmxMisc = 0x485,
	kIa32VmxCr0Fixed0 = 0x486,
	kIa32VmxCr0Fixed1 = 0x487,
	kIa32VmxCr4Fixed0 = 0x488,
	kIa32VmxCr4Fixed1 = 0x489,
	kIa32VmxVmcsEnum = 0x48A,
	kIa32VmxProcBasedCtls2 = 0x48B,
	kIa32VmxEptVpidCap = 0x48C,
	kIa32VmxTruePinbasedCtls = 0x48D,
	kIa32VmxTrueProcBasedCtls = 0x48E,
	kIa32VmxTrueExitCtls = 0x48F,
	kIa32VmxTrueEntryCtls = 0x490,
	kIa32VmxVmfunc = 0x491,

	kIa32Efer = 0xC0000080,
	kIa32Star = 0xC0000081,
	kIa32Lstar = 0xC0000082,

	kIa32Fmask = 0xC0000084,

	kIa32FsBase = 0xC0000100,
	kIa32GsBase = 0xC0000101,
	kIa32KernelGsBase = 0xC0000102,
	kIa32TscAux = 0xC0000103,
};

对应的检测VMX支持的代码

#include "Utils.h"
#include"vmxDefine.h"
#include<intrin.h>
/// <summary>
/// 检测VT-BIOS是否支持
/// </summary>
/// <returns>支持</returns>
inline bool VmxCheckSupportedVTBios()
{
    ULONG64 msr=__readmsr(static_cast<unsigned long>(Msr::kIa32FeatureControl));
    return (msr & 0x5) == 0x5;

}
inline bool VmxCheckSupportedVTCpuId()
{
    int cpuInfo[4] = { -1 };
    __cpuidex(cpuInfo, 1,0);
    return (cpuInfo[2] & (1 << 5)) != 0;

}
inline bool VmxCheckSupportedCr4()
{
	ULONG64 cr4 = __readcr4();
	return (cr4 & (1 << 13)) != 0;
}
bool Utils::VmxIsSupported()
{
    if (!VmxCheckSupportedVTBios())
    {
        DbgPrintEx(77, 0, "VT-BIOS is not supported!\n");
		return false;
	}
    if (!VmxCheckSupportedVTCpuId())
    {
        DbgPrintEx(77,0,"VT-CPUID is not supported!\n");
        return false;
    }
    if (!VmxCheckSupportedCr4())
    {
        DbgPrintEx(77, 0, "VT-Cr4 is not supported!\n");
        return false;
    }

    return false;
}

进行多核的侵染,进行VT的检测。

标签:__,cpuInfo,历程,检测,学习,VT,kIa32FeatureControl,include
From: https://www.cnblogs.com/wenlong-4613615/p/17839001.html

相关文章

  • MyBatis学习记录之MyBatis入门程序
    MyBatis学习记录之MyBatis入门程序前言这篇文章是我第二次学习b站老杜的MyBatis相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使......
  • Avalonia 11 学习笔记
    Avalonia学习之样式Avalonia学习之样式的选择器和伪类Avalonia学习之资源使用Avalonia学习之绑定Avalonia学习之属性Avalonia学习之自定义控件Avalonia实现一条虚线Avalonia使用d:DataContext实现设计时预览Avalonia实现滑动加载Avalonia通过ef操作sqlite......
  • 中科院罗小舟团队提出 UniKP 框架,大模型 + 机器学习高精度预测酶动力学参数
    作者:李宝珠编辑:三羊中国科学院深圳先进技术研究院罗小舟团队提出了,基于酶动力学参数预测框架(UniKP),实现多种不同的酶动力学参数的预测。众所周知,生物体内的新陈代谢是通过各种各样的化学反应来实现的。这些反应如果在体外进行,通常需要在高温、高压、强酸、强碱等剧烈条件下才......
  • 【机器学习】特征选择与稀疏学习
    特征选择和稀疏学习子集搜索与评价对象都有很多属性来描述,属性也称为特征(feature),用于刻画对象的某一个特性。对一个学习任务而言,有些属性是关键有用的,而有些属性则可能不必要纳入训练数据。对当前学习任务有用的属性称为相关特征(relevantfeature)、无用的属性称为无关特征(irrelevan......
  • Delete d node at nth position【1月17日学习笔记】
    点击查看代码//Deletednodeatnthposition#include<iostream>usingnamespacestd;structnode{ intdata; node*next;};node*A;voidinsert(intx){ node*temp=newnode; temp->data=x; temp->next=NULL; if(A==NULL){ A=temp;......
  • MyBatis学习记录之MyBatis概述
    MyBatis学习记录之MyBatis概述前言这篇文章是我第二次学习b站老杜的MyBatis相关课程所进行的学习记录,算是对课程内容及笔记的二次整理,以自己的理解方式进行二次记录,其中理解可能存在错误,欢迎且接受各位大佬们的批评指正;关于本笔记,只是我对于相关知识遗忘时快速查阅了解使用,至......
  • Inserting a node at nth position【1月17日学习笔记】
    点击查看代码//Insertinganodeatnthposition#include<iostream>usingnamespacestd;structnode{intdata;node*next;};node*A;//全局头指针voidinsert(intx,intn){node*temp=newnode;//temp是局部变量,在stack区,每次调用更新temp-......
  • uniGUI学习之UniImage1三种导入图片方式
    uniGUI学习之UniImage1三种导入图片方式参考自带DEMO,C:\ProgramFiles(x86)\FMSoft\Framework\uniGUI\Demos\Desktop\UniImage1]  FromPicture,直接加载到Picture属性 2]从磁盘文件中加载UniImage3.Picture.LoadFromFile('0.jpg');0.jpg和应用程序.exe位置要在一......
  • Vue学习计划-Vue3--核心语法(六)路由
    1.路由【对路由的理解】【基本切换效果】Vue3中要使用vue-router的最新版本,目前是4版本路由配置文件代码如下://创建一个路由器,并暴露出去//第一步:引入createRouterimport{createRouter,createWebHistory}from'vue-router'//引入一个一个可能要呈现组件......
  • TS学习笔记四:函数及泛型枚举
      本节介绍ts的函数及泛型的相关内容,包括函数的声明格式及泛型的相关知识。B站视频https://player.bilibili.com/player.html?aid=495956203西瓜视频https://www.ixigua.com/7321535978286514727一、函数  函数是js程序的基础,可以实现抽象层/模拟类/信息隐藏和模块......