如何检测虚拟化环境?

逆向工程 反调试 虚拟机
2021-06-19 02:10:33

程序检测它在虚拟化环境中执行的不同方式有哪些?并且,是否有可能检测到使用了哪种虚拟化?

4个回答

这个列表可能是无止境的,所以我会保持简短:

  • 虚拟化环境工件:注册表项、硬盘名称、网卡地址、特定驱动程序、...
  • 环境差异:没有鼠标,互联网连接,声卡,...
  • 执行差异:检测块转换(创建另一个线程并在 IP 上应用统计信息),不同的系统寄存器值,...
    • 缺乏用户交互(特定于自动化环境):没有鼠标移动,没有文件操作,...
  • 具体环境差异:VmWare 后门VirtualPC 异常错误、...

(查看反调试标签wiki了解更多)

有多种检测虚拟机/模拟器的方法,主要遵循识别模拟中的缺陷然后对其进行测试的模式。

在最简单的一端,常见的虚拟化工具包将它们的名字贴在各种系统驱动程序和设备上。如果没有专门配置为屏蔽这些,只需查看网络连接的名称或其 MAC 地址可能就足以识别 VMware。同样,VM 的内存可能有很多字符串,使虚拟化软件的存在显而易见。

其他一些 VM 工件来自主机和来宾都必须具有处理器可访问的不能重叠的数据结构,例如用于返回中断描述符表寄存器的 SIDT 汇编指令。(IDT) 虚拟机通常将 IDT 存储在比物理主机更高的寄存器中。

测量通常需要与虚拟化系统交互的某些功能或指令的时间是一种间接推断您正在 VM 中执行的方法。

想到两种方法作为反反 VM 方法:第一,可以修改虚拟环境以消除所有可能的虚拟化痕迹,这可以很好地对抗对“vmware”或类似字符串的简单检查,从而导致各种军备竞赛在已知技术和狡猾的虚拟机配置之间。

第二种方法是严重依赖静态分析来识别 VM 检测技术,并在这样做后修补它们以抵消它们的影响,以产生非 VM 感知的可执行文件,然后可以对其进行动态分析。

一些具有良好信息的来源,如果是几岁的话:

以下是检测 VM 的一些技巧:

虚拟盒子

虚拟电脑

管理程序检测

尽管如此,我试图使代码自我解释,您也可以参考相应的博客文章以获取更详细的信息。

我写了一个测试程序(在 Delphi 中)。

下面两个函数检测VMware和HyperV

// VMware detection as described by Elias Bachaalany
function IsInsideVMware: Boolean;
begin
  Result := True;

  try
    asm
      push edx;
      push ecx;
      push ebx;

      mov eax, 'VMXh';
      mov ebx, 0;
      mov ecx, 10;
      mov edx, 'VX';

      in eax, dx;

      cmp ebx, 'VMXh';
      setz [Result];

      pop ebx;
      pop ecx;
      pop edx;
    end;
  except
    Result := False;
  end;
end;

function IsHyperV: Boolean;
asm
  cpuid;
  test ecx, ecx;
  sets [Result];
end;

以下函数通过供应商品牌字符串检查 Hyper-V(在 VMware 上返回“VMwareVMware”:

function IsRunningUnderHyperV: BOOL; stdcall;
var
  VMBranding: array[0..12] of AnsiChar;
begin
  asm
    mov eax, $40000000;
    cpuid;
        mov dword ptr [VMBranding+0], ebx;  // Get the VM branding string
        mov dword ptr [VMBranding+4], ecx;
        mov dword ptr [VMBranding+8], edx;
  end;
  VMBranding[12] := #0;

  Result := CompareText(String(VMBranding), 'Microsoft Hv') = 0;
end;

相关链接: