bool CheckVMware1() { __asm { rdtsc xchg ebx, eax rdtsc sub eax, ebx cmp eax, 0xFF jg detected } return FALSE; detected: return TRUE; }
HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe
。bool CheckVMware2() { HKEY hkey; if (RegOpenKey(HKEY_CLASSES_ROOT, "\\Applications\\VMwareHostOpen.exe", &hkey) == ERROR_SUCCESS) { return TRUE; } else { return FALSE; } }
vmtoolsd.exe
。bbool CheckVMware3() { 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((const char *)pe32.szExeFile, "vmtoolsd.exe") == 0) { return TRUE; } bMore = Process32Next(hProcessSnap, &pe32); } CloseHandle(hProcessSnap); return FALSE; }
C:\Program Files\VMware\VMware Tools\
。bool CheckVMware4() { if (PathIsDirectory("C:\\Program Files\\VMware\\VMware Tools\\") == 0) { return FALSE; } else { return TRUE; } }
bool CheckVMware5() { //打开系统服务控制器 SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE); if (SCMan == NULL) { printf("%ld", GetLastError()); printf("OpenSCManager Eorror/n"); return -1; } //保存系统服务的结构 LPENUM_SERVICE_STATUSA service_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; }
int main() { int n; bool result; while (1) { printf("虚拟机检测技术:\n"); printf("1. 基于CPU运算时间的检测\n"); printf("2. 基于注册表的检测\n"); printf("3. 基于当前进程信息的检测\n"); printf("4. 基于特定文件的检测\n"); printf("5. 基于注册服务的检测\n"); printf("0. 退出\n"); printf("请选择:"); scanf("%d", &n); flushall(); printf("检测结果:"); switch (n) { case 0: return 0; case 1: result = CheckVMware1(); break; case 2: result = CheckVMware2(); break; case 3: result = CheckVMware3(); break; case 4: result = CheckVMware4(); break; case 5: result = CheckVMware5(); break; default:printf("输入错误,请从新输入!\n"); Sleep(2000); system("cls"); continue; } if (result) printf("yes!\n"); else printf("no!\n"); printf("按任意键返回主菜单\n"); getch(); flushall(); system("cls"); } return 0; }
主要编写2个文件:checkvm.dll
与testvm.exe
,下面分2部分详细介绍。安全
checkvm.h
、checkvm.cpp
、dllmain.cpp
、Source.def
bool chekvm();
bool checkvm() { int num = 0; if (CheckVMware1()) num++; if (CheckVMware2()) num++; if (CheckVMware3()) num++; if (CheckVMware4()) num++; if (CheckVMware5()) num++; if (num >= 4) { printf("This is a virtual machine!\n"); return FALSE; } else { printf("This is not a virtual machine!\n"); return TRUE; } }
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
LIBRARY "checkvm" EXPORTS checkvm @1
checkvm.dll
所编写,调用checkvm.dll
中的checkvm()
函数便可,详细代码以下:int main() { HMODULE hmod = LoadLibrary("checkvm.dll"); //用于加载dll typedef int(*LoadProc)(); LoadProc Load_proc = (LoadProc)GetProcAddress(hmod, "checkvm"); //GetProcAddress()用于得到函数地址 int iRet = Load_proc(); getchar(); return 0; }
checkvm.dll
便可。