是否可以在不严重影响性能的情况下挂钩 CPU 指令?

逆向工程 部件 断点 勾搭 管理程序
2021-07-10 10:56:16

我一直在研究一些解包器,我注意到在他们的最后,他们大多使用这个:

mov edx, [ebp+oep]
call edx ; now, you're at the OEP of the original binary

或这个:

mov ecx, [ebp+oep]
jmp ecx

或这个:

mov eax, [ebp+oep]
push eax
ret

知道了这一点,通过对绝对跳转/调用的快速钩子,您可以在几秒钟内打开东西。除此之外,一些软件使用cpuidrdstc识别您,同时通过大量混淆来保护程序集。在任一个上放置“指令断点”,您就可以比眨眼的速度更快地绕过所有内容!

在没有严重的性能影响的情况下,我所说的可能吗?我知道跟踪,但这真的很慢,所以它不是一种选择。

编辑:我知道管理程序的存在,我只是不知道它们是否适合我的情况,如果是这样,我将不知道如何将这些技术应用于工作,因此任何指示,即使是 Google 关键字,也将是伟大的。

1个回答

编写管理程序

目前最好的方法是创建一个微管理程序,利用最初创建的技术来支持更快的虚拟化来监控用户模式和内核模式代码。一旦SSDTMicrosoft 使用补丁保护来保护挂钩,这便成为 AV 的常见替代品此外,一些安全公司如雨后春笋般涌现,使用虚拟机管理程序和微内核来保护和分离操作系统的不同组件(例如Bromium),微软最近宣布了他们的应用程序防护,它使用相同的技术并在 Windows已安装。

技术实现

尽管设置虚拟机管理程序似乎是一个灵丹妙药,但它有许多缺点:

  1. 尽管当今大多数 CPU 都支持管理程序,但并非所有 CPU 都支持。
  2. Windows 尚不支持嵌套虚拟化,并且正在安装管理程序。Nexted 虚拟化具有多种复杂性,并使虚拟机管理程序开发过程更加复杂。除非安装的第一个管理程序支持嵌套,否则只能有一个管理程序。
  3. 虚拟化软件严重依赖 CPU 的虚拟化支持,运行 VM 和管理程序主机可能会变得棘手。在虚拟机中运行管理程序也是如此(因此您可以正确调试它)。是对如何在 VMWare 中执行操作的正确解释。

今天,有几个可用的开源虚拟机管理程序,大多数用于实验目的,不包括设置功能虚拟机管理程序所需的基础设施之外的许多实际功能。

以下是一些开源概念证明,可用作起点:

  1. https://github.com/hzqst/Syscall-Monitor
  2. https://github.com/ionescu007/SimpleVisor
  3. https://github.com/asamy/ksm
  4. https://github.com/tandasat/HyperPlatform

覆盖 IVT/IDT/SSTD

在不远的过去挂钩中断向量表中断描述符表系统服务调度表非常普遍。尽管这不会提供与管理程序相同的粒度,并且您将无法检测到特定指令,但通常的做法是被管理程序部分取代以获得操作系统未提供的低级别监控。

它背后的基本思想是在触发某些中断时覆盖 CPU 执行的地址列表。这通常是操作系统负责处理中断以及操作系统提供多少低级功能(例如管理内存和权限、分页、多任务支持、外设输入/输出等)。这种技术在某些使用PatchGuard 之类的技术的操作系统上变得有些无关紧要

rdtsc

rtdsc指令有点特殊,其他指令可能不会。这里引用

当处于受保护或虚拟 8086 模式时,寄存器 CR4 中的时间戳禁用 (TSD) 标志限制了 RDTSC 指令的使用,如下所示。当TSD标志清零时,RDTSC指令可以在任何权限级别执行;当标志被设置时,指令只能在特权级别 0 执行。

它很特别,因为它在CR4. 当设置该控制位时,只允许内核模式代码执行该rdtsc指令,但更有趣的是,当设置此控制位时,使用rdtscfrom usermode 将触发General Protection Fault,从而使内核可以检测到此类指令。