short-paper-QEMU-based framework for non-intrusive virtual machine instrumentation and introspection

对Qemu的ABI进行hooking进行非侵入式的VM introspection。

二进制代码的动态软件分析被用于剖析、恶意软件分析、入侵检测、协议逆向工程、软件测试和许多其他活动。 客体二进制代码(可以获得)和源数据结构(调试需要)之间的语义差距阻碍了分析。虚拟机自省(VMI)是弥补二进制和源码表示之间语义差距的最常用方法。

最先进的VMI方法使用内核的源代码或SDK来制作工具,直接从客体内存恢复数据结构的信息。

源代码或客体构建工具被用来创建嵌入客体系统的代理。 基本上有两种代理:Setup和Runtime。 Setup代理仅用于创建反省档案,其中包括应从操作系统核心提取的客户地址和数据偏移。 Runtime代理一直在客户系统内执行,并将数据传输给主机。 Windows的WinDbg和Android的gdbserver就是Runtime代理的例子。它们在系统运行时运行,为远程调试器收集信息。

有时客体代理不能被嵌入到系统中。 当基于ROM的操作系统被分析时,没有办法嵌入代理。 这种ROM内核的源代码可能是可用的,但如果没有构建选项,可能无法恢复内部偏移量和地址。 当Runtime代理的执行被记录和重放来进行分析时,它也不能被嵌入到系统中。 因此,传统的VMI的实现方法中,用户代理的主要限制是只读操作系统image和只读(重放)执行场景。

我们提出了一种非侵入性的自省方法,它利用了客户平台的应用二进制接口(ABI)。 ABI比内核源代码更稳定、更小,便于人工分析和创建自省工具。 我们的方法是完全非侵入性的,因为它不需要任何客户代理。 钩住ABI相关的事件,如系统调用,是用来恢复部分内核数据的。 我们还跟踪CPU级别的事件,如TLB缺失或中断请求,以恢复进程的内存结构,并解析可执行文件以监控API函数调用。 使用ABI可以减少支持分析算法所需的维护工作,并将其应用于其他版本的客户操作系统。

Design

ABI包括系统调用列表、调用惯例、数据对齐规则、执行文件格式、堆栈框架格式和寄存器使用模式。 ABI是为硬件或软件平台设计的,并且为了向后兼容,随着平台的发展,ABI大多保持不变。

  • 本文为QEMU创建了一个子系统,它允许钩住系统调用,从虚拟机中捕获操作系统的特定信息,而不是监视客户内存来寻找内核数据结构。
  • 本文为了匹配系统调用的调用和返回指令,记录执行环境,包括当前进程的ID和堆栈指针。我们通过页面目录地址(例如,x86的CR3或ARM的CP15.c2)来识别进程。
  • 模拟器QEMU支持许多商品硬件平台,如x86、x86-64、ARM、MIPS和PowerPC。为了在系统调用执行时调用我们自己的代码,我们在QEMU翻译的代码中嵌入了回调。这些回调恢复了系统调用的参数和它们的返回值。参数和返回值分别在系统调用的进入和退出指令中被恢复。
  • 我们在QEMU中加入了一层instrumentation layer,并将VMI作为一套插件来实现。

文件监控是由一个插件完成的,它独立于执行的客户操作系统和客户硬件平台。 它通过系统调用和文件抽象进行操作。 文件监控器维护打开的文件列表,以检测关闭文件的系统调用,因为关闭操作可能被用来释放其他系统资源(例如,NtClose被用来关闭Windows的所有手柄)。

商品操作系统使用内存映射的文件来加载可执行文件和动态库。 我们在文件监控插件中挂钩映射/解映射操作。这些信息被用来检测可执行image的加载和解析这些image以提取API函数地址。 监测API函数调用本身可能是有用的(例如,用于检测异常情况),也可用于恢复更多的系统信息,而不是从系统调用中获取(例如,在Windows中钩住CreateProcess用于恢复执行的进程)。 可执行image的格式是有据可查的。 因此,我们可以利用它们来提取API函数的偏移量信息,并通过监控函数的调用来指导其入口点。 监控函数向用户或更高层次的插件发送消息。

进程监控插件向用户提供一个当前正在执行的客户进程的列表。 对于每个被发现的进程,它存储了以下元组:执行环境(页面目录基础寄存器,例如X86的CR3); 父执行环境;由操作系统签名的进程ID(为了方便用户);可执行image的名称。 对于Linux,我们用fork和clone函数来创建进程,用execve来运行程序。 Windows使用NtCreateProcess来创建没有任何线程的进程,使用NtCreateThread来添加新的线程。我们使用这些函数的参数和返回值来重建运行进程的列表。 我们还在Windows中钩住CreateProcess来匹配执行环境和image文件 with the process id。