【问题标题】:Red Pill detect virtualizationRed Pill 检测虚拟化
【发布时间】:2017-09-17 18:42:03
【问题描述】:

我正在尝试检测我的 Windows 是否在虚拟机上运行。我发现了这个被称为 Joanna Rutkowska's Red Pill 的 C 代码:

int swallow_redpill () 
{
  unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
  *((unsigned*)&rpill[3]) = (unsigned)m;
  ((void(*)())&rpill)();
  return (m[5]>0xd0) ? 1 : 0;
}

但是当我在我的 VC++ 项目中运行它时,它在线失败

  ((void(*)())&rpill)();

带有消息:访问冲突执行位置 0x003AFCE8。 我做错了吗?

【问题讨论】:

  • 您尝试将rpill 中的数据用作函数。但是,程序中的普通数据不应该是可执行的,所以它不能被“调用”。此外,如果您在地址大小为 64 位的 64 位系统上怎么办? unsigned 类型等于 unsigned int,在所有现代标准 PC 平台上都是 32 位类型,因此当您将其“修补”到代码中时,m 的地址可能会被截断。
  • @Someprogrammerdude 是否意味着这不是工作方法?或者有什么方法可以让这个解决方案同时在 x86 和 x64 系统上运行?
  • 指针问题可以通过将程序构建为 32 位可执行文件来轻松解决。但这并不能解决数据不可执行的问题,我不知道如何解决。
  • 这种方法是十多年前发明的,并且非常适用于当时的特定 VMM——VMWare 工作站和虚拟 PC。这取决于 VMM 管理客户内存的方式。它不适用于现代虚拟化技术(EPT 和 NPT,它们本身已有近十年的历史)。

标签: c++ c virtual-machine virtualization


【解决方案1】:

显然,示例代码正在尝试执行一系列机器指令,这些指令在一些虚拟机中的行为与在*一些“真实硬件上的行为不同。请注意,使用这种简单的方法可能无法检测到其他虚拟机.

代码执行失败的原因是在现代操作系统上你不能执行数据部分。您需要专门将该段代码放入可执行部分,或将数据部分更改为可执行。

来自Joanna Rutkowska代码的实际编写者:

注意:此程序将在具有 PAX/X^W/grsecurity、保护(正如 Brad Spengler 指出的那样)的系统上失败,因为 rpill 变量未标记为可执行文件。要使其在此类系统中运行,应使用 mprotect() 将 rpill 标记为 PROT_EXEC 属性。另一种解决方案是只使用 asm() 关键字而不是类似 shellcode 的缓冲区。但是,这个程序应该被视为构建到您自己的 shellcode 中的骨架,而不是独立的生产类工具;)我的目标是使其尽可能简单和可移植。这就是我没有使用 asm() 和 mprotect() 的原因,因为它们依赖于系统或编译器。

【讨论】:

    【解决方案2】:
    #include <windows.h>
    
    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
    int swallow_redpill () 
    {
      unsigned int old;
      VirtualProtect(rpill, 8, PAGE_EXECUTE_READWRITE, &old);
      *((unsigned*)&rpill[3]) = (unsigned)m;
      ((void(*)())&rpill)();
      return (m[5]>0xd0) ? 1 : 0;
    }
    

    应该在 Windows 上解决问题。如果您有 x64 机器,请确保在 Win32 上运行它。

    【讨论】:

    • 这对我来说看起来不对:你不需要 VirtualProtect rpill 不老吗?即使 rpill 在堆栈上不是全局的(所以在初始化的数据段中?) 8 可能不会涵盖整个 rpill + 对齐,尽管我猜它跨越一个页面并且你遇到麻烦的可能性很小。
    猜你喜欢
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多