基于软件特征检测虚拟机
在调试时,有可能会放在虚拟机里调试,所以反调试就需要检测是否在VM中,这里提供的方法有以下三种:
方式1:搜索服务 -- 包含WMware Tools / WMware 物理磁盘助手服务
方式2:找文件路径 -- C:\Program Files\VMware\VMware Tools
方式3:寻找进程 -- vmtoolsd.exe
代码:
#include <stdio.h> #include <Windows.h> #include <process.h> #include <TlHelp32.h> #include "Psapi.h" #include <Shlwapi.h> #pragma comment(lib,"Shlwapi.lib") /**********************************************************************************/ // 通过VMware Tools路径检测虚拟机 BOOL CheckVmByPath() { // PathIsDirectory需要包含Shlwapi的头文件和库 if (PathIsDirectory("C:\\Program Files\\VMware\\VMware Tools") == 0 ) { return FALSE; } else { return TRUE; } } DWORD WINAPI ThreadFuncCallBack(LPVOID lp) { while (true) { if (CheckVmByPath()) { MessageBox(0, "VM存在", "提示",MB_OK); break; } } return 0; } /**********************************************************************************/ // 搜索服务 -- 包含WMware Tools / WMware 物理磁盘助手服务 BOOL CheckVmByServe() { SC_HANDLE SCMan = OpenSCManager(NULL,NULL, SC_MANAGER_CONNECT| SC_MANAGER_ENUMERATE_SERVICE); // 打开本地的服务控制管理器数据库,得到句柄 if (SCMan == NULL) { return FALSE; } else { LPENUM_SERVICE_STATUSA service_status; DWORD dwByteNeed = NULL; // 需要的服务 DWORD dwServiceReturned = NULL; // 返回服务的数量 DWORD dwResumeHandle = NULL; service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024*64); bool bEss = EnumServicesStatusA(SCMan, SERVICE_WIN32, SERVICE_STATE_ALL, service_status, 1024 * 64, &dwByteNeed,&dwServiceReturned,&dwResumeHandle); if (bEss == NULL) { DWORD Error = GetLastError(); printf("%d", Error); return FALSE; } for (size_t i = 0; i < dwServiceReturned; i++) { if (strstr(service_status[i].lpDisplayName, "VMware Tools") != NULL || strstr(service_status[i].lpDisplayName, "WMware 物理磁盘助手服务") != NULL) { return TRUE; } } CloseServiceHandle(SCMan); return FALSE; } } /**********************************************************************************/ BOOL FindProcess(TCHAR *pName) { HANDLE SnapshotHandle; //定义一个快照 PROCESSENTRY32 ProcessEntry32; //照片结构体 SnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //照第一张相 if (SnapshotHandle != INVALID_HANDLE_VALUE) { ProcessEntry32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(SnapshotHandle, &ProcessEntry32)) //照的第一张放到ProcessEntry32里面 { do { if (!strcmp(ProcessEntry32.szExeFile, pName)) { return TRUE; } } while (Process32Next(SnapshotHandle, &ProcessEntry32)); return FALSE; } } } // 寻找调试器进程 DWORD WINAPI ThreadFuncCallBack2(LPVOID lp) { while (TRUE) { CHAR NeedFindPName[20] = "vmtoolsd.exe"; if (FindProcess(NeedFindPName)) { MessageBox(0, "存在VM","提示", MB_OK); break; } } return 0; } int main() { // 方式1:搜索服务 -- 包含WMware Tools / WMware 物理磁盘助手服务 // CreateThread(NULL, NULL, ThreadFuncCallBack, NULL, NULL, NULL); // 方式2:找文件路径 -- C:\Program Files\VMware\VMware Tools /* if (CheckVmByServe()) { MessageBox(0, "VM存在", "提示", MB_OK); return 0; } */ // 方式3:寻找进程 -- vmtoolsd.exe CreateThread(NULL, NULL, ThreadFuncCallBack2, NULL, NULL, NULL); while (true) { printf("RUN\n"); } system("pause"); return 0; }
在虚拟机中运行exe文件: