首页 | 程式人生 | 原创下载 | 技术文档 | 留言我们 | 关于我们

应用程序如何得知自己是在VMware中

作者: phanrider        2005-07-18

现在虚拟机应用的很广泛,程序怎么得知自己是否运行在虚机下面呢,当然可以根据某些特定的特征来判断
以下所有都在VMware中实验

1、WindowsXP/Windows 2003




d:\>wmic diskdrive list | find /I "VMware"

d:\>echo %errorlevel%
0

d:\>



如果%ErrorLevel%为零则表示是在虚拟机中,其他则表示不在,其中WMIC命令需要Administrators管理组中的权限,当然如果要在自己的程式中判断,则必须要自己写代码了,在NT架构下,程序只有进入RING0才能读写端口,进入RING0方法有很多种了,其中用驱动是最好的方法,因为驱动是无所不能,兼容性也是最高。详细代码就不列出了,可以参看EditTool32的原程序,其中有个函数就是加载驱动的。当然在NT5.1以上系统中有个NtSystemDebugControl可以无驱读写端口,但各个操作系统调用不同,要考虑兼容性。当然也要管理员的权限。


2、Linux/Unix
直接用以下命令可以在SHELL中得知道自己所处的系统环境



[phanrider@redhat ide]$ cat /proc/ide/ide0/hda/model
VMware Virtual IDE Hard Drive




优点是只要普通用户权限就可以,缺点无法和自己的程序无缝结合,下面是一段C程序通过读写端口得到IDE0接口磁盘的Serial Number




#include <stdio.h>
#include <sys/io.h>

#define DISKPORT 0x1f0

int main()
{

unsigned int i,j;
unsigned char p;
unsigned int Disk_Info[513];
unsigned int cache=0;
unsigned char s[21];
unsigned char v[9];
unsigned char t[41];

i = 0; j = 0; p = 0;


if (ioperm(DISKPORT, 8, 1)) {perror("ioperm"); exit(1);}

while (p != 0x40)
{
j++;
if(j == 0xffff) break;
p = inb (0x1f7);
p &= 0xc0;
}



for(i = 0; i < 5; i++) outb (0,0x1f1+i);

outb (0xa0,0x1f6);
outb (0xec,0x1f7);

i = 0; j = 0; p = 0;

while (p != 0x8)
{
j++;
if (j == 0xffff) break;
p = inb (0x1f7);
p &= 0x88;
}

for (i = 0; i < 512; i++)
{
Disk_Info[i] = inw (0x1f0);
}

s[20]='\0';
v[8]='\0';
t[40]='\0';
cache = Disk_Info[21]/2;

for (i = 0; i < 10; i++)
{
j = Disk_Info[10+i];
s[i*2] = (unsigned char)(j>>8);
s[i*2+1] = (unsigned char)j;
}

for(i = 0; i < 20; i++)
{
j = Disk_Info[27+i];
t[i*2] = (unsigned char)(j>>8);
t[i*2+1] = (unsigned char)j;
}


printf ("\nPhysical Disk 0 ");
printf ("\nDrive Serial Number : %-40s",t);
printf ("\nDrive Model Number : %-20s",s);
printf ("\nDrive Controller Revision Number : %-8s",v);
printf ("\nDrive Controller Buffer Size : %u K", cache);
printf ("\n");

if (t[0] == 'V' && t[1] == 'M') printf ("\nRunning in VMware Workstation!\n");
else printf("\nRunning in Real System!\n");

if (ioperm(DISKPORT, 8, 0)) {perror("ioperm"); exit(1);}
exit(0);
}






编译运行如下所示:




[root@redhat phanrider]# gcc -O2 -lm disk.c -o disk
[root@redhat phanrider]# ./disk

Physical Disk 0
Drive Serial Number : VMware Virtual IDE Hard Drive
Drive Model Number : 00000000000000000001
Drive Controller Revision Number : 00000001
Drive Controller Buffer Size : 32 K

Running in VMware Workstation!




以上程序缺点是必须有root权限才可能运行,仅仅是抛砖,希望有玉出现-_-


→返回←

红蜻蜓工作室版权所有
Copyright © 1999-2025 Reddragonfly & Studio All Rights Reserved.
如有任何问题及建议请留言红蜻蜓工作室