zhouhe VT(五)调试技巧

前提概要

zhouhe老师在VT的时候遇到了一个问题:在GuestEntry入口点把vmcall指令写成int 3指令会导致windbg断不下来,无论是在GuestEntry还是VMMEntryPointEbd都断不下来
 
0

一、分析原因

CPU并没有在Guest断下来,而是直接来到了Host,说明Guest在执行某行代码时抛出了VM-Exit信号,由于Guest的int 3还没有处理完就去处理Host的int 3,导致Host的int 3也断不下来,引发了调试器重入问题
int 3不只是一个指令,在它被调试器识别连接的过程中包含了很多代码,在这些代码中可能有一些代码影响到了Guest,我们需要找出那一些代码

二、CE搜索

 
0
利用全局数组与extern关键词的方式间接搜索到g_GuestRegs.eip的值
我这里,可能是因为windbg自动处理了调试器重入问题了吧,我即可以断下来,也搜不到要搜的数。。。
 
 
CE搜索的方法有局限性,如果vt运行在物理机的话,就不好CE搜索本机了
因此,介绍了第二种调试的方法

三、栈回溯

由于guest里的int 3没有执行完毕就跳到了host中,我们可以调回guest,使其int 3命令执行完毕
这里就要保存好寄存器,做好,栈回滚任务
代码如下
#include "exithandler.h" #include "vtsystem.h" #include "vtasm.h" GUEST_REGS g_GuestRegs; extern ULONG Dbg_data; static void VMMEntryPointEbd(void) { ULONG ExitReason; //ULONG ExitInstructionLength; //ULONG GuestResumeEIP; ExitReason = Vmx_VmRead(VM_EXIT_REASON); //读取错误号// Log("ExitReason", ExitReason); //ExitInstructionLength = Vmx_VmRead(VM_EXIT_INSTRUCTION_LEN); g_GuestRegs.eflags = Vmx_VmRead(GUEST_RFLAGS); g_GuestRegs.esp = Vmx_VmRead(GUEST_RSP); g_GuestRegs.eip = Vmx_VmRead(GUEST_RIP); Dbg_data = g_GuestRegs.eip; Log("g_GuestRegs.eip", g_GuestRegs.eip); //__asm int 3 Vmx_VmxOff(); //关闭虚拟机// //直接跳回guest去处理中断// ////恢复现场// __asm { mov eax, g_GuestRegs.eax mov ecx, g_GuestRegs.ecx mov edx, g_GuestRegs.edx mov ebx, g_GuestRegs.ebx mov esp, g_GuestRegs.esp mov ebp, g_GuestRegs.ebp mov esi, g_GuestRegs.esi mov edi, g_GuestRegs.edi push g_GuestRegs.eflags popfd jmp g_GuestRegs.eip } } void __declspec(naked) VMMEntryPoint(void) //我们没有wei'huHost 的ebp,所以必须使用裸函数//... { //下面内联汇编的功能是为了填充fs与gs基地址,这个方法不很严谨// ////保存从guest出来时候的信息//// __asm { mov g_GuestRegs.eax, eax mov g_GuestRegs.ecx, ecx mov g_GuestRegs.edx, edx mov g_GuestRegs.ebx, ebx mov g_GuestRegs.esp, esp mov g_GuestRegs.ebp, ebp mov g_GuestRegs.esi, esi mov g_GuestRegs.edi, edi mov ax, fs mov fs, ax mov ax, gs mov gs, ax } VMMEntryPointEbd();//在裸函数里面使用局部变量会在栈区分配空间,会导致ebp的索引出现错误,索所以我们干脆再封装一个函数,在这个函数中实现功能// }

 

这个方法可以说十分好用
 

四、找到问题代码点

0
出错的点就是发生在读CR3的时候
0
 
该节所写的完整代码链接:

__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/articles/16154628.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(125)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示