Intel VT学习笔记(五)—— 调试技巧
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中断,应该怎么做呢?
本篇先记录一种最简单的方法。
步骤:
- Guest执行INT 3指令,触发VM-Exit,进入Host
- 立刻保存Guest的各项状态信息。
- 收集错误码等重要参数
- 将CPU还原成Guest触发VM-Exit时的状态,继续执行INT 3后半部分
- 由于此时只是改变了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学习笔记(五)—— 调试技巧相关推荐
- Intel VT学习笔记(七)—— EPT物理地址转换
Intel VT学习笔记(七)-- EPT物理地址转换 要点回顾 EPT 支持检测 9-9-9-9-12分页 实验:EPT物理地址转换 参考资料 要点回顾 在上一篇中,已经初步实现了最小VT框架,但实 ...
- Intel VT学习笔记(六)—— VM-Exit Handler
Intel VT学习笔记(六)-- VM-Exit Handler Reutrn To DriverEntry VM-Exit Handler External interrupt I/O instr ...
- Intel VT学习笔记(四)—— VMCS(下)
Intel VT学习笔记(四)-- VMCS(下) 要点回顾 VM-Exit Information Guest state fields 代码实现 参考资料 要点回顾 在上一篇中,我们了解了如何设置 ...
- Intel VT学习笔记(九)—— EPT应用示例
Intel VT学习笔记(九)-- EPT应用示例 内存保护 EPT violation 代码实现 参考资料 内存保护 描述:尝试使用EPT将一块特定的物理内存保护起来. 先来选择一块物理地址,那么这 ...
- Intel VT学习笔记(二)—— VMXEVMXON
Intel VT学习笔记(二)-- VMXE&VMXON VT生命周期 VMXE VMXON 准备工作 VMXON region 代码实现 参考资料 VT生命周期 描述: 软件通过执行VMXO ...
- Intel VT学习笔记(三)—— VMCS(上)
Intel VT学习笔记(三)-- VMCS(上) 要点回顾 VMCS 设置字段 错误排查 Fields Host-State Area VM-Control Fields 代码实现 参考资料 要点回 ...
- 华清远见fs4412开发板学习笔记(五)
fs4412开发板学习笔记(五) 作业1: 输入10个整数,按从小到大的顺序输出(选择排序) 每轮排序在未排序的集合中找到(最小/最大),将找到的数与未排序的 第一个数交换位置. 5 4 3 2 1 ...
- 【K210】K210学习笔记五——串口通信
[K210]K210学习笔记五--串口通信 前言 K210如何进行串口通信 K210串口配置 K210串口发送相关定义 K210串口接收相关定义 K210串口发送接收测试 完整源码 前言 本人大四学生 ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
最新文章
- 20181113-3 Beta阶段贡献分配规则
- 【uva 1614】Hell on the Markets(算法效率--贪心)
- C语言程序练习-L1-032 Left-pad (20分)
- 用 Golang 写一个搜索引擎(0x07)--- 正排索引
- OpenShift 4 之 GitOps(4)用ArgoCD向Multi-Cluster发布应用
- map java 用法_java中map 9种常规用法
- Podfile使用说明
- C# 提示框 鼠标移动到控件提示 toolTip气泡提示框
- javascript html coffee 编辑器,CoffeeCup HTML Editor (html编辑器)
- Activate Scrolling with Middle Trackpad Button
- 为什么要学好数据结构和算法
- 二极管基本电路之限幅电路
- ubuntu命令行更新vscode
- 习惯,到底有多重要?
- rxjava2下载地址
- Android N 应用内更新
- 【STM32】stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
- 【Scikit-Learn 中文文档】集成方法 - 监督学习 - 用户指南 | ApacheCN
- Windows系统kratos生成proto代码是报exec: “protoc“: executable file not found in %PATH%错误解决办法
- 什么是国网综能服务集团虚拟电厂?——安科瑞 严新亚
热门文章
- IDE之VS:利用 Visual Studio中的IDE配置python语言进行编程
- 成功解决tensorflow\contrib\learn\python\learn\datasets\mnist.py: maybe_download (from tensorflow.contri
- 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
- PAT_B_1006 换个格式输出整数
- 从零开始的自学之路——css选择器
- 第三次作业-介绍一款原型设计工具
- (原创)7-1 银行业务队列简单模拟 (30 分)
- [BZOJ2342] [Shoi2011]双倍回文(manacher)
- Asp.Net Core异常处理整理
- MQTT协议通俗讲解