在一些样本中有一些反虚拟机的行为,来对抗分析,其中通过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;
}