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

  • 要点回顾
  • INT 3失效
  • 调试技巧
  • 参考资料

要点回顾

在上一篇中,我们主要学习了如何填写Guest state fields的各项字段,以及如何对错误码进行排查,并最终成功执行了Guest代码。

在GuestEntry中,我们通过执行VMCALL指令触发VM-Exit,而没有用INT 3指令直接中断,其中是有原因的。

在本篇,我们将解释为什么没有在GuestEntry中使用INT 3中断,以及相关的调试技巧。

INT 3失效

将GuestEntry修改为以下代码:

void __declspec(naked) GuestEntry()
{__asm {mov ax, esmov es, axmov ax, dsmov ds, axmov ax, fsmov fs, axmov ax, gsmov gs, axmov ax, ssmov ss, axint 3}
}

执行结果:

不难发现,CPU并没有在Guest断下来,而是直接来到了Host,说明Guest在执行某行代码时抛出了VM-Exit信号。

此时,错误码为0x1C,查Intel手册卷3附录C能够得知含义是「Control-register accesses」,即控制寄存器访问。

那么在什么地方访问了控制寄存器呢?我们看下EIP所处的位置:

可以看到,是在执行INT 3中断处理程序的途中访问了Cr3寄存器,导致Guest抛出了VM-Exit信号,因此先触发了Host中的INT 3断点。

值得注意的是,当从Guest切换到Host时,权限也由VMX non-root切换到了VMX root,因此在Host中是能够正常执行INT 3的。

调试技巧

那么,如果想要在Guest中触发INT 3中断,应该怎么做呢?

本篇先记录一种最简单的方法。

步骤

  1. Guest执行INT 3指令,触发VM-Exit,进入Host
  2. 立刻保存Guest的各项状态信息。
  3. 收集错误码等重要参数
  4. 将CPU还原成Guest触发VM-Exit时的状态,继续执行INT 3后半部分
  5. 由于此时只是改变了EIP,权限不变,因此继续执行INT 3时能够成功。

当然,本篇这种方法只是饮鸩止渴,并不是一劳永逸的,但其中的思想值得参考,更加成熟的方法将在后续给出。

代码实现:

static void  VMMEntryPointEbd(void)
{ULONG ExitReason;ExitReason = Vmx_VmRead(VM_EXIT_REASON);Log("ExitReason", ExitReason);g_GuestRegs.esp = Vmx_VmRead(GUEST_RSP);g_GuestRegs.eip = Vmx_VmRead(GUEST_RIP);Log("g_GuestRegs.esp", g_GuestRegs.esp);Log("g_GuestRegs.eip", g_GuestRegs.eip);__asm{// 还原Guest状态,继续执行INT 3后半部分mov  eax, g_GuestRegs.eaxmov  ecx, g_GuestRegs.ecxmov  edx, g_GuestRegs.edxmov  ebx, g_GuestRegs.ebxmov  esp, g_GuestRegs.espmov  ebp, g_GuestRegs.ebpmov  esi, g_GuestRegs.esimov  edi, g_GuestRegs.edipush g_GuestRegs.eflagspopfd//此时处于VMX root权限,因此不会再次触发VM-Exitjmp g_GuestRegs.eip}
}void __declspec(naked) VMMEntryPoint(void)
{__asm{//通过INT 3进来后,立刻保存Guest的状态mov g_GuestRegs.eax, eaxmov g_GuestRegs.ecx, ecxmov g_GuestRegs.edx, edxmov g_GuestRegs.ebx, ebxmov g_GuestRegs.esp, espmov g_GuestRegs.ebp, ebpmov g_GuestRegs.esi, esimov g_GuestRegs.edi, edipushfdpop eaxmov g_GuestRegs.eflags, eax//需要设置fs和gs,否则无法正常运行mov ax, fsmov fs, axmov ax, gsmov gs, ax}Log("VM Exit", 0);//尽量不要在裸函数中定义局部变量,或实现太多功能,最好封装成函数VMMEntryPointEbd();
}

执行结果:
可以看到,此时,已经成功在Guest中执行INT 3并中断。

参考资料

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

Intel VT学习笔记(五)—— 调试技巧相关推荐

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

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

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

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

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

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

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

    Intel VT学习笔记(九)-- EPT应用示例 内存保护 EPT violation 代码实现 参考资料 内存保护 描述:尝试使用EPT将一块特定的物理内存保护起来. 先来选择一块物理地址,那么这 ...

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

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

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

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

  7. 华清远见fs4412开发板学习笔记(五)

    fs4412开发板学习笔记(五) 作业1: 输入10个整数,按从小到大的顺序输出(选择排序) 每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的 第一个数交换位置. 5 4 3 2 1 ...

  8. 【K210】K210学习笔记五——串口通信

    [K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...

  9. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

最新文章

  1. 20181113-3 Beta阶段贡献分配规则
  2. 【uva 1614】Hell on the Markets(算法效率--贪心)
  3. C语言程序练习-L1-032 Left-pad (20分)
  4. 用 Golang 写一个搜索引擎(0x07)--- 正排索引
  5. OpenShift 4 之 GitOps(4)用ArgoCD向Multi-Cluster发布应用
  6. map java 用法_java中map 9种常规用法
  7. Podfile使用说明
  8. C# 提示框 鼠标移动到控件提示 toolTip气泡提示框
  9. javascript html coffee 编辑器,CoffeeCup HTML Editor (html编辑器)
  10. Activate Scrolling with Middle Trackpad Button
  11. 为什么要学好数据结构和算法
  12. 二极管基本电路之限幅电路
  13. ubuntu命令行更新vscode
  14. 习惯,到底有多重要?
  15. rxjava2下载地址
  16. Android N 应用内更新
  17. 【STM32】stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
  18. 【Scikit-Learn 中文文档】集成方法 - 监督学习 - 用户指南 | ApacheCN
  19. Windows系统kratos生成proto代码是报exec: “protoc“: executable file not found in %PATH%错误解决办法
  20. 什么是国网综能服务集团虚拟电厂?——安科瑞 严新亚

热门文章

  1. IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程
  2. 成功解决tensorflow\contrib\learn\python\learn\datasets\mnist.py: maybe_download (from tensorflow.contri
  3. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
  4. PAT_B_1006 换个格式输出整数
  5. 从零开始的自学之路——css选择器
  6. 第三次作业-介绍一款原型设计工具
  7. (原创)7-1 银行业务队列简单模拟 (30 分)
  8. [BZOJ2342] [Shoi2011]双倍回文(manacher)
  9. Asp.Net Core异常处理整理
  10. MQTT协议通俗讲解