日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Intel VT学习笔记(五)—— 调试技巧

發布時間:2025/3/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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学习笔记(五)—— 调试技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。