在调试时,有可能会放在虚拟机里调试,所以反调试就需要检测是否在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;
}