07_VM调试技巧

目录:

1 在GuestEntry 里面 不能使用int 3

     why?

     how to deal with it?

              plan A:(simple 、Wild and brutal)

              plan B:(Normal and Gental)

 

》 由于VM 不好调试,所以这里学习一下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)的源。

    形如:

    1572100334300

    效果:

    1572100222997

    追溯 0x80502dec 查看 导致 VM Exit 奔溃的原因:

    》 读取 cr3 造成了 VM Exit(int 3 保存处理器环境的时候)

    1572100414697

》 这个方法 路子野,但是只适合虚拟机。万一 VMware 跑着没问题,真机跑着有问题怎么办?

plan B:(Normal and Gental)

》 虚拟机 出现了 VM Exit,进入的那一刻先保存好现场regs 环境,然后直接Vmx_VmOff() 关闭虚拟机,恢复寄存器信息;返回导致EXIT 处的代码(比如 int3 处理中的 mov eax,cr3)继续执行,使得 代码 handle 继续;比如这里的int 3 里面的0x80502dec 会接着执行,然后成功使得 int 3 断下来。

1572101646009

实际效果(的确断下来了):

1572105338596

1572105453468

完成 这步 后项目的代码 github 地址:

https://github.com/leibso/VT-learning/tree/06_DebugSkill

 

posted @ 2019-10-27 11:29  leibso二狗  阅读(961)  评论(0)    收藏  举报