I. Introduction to VM Introspection

Basic concepts

What is VM Introspection?

一种不需要在 Guest VM 中运行工具,就可以获得 Guest VM 状态信息的方法

Why VM Introspection?

Use cases

VM Introspection Internals

实现这样的 VMI 功能,从技术层面来说需要两种能力支持:

Hard Problem

VMI 在 Guest VM 外部获取的底层状态为二进制数据,其代表的操作系统级语义是无法直接知晓的,这种语义差异被称为 VMI 的语义鸿沟 (sematic gap)。

实际上解决这个问题就是需要一些关于 Guest Kernel 的符号和结构体信息,例如实现 task_struct 链表的遍历需要 init_task 的地址和 next_task 等字段的偏移地址。

Existing Tools (x86 / Linux)

因为我们主要关注于 Linux 上的 VMI 工具,所以按照 Hypervisor-level support 层面的实现对已有工具做区分。

II. Hypervisor-level support - TCG

以 LibAFL QEMU 为例

Qemu TCG basics

qemu 对 CPU 指令的模拟属于动态二进制翻译的范畴,底层实现名为 Tiny Code Generator(TCG),总共会做两层翻译。

image.png

qemu 的翻译是基于一个基本块(basic block)的,翻译后的基本块叫做 TB(Translation Block )。一个最简单的执行流程就是在 qemu TCG engine 代码中翻译一个基本块,跳转过去执行,执行完一个基本块后又回到 TCG engine 的代码翻译下一个基本块。