我需要检测我的应用程序是否在虚拟化操作系统实例中运行。
我发现 an article 包含一些关于该主题的有用信息。同一篇文章出现在多个地方,我不确定原始来源。 VMware 实现了一条特定的无效 x86 指令来返回有关自身的信息,而 VirtualPC 使用带有 IN 指令的魔数(Magic Number)和 I/O 端口。
这是可行的,但在这两种情况下似乎都是未记录的行为。我想 VMWare 或 VirtualPC 的 future 版本可能会改变这种机制。有没有更好的办法?这两种产品是否有受支持的机制?
同样,有没有办法检测 Xen 或 VirtualBox ?
我不担心平台故意隐藏自己的情况。例如,蜜 jar 使用虚拟化,但有时会掩盖恶意软件用来检测它的机制。我不在乎我的应用程序会认为它没有在这些蜜 jar 中虚拟化,我只是在寻找“尽力而为”的解决方案。
该应用程序主要是 Java,但我希望使用 native 代码和 JNI 来实现此特定功能。 Windows XP/Vista 支持是最重要的,尽管引用文章中描述的机制是 x86 的通用功能,不依赖于任何特定的操作系统设施。
最佳答案
你听说过 blue pill, red pill? 吗?这是一种用于查看您是否在虚拟机内运行的技术。该术语的起源源于 the matrix movie,其中向 Neo 提供蓝色或红色药丸(留在矩阵内 = 蓝色,或进入“真实”世界 = 红色)。
以下是一些代码,可以检测您是否在“矩阵”内运行:
(从 this site 借用的代码,其中还包含一些关于手头主题的好信息):
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;
}
当您在虚拟机中运行时,该函数将返回 1,否则返回 0。
关于virtualbox - 从应用程序中检测虚拟化操作系统?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/154163/