07_VM调试技巧
目录:
1 在GuestEntry 里面 不能使用int 3
why?
》 因为 int 3 调用处理的时候 可能 int 3 中断处理程序里面的代码会倒是VM Exit。
》 这个时候,我们的VM Exit 里面也有 int 3(这里面的int 3不能去掉,因为我们要停下来查看当前EXIT信息);这个时候 就发生了INT3 嵌套了。
》 而且, 在GuestEntry 中的int 3 没有处理完成,而 VM Exit 中的又 进不了int 3(师傅说是 有一个 EnterdDebugger 全局变量,当int3 出发时 这个全局变量置为1,当被置为1 的时候,就不能再有一个int3 进入。而且有一个 int3 调试实践阻塞在了 调试队列 所以 DbgPrint()也不能使用了 );
》 所以。 不能在 GuestEntry里面使用 int 3.
how to deal with it?
plan A:(simple 、Wild and brutal)
- 
把 奔溃 处 的eip 存储在 一个全局变量(一个数组,在数组中放置自己的特征数据)中 ;虽然说系统死了、windbg 接管不了;但是 可以使用CE 在 物理机中查看VM ware 的数据(搜索 前面全局变量中的特征数据;然后就可以查看 那个奔溃的 eip 了); 然后再查看这个eip 处的代码;就实现了,回溯奔溃 (导致VM EXIT)的源。 形如: 效果: 追溯 0x80502dec 查看 导致 VM Exit 奔溃的原因: 》 读取 cr3 造成了 VM Exit(int 3 保存处理器环境的时候) 
》 这个方法 路子野,但是只适合虚拟机。万一 VMware 跑着没问题,真机跑着有问题怎么办?
plan B:(Normal and Gental)
》 虚拟机 出现了 VM Exit,进入的那一刻先保存好现场regs 环境,然后直接Vmx_VmOff() 关闭虚拟机,恢复寄存器信息;返回导致EXIT 处的代码(比如 int3 处理中的 mov eax,cr3)继续执行,使得 代码 handle 继续;比如这里的int 3 里面的0x80502dec 会接着执行,然后成功使得 int 3 断下来。
实际效果(的确断下来了):
完成 这步 后项目的代码 github 地址:
https://github.com/leibso/VT-learning/tree/06_DebugSkill
 
                    
                     
                    
                 
                    
                
 






 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号