判断程序是否运行在虚拟机中的代码
首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟的计算机, 这些虚拟机就像真正的计算机那样进行工作, 例如你可以安装操作系统, 安装应用程序, 访问网络资源等等. 对于你而言,它只是运行在你物理计算机上的一个应用程序, 但是对于在虚拟机中运行
首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟的计算机, 这些虚拟机就像真正的计算机那样进行工作, 例如你可以安装操作系统, 安装应用程序, 访问网络资源等等. 对于你而言, 它只是运行在你物理计算机上的一个应用程序, 但是对于在虚拟机中运行的应用程序而言, 它就像是在真正的计算机中进行工作. 因此, 当我在虚拟机中进行软件评测时, 可能系统一样会崩溃, 但是, 崩溃的只是虚拟机上的操作系统, 而不是物理计算机上的操作系统, 并且, 使用虚拟机的恢复功能, 我可以马上恢复虚拟机到安装软件之前的状态. 现在比较流行的虚拟机软件有 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;
}
更多推荐
所有评论(0)