- 注册时间
- 2021-4-16
- 最后登录
- 2024-7-7
- 在线时间
- 4 小时
编程入门
- 龙马币
- 22
|
检测当前环境是否是虚拟机附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;
- }
复制代码
|
|