特权指令检测虚拟机

bool IsInsideVMWare()
{
  bool rc = true;

  __try
  {
    __asm
    {
      push   edx
      push   ecx
      push   ebx

      mov    eax, 'VMXh'
      mov    ebx, 0  // 将ebx设置为非幻数’VMXH’的其它值
      mov    ecx, 10 // 指定功能号,用于获取VMWare版本,当它为0x14时用于获取VMware内存大小
      mov    edx, 'VX' // 端口号
      in     eax, dx // 从端口dx读取VMware版本到eax
//若上面指定功能号为0x14时,可通过判断eax中的值是否大于0,若是则说明处于虚拟机中
      cmp    ebx, 'VMXh' // 判断ebx中是否包含VMware版本’VMXh’,若是则在虚拟机中
      setz   [rc] // 设置返回值

      pop    ebx
      pop    ecx
      pop    edx
    }
  }
  __except(EXCEPTION_EXECUTE_HANDLER)  //如果未处于VMware中,则触发此异常
  {
    rc = false;
  }

  return rc;
}

 下面是主函数

int main(void)
{
	if(IsInsideVMWare())
	{
		 printf("it is in vmm \r\n");
	}
	else
	{
		 printf("it is not in vmm \r\n");
	}
		return 0;
}

 感谢泉哥的分享。

原文:http://bbs.pediy.com/showthread.php?t=119969

posted @ 2012-07-11 10:54  r3call  阅读(532)  评论(1编辑  收藏  举报