controstr
驱动牛犊
驱动牛犊
  • 注册日期2008-05-13
  • 最后登录2010-02-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望21点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:7462回复:4

检测当前系统是运行在虚拟机下还是真实硬件下

楼主#
更多 发布于:2008-09-19 20:47

1.我想检测当前windows系统运行在什么环境下,是运行在真实硬件的电脑上面还是运行在虚拟机下面;

2.如果是在虚拟机下面运行,应该怎么判断当前系统是虚拟机;

3.若是根据设备名称来判断当前系统是虚拟机的的话,可不可以修改虚拟机的设备名称,是怎么修改?;

4.在CSDN上面找了以前的一个贴子,是用汇编语言写的,不知道这个。。。。
  http://topic.csdn.net/t/20060808/16/4935495.html#
我调试了一下,出错,我对汇编不认识,请求指点
struct
驱动小牛
驱动小牛
  • 注册日期2003-08-21
  • 最后登录2013-12-05
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望50点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-01-17 23:21
1. 通过cpuid指令返回结果,可以知道当前机器是否支持虚拟机。
2. 在虚拟机(guest os)中,cpuid指令是被模拟的,一般guest不再支持在guest中启动虚拟机
3. 虚拟机种的设备大多是qemu的,也可以用来判断。想修改?先学习qemu.
4. 还没看,不知道是不是:)
明天的事明天再说
cao002
驱动牛犊
驱动牛犊
  • 注册日期2007-06-14
  • 最后登录2015-06-08
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望197点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-04-03 15:33
[转]
大家或许都会疑惑,到底怎样用代码检测当前系统运行在虚拟机中,如VMWare等。
我在http://www.codeproject.com/system/VmDetect.asp发现了一个VC++6写的代码,用的是嵌套汇编。

后来请装配脑袋迁移到VC++7.1并封装成模块,调用很方便。

下载地址:http://www.cnblogs.com/Files/unruledboy/IsInVM%20standard.zip

或许大家会纳闷:这个代码到底有什么实际用途,老实说,作者也不知道~~ 他只关心实现,不关心应用:)
cao002
驱动牛犊
驱动牛犊
  • 注册日期2007-06-14
  • 最后登录2015-06-08
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望197点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-04-03 15:35
// IsInsideVPC's exception filter
DWORD __forceinline IsInsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)
{
  PCONTEXT ctx = ep->ContextRecord;

  ctx->Ebx = -1; // Not running VPC
  ctx->Eip += 4; // skip past the "call VPC" opcodes
  return EXCEPTION_CONTINUE_EXECUTION;
  // we can safely resume execution since we skipped faulty instruction
}

// High level language friendly version of IsInsideVPC()
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

    // call VPC
    _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;
}
cao002
驱动牛犊
驱动牛犊
  • 注册日期2007-06-14
  • 最后登录2015-06-08
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望197点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-04-03 15:35
bool IsInsideVMWare()
{
  bool rc = true;

  __try
  {
    __asm
    {
      push   edx
      push   ecx
      push   ebx

      mov    eax, 'VMXh'
      mov    ebx, 0 // any value but not the MAGIC VALUE
      mov    ecx, 10 // get VMWare version
      mov    edx, 'VX' // port number

      in     eax, dx // read port
                     // on return EAX returns the VERSION
      cmp    ebx, 'VMXh' // is it a reply from VMWare?
      setz   [rc] // set return value

      pop    ebx
      pop    ecx
      pop    edx
    }
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
    rc = false;
  }

  return rc;
}
游客

返回顶部