4

在使用 Intel 的 VMX 和 ARM 的 virt-extensions 时,我注意到缺少在实现管理程序时非常有用的功能。

在管理程序的工作中,通常需要捕获客户行为,但仅用于跟踪目的(即,客户可以正常执行指令,但我们需要先做一些事情 - 例如日志记录)。

更准确地说,举以下例子:在我前段时间实现的一个 Intel 虚拟机管理程序上(以Windows 7作为客户机),每当修改 Windows 内核结构时,我都需要记录。为此,我找到了内核结构的物理地址,并删除了 guest 对相应 EPT 页的写权限。因此,每当客户试图写入(修改)结构时,就会发生EPT 违规,从而导致管理程序陷阱。

对于每一次这样的 EPT 违规,我都会采取以下策略之一

策略一:

  • 激活监视器陷阱标志
  • 临时授予guest权限写入区域(EPT修改)
  • VMRESUME =>由于MTF被激活,客户将立即执行指令和VMEXIT
  • 在下一个VMEXIT上,我将停用MTF并重新禁止来宾写入结构(=EPT 修改 + 失效)VMRESUME再次

策略二:

  • 模拟要编写结构的指令。这意味着要编写一个模拟器(>反汇编器)。

如您所见,即使没有多处理意识,这两种策略都有些复杂。关于策略 1,如果要在多个处理器上虚拟化 Windows,我们还必须在处理 EPT 违规时将 IPI 发送到其他内核以暂停它们。另外,这是一个具体的例子,它暗示了一个具体的策略。跟踪的另一个示例可能是例如在调用内核函数时记录和/或修改内核函数的参数。在这种情况下,我们可能需要不同的策略。

我想是时候进入正题了。我的困境如下。每当我们需要跟踪客户行为时,避免复杂编程策略的一种简单方法是让虚拟化技术提供动态选择指令陷阱是在执行之前还是之后发生的可能性。

甚至在编写我的第一个虚拟机管理程序(在 Intel 上)之前,我几乎确信 VMX 会为我提供这样的功能。我的想法告诉我,这将是任何平台上的任何虚拟化技术都提供的一个显而易见的特性,所以当我发现它实际上不是时我很惊讶(也有点沮丧):不是在英特尔上,不是在 ARM 上(正如我最近发现的那样out) 并且很可能不在其他平台上因此,我的问题实际上是:为什么?为什么硬件虚拟化“设计者”不实现这样的功能?我确信之前已经考虑过,因此对我来说唯一可能的答案似乎是硬件方面的这种功能实现将非常困难甚至不可能,尽管我不明白为什么这是真的。

提前感谢您的回答:)

编辑

虽然我没有说清楚,但我还想指出这样一个事实,即在许多情况下,程序员想要以改变其效果的意图来捕获一些客人的行为(因此暗示的不仅仅是跟踪,但在这种功能仍然非常有用。

以下面的例子为例。让我们假设我希望我的虚拟机管理程序控制来宾与内存映射设备的通信(甚至完全模拟一个 - 当今虚拟机管理程序的一个非常普遍的要求)。大多数情况下,我们会告诉客人该设备在地址A上进行内存映射,并挂钩对该地址的写入/读取操作。当一条被捕获的指令试图读/写地址A的区域时,目前我们被迫反汇编并模拟它. 如果管理程序为我们提供了让指令以临时 r/w 权限执行并在其后立即捕获的可能性,那么模拟指令将变得不必要,因为我们可以让它执行并在之后“添加”所需的效果。

4

1 回答 1

1

您只能在指令之前陷入陷阱,因为这是硬件提供的。从理论上讲,VM 可以对您在虚拟机管理程序中的陷阱做出反应并实际上对此做一些事情(更改您背后的任何内存绑定参数),因此替代方案不是很有用。

对不起,伙计,事情就是这样。

多年后,我突然想到,如果您正在编写虚拟机管理程序,您可以单步执行指令而不是模拟它。

于 2018-08-09T02:07:16.550 回答