Intel VT学习笔记(九)—— EPT应用示例

  • 内存保护
  • EPT violation
  • 代码实现
  • 参考资料

内存保护

描述:尝试使用EPT将一块特定的物理内存保护起来。

先来选择一块物理地址,那么这里就跟周壑老师一样,选择「Page Fault」函数所在的物理地址。

首先使用PCHunter看一下虚拟地址是多少:

然后用WinDbg直接查看对应的物理地址:

可以看到「Page Fault」函数的物理地址是0x541450,即所属的物理页为0x541000。

那么,能不能让Guest能够执行它,但是不能够对它读写呢?

这个是不能随便设置的,需要看系统是否支持。(通过检测IA32_VMX_EPT_VPID_CAP MSR,具体参考Intel手册卷3附录A.10)

只有当这个IA32_VMX_EPT_VPID_CAP MSR的第0位为1时,才支持将EPT物理页面设置为可执行,但不可读写的权限(在笔者的环境中是支持的)。

代码实现

if (0x541000 == *ept_PT & 0xfffff000)   //寻找Page Fault函数所在的物理页
{*ept_PT &= 0xfffffff4;      //去除可读、可写的权限
}

运行结果

此时能够成功开启VT,并且系统能够正常运行。

那么来查看「Page Fault」函数的反汇编试试:


产生了一个VM-Exit事件,退出码为0x30,对应的含义为「EPT violation」,表示EPT不允许Guest访问该页面。

EPT violation

描述:当EPT模式下访问物理内存(读、写、执行)失败时,会导致VM-Exit,退出码为0x30,即EPT violation。

可以在Host中获取具体的信息,然后进行相应的处理。

EPT violation的具体信息包含的含义如下(参考Intel开发手册卷3表27-7):

可以通过该退出码检测Guest的行为,如果是读/写的时候,返回一个假页面给Guest;如果是执行时,返回一个真页面。

代码实现

//ept.c
...
ULONG64 fake_page_PA;               //假页面
ULONG64* hook_ept_PT;               //用于替换页面static void AllocateFakePage()
{PVOID page = AllocateOnePage();fake_page_PA = MmGetPhysicalAddress(page).QuadPart;
}
...
if (0x541000 == (*ept_PT & 0xfffff000))   //寻找Page Fault函数所在的物理页
{AllocateFakePage();                    //分配一个假页面*ept_PT &= 0xfffffff4;      //真页面去除可读、可写的权限hook_ept_PT = ept_PT;
}
...
//exithandler.c
...
extern ULONG64 fake_page_PA;
extern ULONG64* hook_ept_PT;void HandleEptViolation()
{ULONG ExitQualification;ExitQualification = Vmx_VmRead(EXIT_QUALIFICATION);//判断访问权限,如果是读/写,就给一个假页面,如果是执行,就给一个真页面if (ExitQualification & 3)   // 读/写{*hook_ept_PT = fake_page_PA | 0x33;  //给假页面,权限为读/写}else     // 执行{*hook_ept_PT = 0x541000 | 0x34;        //给真页面,权限为执行}
}
...
case EXIT_REASON_EPT_VIOLATION:ExitInstructionLength = 0;      //将指令长度改为0,表示不跳过指令HandleEptViolation();                  //处理break;
...

运行结果

可以看到,此时读取「Page Fault」函数的具体代码时,返回的内容全是0,因为在读/写时,Host挂入了一个假页面。

并且PCHunter将这个页面的所有函数都认定为被Inline Hook了:

那么我们的目的也就达到了。

关于VT,笔者暂时先学习到这里,不得不说收获了很多知识,感觉VT能做的事情远不止如此,等有时间再深入研究一番。

参考资料

  • VT虚拟化架构编写视频教程①~⑥课
  • 周鹤《VT技术入门》系列视频教程
  • github项目:VT_Learn
  • github项目: HyperPlatform
  • Intel开发手册 卷3:Chapter 23 ~ Chapter 33
  • x86内部函数列表
  • 科普下VT EPT

Intel VT学习笔记(九)—— EPT应用示例相关推荐

  1. Intel VT学习笔记(七)—— EPT物理地址转换

    Intel VT学习笔记(七)-- EPT物理地址转换 要点回顾 EPT 支持检测 9-9-9-9-12分页 实验:EPT物理地址转换 参考资料 要点回顾 在上一篇中,已经初步实现了最小VT框架,但实 ...

  2. Intel VT学习笔记(三)—— VMCS(上)

    Intel VT学习笔记(三)-- VMCS(上) 要点回顾 VMCS 设置字段 错误排查 Fields Host-State Area VM-Control Fields 代码实现 参考资料 要点回 ...

  3. Intel VT学习笔记(六)—— VM-Exit Handler

    Intel VT学习笔记(六)-- VM-Exit Handler Reutrn To DriverEntry VM-Exit Handler External interrupt I/O instr ...

  4. Intel VT学习笔记(五)—— 调试技巧

    Intel VT学习笔记(五)-- 调试技巧 要点回顾 INT 3失效 调试技巧 参考资料 要点回顾 在上一篇中,我们主要学习了如何填写Guest state fields的各项字段,以及如何对错误码 ...

  5. Intel VT学习笔记(四)—— VMCS(下)

    Intel VT学习笔记(四)-- VMCS(下) 要点回顾 VM-Exit Information Guest state fields 代码实现 参考资料 要点回顾 在上一篇中,我们了解了如何设置 ...

  6. Intel VT学习笔记(二)—— VMXEVMXON

    Intel VT学习笔记(二)-- VMXE&VMXON VT生命周期 VMXE VMXON 准备工作 VMXON region 代码实现 参考资料 VT生命周期 描述: 软件通过执行VMXO ...

  7. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  8. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...

  9. 吴恩达《机器学习》学习笔记九——神经网络相关(1)

    吴恩达<机器学习>学习笔记九--神经网络相关(1) 一. 非线性假设的问题 二. 神经网络相关知识 1.神经网络的大致历史 2.神经网络的表示 3.前向传播:向量化表示 三. 例子与直觉理 ...

最新文章

  1. Cloudify — 系统架构
  2. 对QT学习之路12-14的源代码补充与修正
  3. 【Python基础】Python十大文件骚操作!!
  4. linux软连接与硬链接
  5. 【专栏必读】王道考研408计算机组成原理万字笔记和题目题型总结(从学生角度辅助大家理解):各章节导航及思维导图
  6. git 基础 tag 打标签
  7. 运行文件服务器,服务器的运行目录文件
  8. 二分插入排序(折半插入排序)--排序算法(六)
  9. 68超标量流水线的基本概念
  10. 红米k20pro短接9008,红米k20pro短接9008_小米、红米全系列短接点拆机进入9008模式刷机图解方法...
  11. 爱思唯尔(ELSEVIER)期刊LaTeX通用模板下载及使用技巧
  12. Photoshop绝色美女通道抠图法
  13. 【Sofice小司笔记】2 算法与数据结构,各类基础及常用高级数据结构、各种搜索方法、动态规划、字符串、数论、编码学、排序等,大部分都基于java实现
  14. linux 如何重命名
  15. 词根词缀prim/prehend/pri/psych等延伸词汇
  16. 关于SQL中not exists的双重否定的一些记录
  17. Python-Flask开发微电影网站(八)
  18. 谷歌浏览器不能使用opener属性的问题和解决
  19. Nii图像的读取、操作与保存
  20. html5调用静态库,如何在VS2010项目中引用Lib静态库(以Openssl为例)

热门文章

  1. Py之glob: glob库文件名模式匹配+返回所有匹配的文件路径列表库的简介、使用方法之详细攻略
  2. 成功解决cv2.error: OpenCV(4.1.2) /io/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion fa
  3. 成功解决 绘图时行坐标名或列坐标名出现f0、f1、f2、f3、f4、f5(或者Column_0、Column_1、Column_2、Column_3)等命名而不是想要的具体对应字段命名
  4. Python语言学习之pandas:DataFrame二维表的简介、常用函数、常用案例之详细攻略
  5. Paper:《Hidden Technical Debt in Machine Learning Systems—机器学习系统中隐藏的技术债》翻译与解读
  6. [UE4]编程师外挂Visual Assist X
  7. MongoDB 征途
  8. 使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件(转载)
  9. border-radius的兼容问题
  10. C#连接各类数据库 [转]