首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟的计算机, 这些虚拟机就像真正的计算机那样进行工作, 例如你可以安装操作系统, 安装应用程序, 访问网络资源等等. 对于你而言, 它只是运行在你物理计算机上的一个应用程序, 但是对于在虚拟机中运行的应用程序而言, 它就像是在真正的计算机中进行工作. 因此, 当我在虚拟机中进行软件评测时, 可能系统一样会崩溃, 但是, 崩溃的只是虚拟机上的操作系统, 而不是物理计算机上的操作系统, 并且, 使用虚拟机的恢复功能, 我可以马上恢复虚拟机到安装软件之前的状态. 现在比较流行的虚拟机软件有 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);elseMessageBox(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 edxpush ecxpush ebxmov eax, 'VMXh'mov ebx, 0mov ecx, 10mov edx, 'VX'in eax, dxcmp ebx, 'VMXh'setz[rc]pop ebxpop ecxpop edx}}__except (EXCEPTION_EXECUTE_HANDLER){rc = false;}return rc;
}int _tmain(int argc, _TCHAR* argv[])
{return CheckVPC();return 0;
}

判断程序是否运行在虚拟机中的代码相关推荐

  1. Android之通过ActivityLifecycleCallbacks判断程序是否运行在后台

    1.问题 判断程序是否运行在后台运行 2.解决办法 我们可以使用ActivityLifecycleCallbacks,对于ActivityLifecycleCallbacks,看我的这篇博客介绍() ...

  2. 程序是运行在flash中还是RAM中?

    前言 最近在做项目中遇到一些疑虑,包括OTA升级时会不会阻塞到其他工作线程.select原理和正确用法.如何快速正确理解产品到软件框架构建.嵌入式应用的代码优化方法.本篇文章主要针对第一个问题,请教外 ...

  3. 服务器中请不要在虚拟机中运行此程序,轻易解决VMware 虚拟机中被提示“请不要在虚拟机中运行此程序“...

    传奇世界单机版 不要在虚拟机运行,解决问题后,觉得应该分享给大家.用记事本打开 VMX 文件 类似 Windows XP Professional.vmx ,在文本末尾加入一行 monitor_con ...

  4. 在服务器 和 虚拟机中 查看代码 samba source insight

    在服务器 或者 虚拟机中, 我们查看代码是不方便的,可以使用samba 和 source insight 分别来 同步代码 和 编辑代码 samba 安装 1.1 apt-get 安装 A.安装sam ...

  5. 嵌入式 linux 程序不能运行,嵌入式Linux中在开发板上/usr/bin目录下不能运行自己交叉编译的程序...

    ~~一个很不知道错在哪里的问题 我编译了内核与文件系统后成功下载后 我将我交叉编译的hello,led测试程序,key测试程序下载到/usr/bin中不能运行:其现象如下: [root@YWW-244 ...

  6. java代码的运行顺序_java中的代码块执行顺序

    输入代码 blic static void main(String[] args) { { int x = 10;//限定变量的声明周期 System.out.println(x); } Studen ...

  7. .NET Core 如何判断程序是否在远程桌面(RDP)下运行

    点击上方蓝字关注"汪宇杰博客" 导语 由于疫情的关系,很久没发文章了.今天终于稳定下来在家办公,抽空分享一个刚学会的技巧.最近在家办公的程序员可能避免不了要用远程桌面,那么问题来了 ...

  8. android 模拟器识别,一种基于符号的识别Android应用运行在模拟器中的方法与流程...

    本发明涉及一种基于符号的识别android应用运行在模拟器中的方法. 背景技术: 很多的移动应用都会使用一种基于lbs的地理围栏的技术(如移动打卡),某些用户为了突破这种围栏的限制,将移动应用运行在模 ...

  9. AndroidStudio中将项目运行在模拟器中提示:The currently selected variant “debug“ uses split APKs, but none of the 1

    场景 在AndroidStudio中将项目运行在虚拟机中提示: The currently selected variant "debug" uses split APKs, bu ...

最新文章

  1. G - 水陆距离 HihoCoder - 1478(广搜+队列先进先出性质)
  2. win10打字突然变成繁体
  3. Response.Write具体介绍
  4. win10 vscode 无法激活python 虚拟环境的解决办法
  5. 【产品动态】解读Dataphin流批一体的实时研发
  6. 第 7 章 原型模式
  7. eclipse查看一个方法被谁引用(调用)的快捷键四种方式
  8. C#记事本的简单开发
  9. Caffe的各个版本简介
  10. 私服游戏怎么选择服务器性能和配置。
  11. MTR和WinMTR的下载和使用
  12. ubuntu桌面美化
  13. Windows桌面任务栏应用图标变白怎么办?
  14. 安装Vue-cli并且创建项目
  15. 【简书交友】阿群1986: 一个专注于修电脑做系统的青岛小哥
  16. 瑞合信LED字幕WiFi卡使用教程(8.0版)
  17. python 爬网站上的图片
  18. 记实习听课笔记及心得
  19. GVM升级后启动异常处理
  20. 养老轻资产创业的商业逻辑与投资机会

热门文章

  1. ThreadLocal的两种用法总结
  2. 依赖注入_List_Set_Array类型的注入
  3. MapReduce分区-代码实现
  4. Response_案例1_重定向_特点
  5. Servlet_生命周期详解
  6. maven工程运行环境修改
  7. Eclipse Debug maven test
  8. android 等待动画 库,android--AnimationDrawable实现等待动画效果
  9. 【SpringBoot零基础案例03】【IEDA 2021.1】SpringBoot框架核心配置文件application.properties的使用
  10. 沃尔玛建立自家的人工智能网络,抗衡竞争对手亚马逊