- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2024-8-11
 
- 在线时间
 - 4 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 24 
 
 
 
 
 | 
 
 
检测当前环境是否是虚拟机附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[4];
 
 -         __cpuid((int*)cpuInfo, 1);
 
 -         return ((cpuInfo[2] >> 31) & 1) == 1;
 
 - }
 
 
  复制代码 
 
 |   
 
 
 
 |