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中斷,應該怎么做呢?
本篇先記錄一種最簡單的方法。
步驟:
當然,本篇這種方法只是飲鴆止渴,并不是一勞永逸的,但其中的思想值得參考,更加成熟的方法將在后續給出。
代碼實現:
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学习笔记(四)—— VM
- 下一篇: Intel VT学习笔记(六)—— VM