renleiguanchashi

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

 

分类:

技术点:

相关文章: