简单的活着

nitro设计与实现

Posted on By Mista Cai

#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()

  • SSDTSystem Services Descriptor Table,ssdt表就是把ring3的Win32 API和ring0的内核API联系起来。Windows有两个主要SSDT,NT和win32k。

CR3功能实现

nitro维护了一个hashtable CR3->Eprocess,将目标程序加入该哈希表;然后再nitro_x86.c:report_event() 仅输出与目标程序匹配的系统调用。