41

应用程序是否有正式的方法来确定它是在 VMWare 还是 Virtual PC(或微软现在所称的任何东西)中运行?我看到的代码通常是利用特定版本的 VMWare 或 Virtual PC 中一些奇怪的行为副作用的 hack。

理想情况下是 Delphi 代码,但如果你可以链接到官方解释,那么我相信我可以转换它。

4

10 回答 10

36

去年我写了一系列关于这个的文章,带有源代码。VMware 和 Wine 检测在这里。虚拟 PC 来。所有这三个都具有相当铁定的检测,因为记录了对管理程序的回调(在 Wine 的情况下,标准 DLL 的扩展)。我在评论部分放置了一个未经测试的 VirtualBox 检测器(没有安装它来测试)。Parallels 也可以使用回调检测到,但我没有安装它。文档的链接(由于它来自专注于漏洞利用的安全研究人员,因此很差),但如果您已安装并感兴趣,则位于此处。这里还有一个PPT有一些关于检测 Sandbox、Bochs 和 Xen 的信息。里面的代码不多,但如果你必须检测这些代码,它可能会给你一个起点。

于 2009-04-23T01:15:48.230 回答
5

代码项目展示了一种检测您的程序是否在虚拟机中运行的方法,该方法详细介绍了如何完成它以提供良好的理解

于 2009-04-22T23:55:18.177 回答
2

我认为最好的方法是检查硬件配置文件。虚拟化硬件通常使用公司名称的一部分。如果您在 Virtual PC 中查看主板说明,您会发现它是由“Microsoft Corporation”制造的。同样在 VMWare 中,您的以太网适配器将以 VMNet 为前缀。

于 2009-04-22T23:57:14.910 回答
2

SysInternals 论坛上的这个帖子有几个答案(当然是在 Delphi 中),包括一个 IsVM 函数。我已经在 VMWare 中的 XP 和 Vista 上托管的 XP 和 Win2003 上进行了测试,结果很好。

于 2009-04-23T10:26:25.147 回答
1

这里发布了一种 WMI 方式:http: //blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

我已经仔细检查了在 Virtual PC 上运行的 XP 映像,他们正在测试的值仍然相同。不过,我不能保证其他虚拟机会在这里返回什么...

实际上,我有一个我几年前编写的 Delphi 程序来获取列表并使用 WMI 更改默认打印机,而不需要 3rd 方组件或类似的东西。如果您不习惯使用 Delphi 的 WMI,我可以向您发送一份副本,以便您有一些工作要做(虽然它不一定与 Unicode 兼容,但升级它对我来说应该不会太难如果需要的话)。

于 2009-04-22T23:56:50.997 回答
1

我使用了RedPill方法(翻译为 Delphi,但代码并不难理解),效果相当好。我还使用 WMI 调用进行了一些额外的检查,以获取诸如网络适配器供应商名称和版权之类的信息,但那是为了检测特定版本的 Virtual PC。

我对 RedPill 方法的理解是它应该工作并根据其工作方式的性质检测所有虚拟机。也有可能产生误报,因为 Windows 7 的 Windows 中的新 Windows 功能可以配置为在 Windows 7 中无缝运行 Windows XP 副本中的选定程序。

于 2009-04-24T23:39:53.270 回答
1

我很幸运只看 MAC 地址,因为所有制造商都有一个块,前 3 个部分对他们来说是独一无二的。

//look at the MAC address and determine if it's a Virtual Machine
$temp = preg_split("/\s+/",exec("/sbin/ifconfig -a eth0 2>&1 | /bin/grep HWaddr"), -1, PREG_SPLIT_NO_EMPTY);
//Virtual Box MACs all start with '08:00:27:xx:xx:xx'
if (strpos($temp[4], '08:00:27') !== false) $_SESSION['DEVELOPMENT'] = true;  
于 2009-12-01T01:40:36.123 回答
1

判断机器是物理机还是虚拟机

dmidecode | egrep -i 'manufacturer|product'

如果找不到 dmidecode 命令,请安装相应的 rpm。

这是在 EXSI、VMWARE 和 hyperv 机器下测试的。

于 2010-10-20T05:07:50.783 回答
0

如果您想普遍检测是否存在任何类型的虚拟化,则最好分析性能特征。采取一些在虚拟化中速度明显较慢的东西(例如像分叉炸弹这样的 MMU 繁重的工作负载),并将其与正常的 CPU 绑定用户空间应用程序进行比较。从比例你可以很容易地看出。

如果您只关心某些 VMM,最简单的工作就是寻找它们的硬件 - 即 VMware PCI 设备:

00:07.3 桥接器:Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) 子系统:VMware Inc 虚拟机芯片组

公元 15 年:1976

供应商值为“15ad”

还有一些特定的后门端口可以跨各种版本的各种 VMM 工作。SIDT 技巧也很好,但是如果 VMM 不在他的代码正在检查的列表中怎么办?

于 2009-05-29T08:45:20.387 回答
0
dmidecode -s system-product-name

在 VirtualBox 上测试,结果:

Virtualbox
于 2010-11-17T20:37:10.650 回答