在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。虚拟机检测
一、VMWare
1.1查找注册表
通过检测注册表“HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0”,在数据项中查找目标数据VMWARE
HKEY_LOCAL_MACHINE_SYSTEM_ControlSet001\Services\VMware Pyhsical Disk Helper Service![]()
![]()
1.2搜索特定程序
Vmtoolsd.exe vmacthlp.exe VMwareUser.exe VMwareTray.exe VMUpgradeHelper.exe bool SearchTargetPro(WCHAR* strProName) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { exit(1); } bool bMore = ::Process32First(hProcessSnap, &pe32); while (bMore) { if (wcsstr(pe32.szExeFile, strProName)) { return true; bMore = false; } else { bMore = ::Process32Next(hProcessSnap, &pe32); } } CloseHandle(hProcessSnap); return bMore; }1.3通过执行特权指令
Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在指定功能号0A(获取VMware版本)的情况下,它会在EBX中返回其版本号“VMXH”;而当功能号为0x14时,可用于获取VMware内存大小,当大于0时则说明处于虚拟机中。VMDetect正是利用前一种方法来检测VMware的存在,其检测代码分析如下:void IsInsideVMWare() { bool rc = true; __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 = false; } if (rc == true) { cout << "In VMWare!" << endl; } else { cout << "Not In VMWare!" << endl; } } void test6(void) { unsigned int a = 0; __try { __asm { // save register values on the stack push eax push ebx push ecx push edx // perform fingerprint mov eax, 'VMXh' mov ecx, 14h mov dx, 'VX' in eax, dx mov a, eax pop edx pop ecx pop ebx pop eax } } __except (EXCEPTION_EXECUTE_HANDLER) {} printf("\n[+] Test 6: VMware \"get memory size\" command\n"); if (a > 0) printf("Result : VMware detected\n\n"); else printf("Result : Native OS\n\n"); }1.4查找特定的驱动模块
恶意样本分析手册-虚拟机检测篇(下)
最新推荐文章于 2024-04-27 10:01:57 发布