manarex 发表于 2023-8-13 11:30:53

检测当前环境是否是虚拟机附C++源码


检测当前环境是否是虚拟机附C++源码

1、执行特权指令检测
      在x86体系中,一些指令在获取硬件相关信息时不产生异常,如sidt、sgdt、sldt、cpuid等,而VMware因为性能原因并没有虚拟这些指令,所以意味着这些指令在vm虚拟机中和物理机中运行时会返回不同的结果。

  简单说,就是通过运行sidt指令获取IDT寄存器的值(IDT: 中断描述符表,可以简单理解为查找处理中断时所用的函数,共256项,如第3项就是我们常用的int3断点)。Redpill的作者测试说明虚拟机中的IDT地址通常位于0xFFXXXXXX,而在真实主机上位于0x80xxxxxx。所以可通过判断执行SIDT指令后返回的第一字节是否大于0xD0,判断是否在虚拟机中。同时这项技术必须满足运行在单核处理器上,因为每个核心只有一个IDT表如果是多核切换就很难确定具体值了可能会因为虚拟机的升级,导致结果不一样。

2、使用cpuid指令来检测是否设置了代码正在虚拟机程序上运行的特征位,有的虚拟机可能不会设置该特征位!
bool IsVMWare();

int main(int argc,char* argv[])
{
    bool bRet;

      bRet = IsVMWare();
      if (bRet) {
                printf("运行在虚拟机环境");
      }
      else
      {
                printf("运行在真实物理机环境");
      }

      getchar();

      return 0;
}
bool IsVMWare()
{
      unsigned int cpuInfo;
      __cpuid((int*)cpuInfo, 1);
      return ((cpuInfo >> 31) & 1) == 1;
}

**** Hidden Message *****
页: [1]
查看完整版本: 检测当前环境是否是虚拟机附C++源码