学习的目标

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

大概的流程

  1. 检测是否允许开启VT。

    a. 我们可以从白皮书的24.6 DISCOVERING SUPPORT FOR VMX章节中得到这样的信息



    b. 其次就是设置smx



    c. 检测CPUID是否支持VT





    cpuid第5位是否为1

Define.h

  1. #pragma once
  2. /// See: MODEL-SPECIFIC REGISTERS (MSRS)
  3. enum class Msr : unsigned int {
  4. kIa32ApicBase = 0x01B,
  5. kIa32FeatureControl = 0x03A,
  6. kIa32SysenterCs = 0x174,
  7. kIa32SysenterEsp = 0x175,
  8. kIa32SysenterEip = 0x176,
  9. kIa32Debugctl = 0x1D9,
  10. kIa32MtrrCap = 0xFE,
  11. kIa32MtrrDefType = 0x2FF,
  12. kIa32MtrrPhysBaseN = 0x200,
  13. kIa32MtrrPhysMaskN = 0x201,
  14. kIa32MtrrFix64k00000 = 0x250,
  15. kIa32MtrrFix16k80000 = 0x258,
  16. kIa32MtrrFix16kA0000 = 0x259,
  17. kIa32MtrrFix4kC0000 = 0x268,
  18. kIa32MtrrFix4kC8000 = 0x269,
  19. kIa32MtrrFix4kD0000 = 0x26A,
  20. kIa32MtrrFix4kD8000 = 0x26B,
  21. kIa32MtrrFix4kE0000 = 0x26C,
  22. kIa32MtrrFix4kE8000 = 0x26D,
  23. kIa32MtrrFix4kF0000 = 0x26E,
  24. kIa32MtrrFix4kF8000 = 0x26F,
  25. kIa32VmxBasic = 0x480,
  26. kIa32VmxPinbasedCtls = 0x481,
  27. kIa32VmxProcBasedCtls = 0x482,
  28. kIa32VmxExitCtls = 0x483,
  29. kIa32VmxEntryCtls = 0x484,
  30. kIa32VmxMisc = 0x485,
  31. kIa32VmxCr0Fixed0 = 0x486,
  32. kIa32VmxCr0Fixed1 = 0x487,
  33. kIa32VmxCr4Fixed0 = 0x488,
  34. kIa32VmxCr4Fixed1 = 0x489,
  35. kIa32VmxVmcsEnum = 0x48A,
  36. kIa32VmxProcBasedCtls2 = 0x48B,
  37. kIa32VmxEptVpidCap = 0x48C,
  38. kIa32VmxTruePinbasedCtls = 0x48D,
  39. kIa32VmxTrueProcBasedCtls = 0x48E,
  40. kIa32VmxTrueExitCtls = 0x48F,
  41. kIa32VmxTrueEntryCtls = 0x490,
  42. kIa32VmxVmfunc = 0x491,
  43. kIa32Efer = 0xC0000080,
  44. kIa32Star = 0xC0000081,
  45. kIa32Lstar = 0xC0000082,
  46. kIa32Fmask = 0xC0000084,
  47. kIa32FsBase = 0xC0000100,
  48. kIa32GsBase = 0xC0000101,
  49. kIa32KernelGsBase = 0xC0000102,
  50. kIa32TscAux = 0xC0000103,
  51. };

对应的检测VMX支持的代码

  1. #include "Utils.h"
  2. #include"vmxDefine.h"
  3. #include<intrin.h>
  4. /// <summary>
  5. /// 检测VT-BIOS是否支持
  6. /// </summary>
  7. /// <returns>支持</returns>
  8. inline bool VmxCheckSupportedVTBios()
  9. {
  10. ULONG64 msr=__readmsr(static_cast<unsigned long>(Msr::kIa32FeatureControl));
  11. return (msr & 0x5) == 0x5;
  12. }
  13. inline bool VmxCheckSupportedVTCpuId()
  14. {
  15. int cpuInfo[4] = { -1 };
  16. __cpuidex(cpuInfo, 1,0);
  17. return (cpuInfo[2] & (1 << 5)) != 0;
  18. }
  19. inline bool VmxCheckSupportedCr4()
  20. {
  21. ULONG64 cr4 = __readcr4();
  22. return (cr4 & (1 << 13)) != 0;
  23. }
  24. bool Utils::VmxIsSupported()
  25. {
  26. if (!VmxCheckSupportedVTBios())
  27. {
  28. DbgPrintEx(77, 0, "VT-BIOS is not supported!\n");
  29. return false;
  30. }
  31. if (!VmxCheckSupportedVTCpuId())
  32. {
  33. DbgPrintEx(77,0,"VT-CPUID is not supported!\n");
  34. return false;
  35. }
  36. if (!VmxCheckSupportedCr4())
  37. {
  38. DbgPrintEx(77, 0, "VT-Cr4 is not supported!\n");
  39. return false;
  40. }
  41. return false;
  42. }

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

VT-X的学习历程(一)的更多相关文章

  1. 我的Linux学习历程:那些我看过的Linux书籍们

    [+]查看原图http://www.ituring.com.cn/article/119401 来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位.有时茫 ...

  2. StudyJams学习历程总结

    Study Jams 是一个学习 Google 在线课程的活动.该活动由学员自发组建课程学习小组,旨在带领小组成员入门 Android 开发,最终将 Android App 上载至 Google Pl ...

  3. 大三仍是Linux系统小白的我给大家讲讲学习历程

    我与Linux结缘是在大三的时候.我与Linux熟识是在偶然遇到<Linux就该这么学>的时候.因为我是电子信息工程专业,在高年级时开设了嵌入式课程,嵌入式系统是一种专用的计算机系统,作为 ...

  4. 登录模块的进化史,带大家回顾java学习历程(二)

    接着前面的登录模块的进化史,带大家回顾java学习历程(一) 继续往下面讲 前面我们去实现登录功能,都是想着要完成这个功能,直接在处理实际业务的类中去开始写具体的代码一步步实现,也就是面向过程的编程. ...

  5. 来自一个电子狂的stm32学习历程

    文章尾部有学习时的一些视频资料在学的可以看看那么我们就进入今天的主题我stm32的学习历程 在学习了51单片机之后,早已经对单片机这个东西甚有了解了,所有不管是从内部资源,还是一些常见应用,都可以说的 ...

  6. Linux学习历程——Centos 7重置root密码

    一.自述 最近刚刚接触linux,因为我设置密码比较随性,把自己做系统的时候设置的root密码给forget,每当系统崩溃,重新把虚拟机备份还原后,就面临无法登陆的尴尬情况,只得重置root密码,好了 ...

  7. Nginx系列0:Nginx学习历程

    Nginx学习历程 一.初识Nginx 1.Nginx适用于哪些场景 (1)静态资源服务 通过本地文件系统提供服务 (2)反向代理服务 Nginx的强大性能 缓存 负载均衡 (3)API服务 Open ...

  8. JS高级学习历程-6

    PHP菜鸟学习历程-6 [闭包案例] 1 闭包创建数组 <!DOCTYPE html> <html lang="en"> <head> < ...

  9. Nvidia Jetson TX2开发板学习历程(1)- 详细开箱、上电过程

    考试周已经结束了,开发板也已经到了.希望借着这个假期能够好好的利用这块开发板学习Linux系统以及Tensorflow的相关知识. 我打算将学习历程通过博客的方式写出来,作为自己的笔记,也可以供以后拿 ...

  10. 【转】简述C和C++的学习历程

    简述C和C++的学习历程(转) --by:肖舸老师总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复. 一家之言,欢迎拍砖哈. 1.可以考虑先学习C. 大多数时候 ...

随机推荐

  1. 【算法】【回溯】N皇后问题【力扣-51】超详细的注释和解释手撕N皇后

    [算法][回溯]N皇后问题[力扣-51]超详细的注释和解释手撕N皇后 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我 ...

  2. STM8 bootloader 升级方案程序设计(一)

    1.前言 上一篇单片机 IAP 功能基础开发篇之APP升级(一)讲到了单片机 IAP 功能给 APP 程序升级的设计思路,这篇介绍的是具体实现方式. 这篇介绍关于 STM8 系列实现 bootload ...

  3. Spring 与 Mybatis 中的 @Repository 与 @Mapper

    @Repository.@Service.@Controller,它们分别对应存储层Bean,业务层Bean,和展示层Bean.如果使用@Repository则需要使用@MapperScan(&quo ...

  4. Wamp MySQL 报错 Got a packet bigger than 'max_allowed_packet' bytes

    点击电脑右下角wamp图标,然后进入mysql 下面的 my.ini 转移数据发现报这个错,字面意思允许的不够大.网上很多说法不起作用,解决方法如下: [mysqld] port=3306 expli ...

  5. 【译】发布 .NET Aspire 预览版 2(一)

    原文 | Damian Edwards 翻译 | 郑子铭 自上个月宣布并推出 .NET Aspire 以来,我们收到的反馈非常惊人!通过问题和拉取请求对回购协议的参与一直激励着团队.我们正在深入了解开 ...

  6. 从零开始的react入门教程(二),从react组件说到props/state的联系与区别

    壹 ❀ 引 在从零开始的react入门教程(一)一文中,我们搭建了第一个属于自己的react应用,并简单学习了jsx语法.jsx写法上与dom标签高度一致,当然我们也知道,本质上这些react元素都是 ...

  7. MySQL树形结构表设计

    两个字段: pid:父级ID parent_ids:所有经过的路径节点ID 这样设计有个好处是,可以查任意节点的所有子节点,从任意节点开始既可以向上查,也可以向下查 select * from ent ...

  8. sensitive-word v0.13 特性版本发布 支持英文单词全词匹配

    拓展阅读 sensitive-word-admin v1.3.0 发布 如何支持分布式部署? sensitive-word-admin 敏感词控台 v1.2.0 版本开源 sensitive-word ...

  9. python绘图总结

    1 二维图像 1.1 二维曲线 plot(x, y, ls="-", lw=1.5, label=None) x, y:横坐标和纵坐标 ls:颜色.点标记.线型列表,如 ls='r ...

  10. 【C#】基于JsonConvert解析Json数据

    1 解析字典 ​ 1)解析为 JObject private void ParseJson() { // 解析为JObject string jsonStr = "{'name': 'zha ...