首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟的计算机, 这些虚拟机就像真正的计算机那样进行工作, 例如你可以安装操作系统, 安装应用程序, 访问网络资源等等. 对于你而言, 它只是运行在你物理计算机上的一个应用程序, 但是对于在虚拟机中运行的应用程序而言, 它就像是在真正的计算机中进行工作. 因此, 当我在虚拟机中进行软件评测时, 可能系统一样会崩溃, 但是, 崩溃的只是虚拟机上的操作系统, 而不是物理计算机上的操作系统, 并且, 使用虚拟机的恢复功能, 我可以马上恢复虚拟机到安装软件之前的状态. 现在比较流行的虚拟机软件有 VMWare 和 Microsoft Virtual PC , 它们都能在 Windows 系统上虚拟出多个计算机, 用于安装 Windows 或其他操作系统. 相比而言, VMWare 不论是在多操作系统的支持上, 还是在执行效率上, 都比 Microsoft Virtual PC 明显高出一筹. 但是 VMWare 没有虚拟显卡, 而是通过 VMWare Tools 才能用上高分辨率和真彩色. Microsoft Virtual PC 模拟了一个比较通用的显卡:S3Trio32/64(4M), 这点看来比较通用, 易用性较好. 
      以下主要代码主要判断程序是否在虚拟机环境中运行, 测试环境为 Windows 系统, 在 Windows XP SP2 + Microsoft Visual C++ 2003 下调试成功, 附编译的检测程序

// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "windows.h"

DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep);
bool IsInsideVPC();
bool IsInsideVMWare();
int CheckVPC();

int CheckVPC()
{
	if (IsInsideVPC())
		MessageBox(NULL, "你在虚拟电脑Microsoft Virtual PC中!", "提示", MB_OK | MB_ICONINFORMATION);
	else if (IsInsideVMWare())
		MessageBox(NULL, "你在虚拟电脑VMWare中!", "提示", MB_OK | MB_ICONINFORMATION);
	else
		MessageBox(NULL, "你在真实的电脑中!", "提示", MB_OK | MB_ICONINFORMATION);

	return 0;
}

DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)
{
	CONTEXT *ctx = ep->ContextRecord;
	ctx->Ebx = -1;
	ctx->Eip += 4;
	return EXCEPTION_CONTINUE_EXECUTION;
}

bool IsInsideVPC()
{
	bool rc = false;
	__try
	{
		_asm push ebx
		_asm mov ebx, 0 // It will stay ZERO if VPC is running
		_asm mov eax, 1 // VPC function number
		_asm __emit 0Fh
		_asm __emit 3Fh
		_asm __emit 07h
		_asm __emit 0Bh
		_asm test ebx, ebx
		_asm setz[rc]
			_asm pop ebx
	}
	// The except block shouldn't get triggered if VPC is running!!
	__except (IsInsideVPC_exceptionFilter(GetExceptionInformation()))
	{
	}

	return rc;
}

bool IsInsideVMWare()
{
	bool rc = true;

	__try
	{
		__asm
		{
			push edx
				push ecx
				push ebx
				mov eax, 'VMXh'
				mov ebx, 0
				mov ecx, 10
				mov edx, 'VX'
				in eax, dx
				cmp ebx, 'VMXh'
				setz[rc]
				pop ebx
				pop ecx
				pop edx
		}
	}
	__except (EXCEPTION_EXECUTE_HANDLER)
	{
		rc = false;
	}

	return rc;
}

int _tmain(int argc, _TCHAR* argv[])
{
	return CheckVPC();
	return 0;
}


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐