应用程序是否有正式的方法来确定它是在 VMWare 还是 Virtual PC(或微软现在所称的任何东西)中运行?我看到的代码通常是利用特定版本的 VMWare 或 Virtual PC 中一些奇怪的行为副作用的 hack。
理想情况下是 Delphi 代码,但如果你可以链接到官方解释,那么我相信我可以转换它。
应用程序是否有正式的方法来确定它是在 VMWare 还是 Virtual PC(或微软现在所称的任何东西)中运行?我看到的代码通常是利用特定版本的 VMWare 或 Virtual PC 中一些奇怪的行为副作用的 hack。
理想情况下是 Delphi 代码,但如果你可以链接到官方解释,那么我相信我可以转换它。
去年我写了一系列关于这个的文章,带有源代码。VMware 和 Wine 检测在这里。虚拟 PC 来了。所有这三个都具有相当铁定的检测,因为记录了对管理程序的回调(在 Wine 的情况下,标准 DLL 的扩展)。我在评论部分放置了一个未经测试的 VirtualBox 检测器(没有安装它来测试)。Parallels 也可以使用回调检测到,但我没有安装它。文档的链接(由于它来自专注于漏洞利用的安全研究人员,因此很差),但如果您已安装并感兴趣,则位于此处。这里还有一个PPT有一些关于检测 Sandbox、Bochs 和 Xen 的信息。里面的代码不多,但如果你必须检测这些代码,它可能会给你一个起点。
代码项目展示了一种检测您的程序是否在虚拟机中运行的方法,该方法详细介绍了如何完成它以提供良好的理解
我认为最好的方法是检查硬件配置文件。虚拟化硬件通常使用公司名称的一部分。如果您在 Virtual PC 中查看主板说明,您会发现它是由“Microsoft Corporation”制造的。同样在 VMWare 中,您的以太网适配器将以 VMNet 为前缀。
SysInternals 论坛上的这个帖子有几个答案(当然是在 Delphi 中),包括一个 IsVM 函数。我已经在 VMWare 中的 XP 和 Vista 上托管的 XP 和 Win2003 上进行了测试,结果很好。
这里发布了一种 WMI 方式:http: //blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx
我已经仔细检查了在 Virtual PC 上运行的 XP 映像,他们正在测试的值仍然相同。不过,我不能保证其他虚拟机会在这里返回什么...
实际上,我有一个我几年前编写的 Delphi 程序来获取列表并使用 WMI 更改默认打印机,而不需要 3rd 方组件或类似的东西。如果您不习惯使用 Delphi 的 WMI,我可以向您发送一份副本,以便您有一些工作要做(虽然它不一定与 Unicode 兼容,但升级它对我来说应该不会太难如果需要的话)。
我使用了RedPill方法(翻译为 Delphi,但代码并不难理解),效果相当好。我还使用 WMI 调用进行了一些额外的检查,以获取诸如网络适配器供应商名称和版权之类的信息,但那是为了检测特定版本的 Virtual PC。
我对 RedPill 方法的理解是它应该工作并根据其工作方式的性质检测所有虚拟机。也有可能产生误报,因为 Windows 7 的 Windows 中的新 Windows 功能可以配置为在 Windows 7 中无缝运行 Windows XP 副本中的选定程序。
我很幸运只看 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;
判断机器是物理机还是虚拟机
dmidecode | egrep -i 'manufacturer|product'
如果找不到 dmidecode 命令,请安装相应的 rpm。
这是在 EXSI、VMWARE 和 hyperv 机器下测试的。
如果您想普遍检测是否存在任何类型的虚拟化,则最好分析性能特征。采取一些在虚拟化中速度明显较慢的东西(例如像分叉炸弹这样的 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 不在他的代码正在检查的列表中怎么办?
dmidecode -s system-product-name
在 VirtualBox 上测试,结果:
Virtualbox