微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在linux上检测VMM

我试图检测我是否在虚拟环境(vmware,virtualBox等)上运行

在Windows上,我使用了几个ASM,但是我不能在Linux中使用它们,主要是因为代码可能在32位或64位Linux上编译和运行。

以下代码同时适用于Windows 32和64,并在VMWare,virtualBox和其他虚拟机上进行了testing:

#include <stdio.h> int idtCheck () { unsigned char m[2]; __asm sidt m; printf("IDTR: %2.2x %2.2xn",m[0],m[1]); return (m[1]>0xd0) ? 1 : 0; } int gdtCheck() { unsigned char m[2]; __asm sgdt m; printf("GDTR: %2.2x %2.2xn",m[1]); return (m[1]>0xd0) ? 1 : 0; } int ldtCheck() { unsigned char m[2]; __asm sldt m; printf("LDTR: %2.2x %2.2xn",m[1]); return (m[0] != 0x00 && m[1] != 0x00) ? 1 : 0; } int main(int argc,char * argv[]) { idtCheck(); gdtCheck(); if (ldtCheck()) printf("Virtual Machine detected.n"); else printf("Native machine detected.n"); return 0; }

现在,海湾合作委员会抱怨所有职能上的__asm。 我试着用asm(), asm和其他我以前用过的forms,但都没有工作。 有任何想法吗?

套接字阻塞:(我如何出去?

为什么_CrtSetDumpClient不工作?

一个根本不被调用函数中分割错误

如何从任务pipe理器中的“应用程序”选项卡隐藏窗口?

C#如何更换系统托盘时钟

在linux中清理目录中的文件

如何在Linux中运行visual studio 2015托pipec ++testing函数

terminal如何从stdout中读取并在屏幕上绘制文本?

Windows 7/10 – 在不同的显示器上启动应用程序

在C中执行一个bash命令(没有系统)

那么,我还没有拆卸那里的机器代码,但是这里有一个使用GCC内联汇编器的版本:

int redpill() { unsigned char idt_addr[(sizeof(long)==8)?10:6]; __asm__("SIDT (%[ptr])" : "=m" (idt_addr) : [ptr] "r" (&idt_addr)); // examine high order byte return idt_addr[(sizeof(long)==8)?9:5] > 0xd0; }

这应该 “工作”即使是64位,但我没有在那里测试过。

然而! 这不能保证给你想要的结果。 首先,它不会与硬件虚拟化,因为你不能看到真正的IDT。 其次,它依赖于VMWare和Virtual PC的实现细节,可能很容易改变。 如果你的操作系统决定把它的IDT放在高位,它甚至可能会引发误报。 所以我不推荐这种方法

对于使用VMX硬件支持的虚拟机,可能最好的办法是做一些硬件上应该快的东西,但是需要在虚拟机中设置一个陷阱,然后检查时间。 像cpuID这样的东西将是一个不错的选择。 在虚拟机和真实硬件上进行基准测试(与一个执行ADD或者处理不同时钟速率的虚拟循环进行比较),并查看测试机器与哪个配置文件更加匹配。 由于每个cpuID将不得不退出虚拟机以向主机内核询问它想要呈现的功能,所以它将比在真实硬件上花费更多的时间。

对于其他类型的虚拟机,只需加载一个控制寄存器或调试寄存器,您就可以做类似的时间检查 – 虚拟机将不得不将其捕获,或者将其替换为模拟代码。 如果你使用的是VMware,它可能会用一些模拟的代码代替陷阱 – 在这种情况下,你可以通过定时修改包含控制寄存器或调试寄存器操作的代码来识别它。 这将迫使虚拟机使其缓存的代码无效,这就需要虚拟机有一个昂贵的陷阱,这个虚拟机会出现在你的基准测试中。

请注意,这两种方法都需要操作系统内核的帮助 – 如果您至少没有模拟内核的控制权,将很难确定您是否在虚拟机中。 如果虚拟机是非常复杂的,那么也可能会造成时序错乱,在这种情况下,事情变得非常困难 – 但这往往会导致性能下降,并导致时钟漂移(如果能够连接到互联网并查询时间服务器!),所以大多数商业虚拟机不这样做。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐