背景:
恶意代码和游戏外挂的作者为了逃避技术人员对他们的程序进行分析,经常使用反虚拟机技术,这种技术可以检测自己是否运行在虚拟机中,如果发现自己在虚拟机中运行那么恶意程序就不会执行恶意代码,或者游戏外挂就会直接退出进程。甚至在HW行动中的入侵诱捕对抗中也会应用到,这篇文章可以让我们了解反虚拟机技术,知道他是怎样一个原理,就可以做出破防的方法。
VMware痕迹检测
根据进程信息
在任务管理器中的进程列表可以看到vmtoolsd、vmacthlp、VGAuthService与Vmware有关的程序正在运行
BOOL CheckVMWare()
{
DWORD ret = 0;
PROCESSENTRY32 pe32;
pe32.dwSize =sizeof(pe32);
HANDLE hProcessSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hProcessSnap ==INVALID_HANDLE_VALUE)
{
return FALSE;
}
BOOL bMore =Process32First(hProcessSnap, &pe32);
while(bMore)
{
if (strcmp(pe32.szExeFile,"vmware.exe")==0)
{
return TRUE;
}
bMore =Process32Next(hProcessSnap, &pe32);
}
CloseHandle(hProcessSnap);
return FALSE;
}
还可以通过“net start|findstr VMware”命令来进行搜索与VMware的相关证据。
根据注册表信息
通过读取主机具有虚拟机特性的注册表来判断是否处于虚拟机环境中。
可以在“HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe”进行查看。
BOOL CheckVMWare()
{
HKEY hkey;
if (RegOpenKey(HKEY_CLASSES_ROOT,"\\Applications\\VMwareHostOpen.exe", &hkey) ==ERROR_SUCCESS)
{
return TRUE;
}
else
{
return FALSE;
}
}
根据MAC信息
通常MAC地址的前三个字节标识一个提供商
00:05:69、00:0c:29和00:50:56开始的MAC地址与VMware相对应。
BOOL CheckVMWare()
{
string mac;
get_mac(mac);
if(mac=="00-05-69" || mac=="00-0c-29" ||mac=="00-50-56")
{
return TRUE;
}
else
{
return FALSE;
}
}
根据特定的文件夹
通过查找磁盘中是否存在特定的文件夹或者文件来判断当前是否在虚拟机环境中。
在”C:\Program Files\VMware\VMwareTools\”路径下通常会有下图的文件。
BOOL CheckVMware()
{
if(PathIsDirectory("C:\\Program Files\\VMware\\VMware Tools\\") ==0)
{
return FALSE;
}
else
{
return TRUE;
}
}
根据特定服务名
通过获取当前主机的服务信息来判断当前主机是否为虚拟机。
在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等。
通过获取当前主机的服务信息来判断当前主机是否为虚拟机。
在VMware中通常会存在VMware物理磁盘助手服务和VMware Tools服务等。
BOOL CheckVMWare()
{
int menu = 0;
//打开系统服务控制器
SC_HANDLE SCMan =OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout <<GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系统服务的结构
LPENUM_SERVICE_STATUSAservice_status;
DWORD cbBytesNeeded =NULL;
DWORD ServicesReturned =NULL;
DWORD ResumeHandle =NULL;
service_status =(LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//获取系统服务的简单信息
bool ESS =EnumServicesStatusA(SCMan, //系统服务句柄
SERVICE_WIN32, //服务的类型
SERVICE_STATE_ALL, //服务的状态
(LPENUM_SERVICE_STATUSA)service_status, //输出参数,系统服务的结构
1024 * 64, //结构的大小
&cbBytesNeeded,//输出参数,接收返回所需的服务
&ServicesReturned,//输出参数,接收返回服务的数量
&ResumeHandle);//输入输出参数,第一次调用必须为0,返回为0代表成功
if(ESS == NULL)
{
printf("EnumServicesStatus Eorror/n");
return -1;
}
for(int i = 0; i < ServicesReturned;i++)
{
if(strstr(service_status[i].lpDisplayName, "VMware Tools")!=NULL ||strstr(service_status[i].lpDisplayName, "VMware 物理磁盘助手服务")!=NULL)
{
return TRUE;
}
}
//关闭服务管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
查找漏洞指令
虚拟机监视器VMM(Virtual Machine Monitor)是一个运行在宿主机系统,用来监视虚拟机状态的监视器。VMM为客户及操作系统提供一个完整的虚拟平台。但是VMM也存在一些可以被恶意代码探测到虚拟化的安全缺陷。
NO Pill反虚拟机
使用sgdt和sldt指令探测VMware的技术通常被称为No Pill。
BOOL CheckVMWare()
{
ULONG xdt = 0 ;
ULONG InVM = 0;
__asm
{
push edx
sidt [esp-2]
pop edx
nop
mov xdt , edx
}
if (xdt >0xd0000000)
{
InVM = 1;
}
else
{
InVM = 0;
}
__asm
{
push edx
sgdt [esp-2]
pop edx
nop
mov xdt , edx
}
if (xdt >0xd0000000)
{
InVM += 1;
}
if (InVM == 0)
{
return FALSE;
}
else
{
return TRUE;
}
}
查询I/O端口
VMware使用虚拟化的I/O端口完成宿主系统与虚拟机之间的通信,以便支持诸如复制和粘贴功能。这个端口可以被查询,然后与一个神秘数比较,以确定VMware的使用
BOOL CheckVMWare()
{
bool rc = true;
__try
{
__asm
{
push edx
push ecx
push ebx
mov eax, 'VMXh'
mov ebx, 0
mov ecx, 10
mov edx, 'VX'
in eax, dx
cmp ebx, 'VMXh'
setz [rc]
pop ebx
pop ecx
pop edx
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
rc = false;
}
return rc;
}
使用STR指令
STR(Store task register)指令是用于将任务寄存器 (TR) 中的段选择器存储到目标操作数,目标操作数可以是通用寄存器或内存位置,使用此指令存储的段选择器指向当前正在运行的任务的任务状态段 (TSS)。在虚拟机和真实主机之中,通过STR读取的地址是不同的,当地址等于0x0040xxxx时,说明处于虚拟机中,否则为真实主机。
BOOL CheckVMWare()
{
unsigned char mem[4] ={0};
__asm str mem;
if ((mem[0] == 0x00)&& (mem[1] == 0x40))
{
return TRUE;
}
else
{
return FALSE;
}
}
总结:
对抗反虚拟机技术也是多种多样比如修改Vmware的.vmx文件就可以减轻虚拟机被检测的可能;修改跳转指令等等。在文章的最后最后介绍一种对抗反虚拟机技术,方法很多,仅给各位提供一个参考。
在虚拟机文件中找到下图的文件,之后用记事本打开,输入以下代码即可缓解反虚拟机效果。
isolation.tools.getPtrLocation.disable = "TRUE" //禁止获取父进程
isolation.tools.setPtrLocation.disable = "TRUE" //禁止获取虚拟机状态
isolation.tools.setVersion.disable = "TRUE"
isolation.tools.getVersion.disable = "TRUE"
//前四条指令主要是使运行在Guest系统中的VMware Tools不能获取宿主系统的信息。
monitor_control.disable_directexec = "TRUE" //开启3D加速
monitor_control.disable_chksimd = "TRUE" //下面都是关于性能优化的设置
monitor_control.disable_ntreloc = "TRUE"
monitor_control.disable_selfmod = "TRUE"
monitor_control.disable_reloc = "TRUE"
monitor_control.disable_btinout = "TRUE"
monitor_control.disable_btmemspace = "TRUE"
monitor_control.disable_btpriv = "TRUE"
monitor_control.disable_btseg = "TRUE"
蛇矛实验室成立于2020年,团队核心成员均由从事安全行业10余年经验的安全专家组成,团队涉及红蓝对抗、渗透测试、逆向破解、病毒分析、工控安全以及免杀等相关领域方向。蛇矛实验室致力于安全研究、攻防解决方案以及靶场仿真复现等相关方向,曾多次参与国家级、省级护网行动,具备充足的一线应急响应、漏洞挖掘、渗透测试、安全加固、攻击追溯、漏洞复现、实网攻防、靶场场景复现等能力。