通过in指令反虚拟机

时间:2022-09-29 21:45:51

在一些样本中有一些反虚拟机的行为,来对抗分析,其中通过in指令就是
专门来对抗vmware虚拟机的,代码如下,恶意样本可以将恶意代码放入
异常中,也可以通过设置返回值进行判断

int IsInsideVMWare();

int main()
{

if(IsInsideVMWare()==5)
{
printf(“out”);
}else{
printf(“in”);
}
//printf(“sdfsdfsdf”);
return 0;
}

int IsInsideVMWare()
{
int rc = 1;

__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 = 5;

printf("sdfsdfsdfsdf");

}

return rc;
}