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