当前位置:首页 > 虚拟机 > 正文

游戏时如何识别虚拟机(如何使用自带的虚拟机游戏)

梦幻如何检测虚拟机、实现特殊命令检测
在x86系统中,有些命令在获取硬件相关信息时不会产生异常,如sidt、sgdt、sldt、cpuid等。但是,由于性能原因,VMware并没有虚拟化该命令,因此这意味着该命令在vm虚拟机和物理机中运行时会返回不同的结果。
Redpill
简而言之,就是通过运行sidt命令来获取IDT寄存器的值(IDT:Interrupt描述符表,可以简单理解为找到用来处理中断的函数,一共有256个)项,比如项3就是我们平时使用的int3断点)。作者Redpill测试表明,虚拟机中的IDT地址通常位于0xFFXXXXXX,而在真实主机上则位于0x80xxxxxx。因此,可以通过判断执行SIDT指令后返回的第一个字节是否大于0xD0来判断是否在虚拟机中。同时,这项技术必须能够在单核处理器上运行,因为每个核只有一个IDT表。如果交换机是多核的,则很难确定具体值
可能是虚拟机增加的原因。结果不同。
2.使用cpuid命令检测虚拟机程序上的代运行的特性位是否被设置。有些虚拟机可能没有设置此功能位!
boolIsVMWare();
intmain(intargc,char*argv[])
{
boolbRet;
bRet=IsVMWare();
if(bRet){
printf("在虚拟机环境中运行");
}
else
{
printf("在真实物理机环境中运行");
}
getchar();
return0;
}
boolIsVMWare()
{
unsignedintcpuInfo[4];
__cpuid((int*)cpuInfo,1);
return((cpuInfo[2]>>31)&1)==1;
}
登录后复制

(局部描述符表)
sgdt和sldt指令检测技术依赖于LDT(局部描述符表),因为它是由处理器而不是操作系统分配的。由于Windows正常情况下不使用LDT,但VM提供了对LDT的虚拟化支持,所以结果是:LDT位置在真机中为0,但在虚拟机中不为0。同时,对于GTR来说,虚拟机必须是0xFFXXXXXX,否则就是真机。
inlineboolIsVirtualPC_LDTCcheck()
{
unsignedshortldt_addr=0;
unsignedcharldtr[2];
_asmsldtldtr
ldt_addr=*((unsignedshort*)&ldtr);
returnldt_addr!=0x00000000;
}
登录后复制
4.注册表检测
inlineboolDetectVM()
{
HKEYhKey;
charszBuffer[64];
unsignedlonghSize=sizeof(szBuffer)-1;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"硬件\\DESCRIPTION\\System\\BIOS\\",0,KEY_READ,&hKey)==ERROR_SUCCESS)
{
RegQueryValueEx(hKey,"SystemManufacturer",NULL,NULL,(unsignedchar*)szBuffer,&hSize);
if(strstr(szBuffer,"VMWARE"))
{
RegCloseKey(hKey);
returntrue;
}
RegCloseKey(hKey);
}
returnfalse;
}
登录后复制

检测
inlineboolIsVirtualPC_GDTCheck()
{
unsignedintgdt_addr=0;
unsignedchargdtr[6];
_asmsgdtgdtr
gdt_addr=*((unsignedint*)&gdtr[2]);
return(gdt_addr>>24)==0xff;
}
登录后复制
检测
inlineboolIsVirtualPC_TSSCeck()
{
unsignedcharmem[4]={0};
__asmstrmem;
return(mem[0]==0x00)&&(mem[1]==0x40);
}
登录后复制
7.I/O通讯端口检测
原理:使用IN命令读取特定端口的数据,用于两台机器之间的通讯。但由于IN命令是特权命令,因此当在保护模式下的真机上执行该命令时,除非权限允许,否则会触发“EXCEPTION_PRIV_INSTRUCTION”类型的异常。虚拟机中不会出现异常。当指定的函数号为0xA/10(获取VMware版本)时,EBX中将返回其版本号“VMXH”;当函数号为0x14时,可用于获取VMware版本。内存大小。当大于0时,表示处于虚拟机中。代码分析如下:

怎样让软件识别不出虚拟机其他所有答案都是废话。您可能甚至不知道什么是虚拟机。
我也遇到了同样的情况,遇到一个软件无法在虚拟机上运行,​​弹出一条消息说无法在虚拟机上使用。