#nitro设计与实现
- 一个nitro事件意味着一个系统调用事件
1.获取虚拟机的file descriptor
2.获取vcpu fd列表
3.设置syscall trap
for each vcpu
vcpu_load
change MSR register
vcpu_put
4.等待虚拟机执行syscall/sysenter
5.生成General Protection Fault/Undefined Opcode (#GP/#UD)
6.vmx.c:handle_exception()
7.emulate_instruction
8.emulate.c:em_syscall/em_sysenter
nitro.event.present = True
9.x86.c:vcpu_run()
if (nitro.event.present)
report_event
10.nitro_x86.c:report_event()
nitro_wait()
wait for userland to call get_event()
11.userland calledcontinue_vm()
- SSDT
System Services Descriptor Table
,ssdt表就是把ring3的Win32 API和ring0的内核API联系起来。Windows有两个主要SSDT,NT和win32k。
CR3功能实现
nitro维护了一个hashtable CR3->Eprocess
,将目标程序加入该哈希表;然后再nitro_x86.c:report_event()
仅输出与目标程序匹配的系统调用。