Intel VT即Intel公司的Virtualization Technology虛擬化技術, 在硬體層級上完成電腦的虛擬化。為實現硬體虛擬化 ,VT增加了12條新的 VMX指令。VT可以讓一個CPU工作起來像多個CPU在並行運行,從而使得在一部電腦內同時運行多個作業系統成為可能。在安全領域,利用VT技術,64位系統的防護可以做到跟32位同層級的強度。
一、vt調試方法
1. 修改vmx檔案
debugStub.listen.guest32.remote = "TRUE"
debugStub.listen.guest64.remote = "TRUE"
monitor.debugOnStartGuest64 = "TRUE"
debugStub.hideBreakpoints = "TRUE"
bios.bootDelay = "3000"
2. 進入虛擬機器,系統停住
3. 啟動64位ida
4. 串連連接埠
5. 會斷在這個地址
明顯錯誤的地址,修正地址:
F9繼續運行,進入windows後,再次暫停,即會斷在核心空間。
6. 載入驅動
記錄下基址
7. ida載入符號
sys和pdb需要放在真實機同一目錄
提示符號載入成功
斷點可以成功斷下
二、從使用者態到核心態
SYSENTER/SYSEXIT指令從 Pentium® II 處理器開始提供的,用於使用者級到特權級的堆棧以及指令指標的轉換。並有一組特殊寄存器來輔助實現,這類特殊寄存器在IA-32中稱為MSR(Model Specific Register)。
MSR是CPU 的一組64位寄存器,可以分別通過RDMSR和WRMSR兩條指令進行讀和寫的操作,前提要在ECX中寫入MSR的地址。對於RDMSR指令,將會返回相應的MSR中64bit資訊到(EDX:EAX)寄存器中;對於WRMSR 指令,把要寫入的資訊存入(EDX:EAX)中,執行寫指令後,即可將相應的資訊存入ECX指定的MSR中。
擷取KiFastCalllEntry地址:
_asm
{
movecx,0x176
rdmsr
movKiFastCalllEntryAddr,eax
}
三、利用vt實現”ssdt hook”
1. 設定MSR bitmap:
PUCHARbitMapReadLow = g_Data->MSRBitmap;
RtlInitializeBitMap(&bitMapReadHighHeader, (PULONG)bitMapReadHigh, 1024 * 8 );
RtlSetBit(&bitMapReadHighHeader, MSR_LSTAR - 0xC0000000 );
__vmx_vmwrite(MSR_BITMAP, MmGetPhysicalAddress( g_Data->MSRBitmap ).QuadPart );
2. 設定vm entry
__vmx_vmwrite(HOST_RIP, (ULONG_PTR)VmxVMEntry );
2.1 VmxpExitHandler,使用 __vmx_vmread(VM_EXIT_REASON, &FieldData ),擷取vm exit reason。
2.2 當為EXIT_REASON_MSR_READ時,根據參數,擷取GuestState->GpRegs->Rcx,值為MSR_LSTAR時,將原始LSTAR函數地址寫入GuestState->GpRegs->Rax/Rdx中。
最後實現的目的: PatchGuard、安全軟體等__readmsr( MSR_LSTAR )時,返回給它原始值,用來躲避檢測。
3. 啟動vm
__vmx_vmlaunch
4. 設定hook函數
發送__vmx_vmcall自訂退出事件,事件處理函數裡面用__writemsr( MSR_LSTAR,GuestState->GpRegs->Rdx ),將Kisystemcall_Emulate寫入msr寄存器
Kisystemcall64_Emulate的寫法: 判斷index是否為hook的函數,如果不是的話,走原來的Kisystemcall64函數,如果是的話,走KiSystemCall64_Emulate -> KiSystemServiceStart_Emulate->KiSystemServiceRepeat_Emulate
5. 初始化HookTable
禁止結束notepad進程。
無法結束notepad,且pchunter檢測不出”ssdt”被動手腳。
四、參考文獻
1.Linux kerneldebugging with IDA pro and VMware http://dorgamza.tistory.com/1
2.MinimalisticVT-x hypervisor with hooks https://github.com/DarthTon/HyperBone