2020-12-15

Windows检测虚拟机简易方法

作者:好中文的样子 所属分类 - 安全 - 干货

不少游戏厂商,软件厂商为了防止软件在虚拟机里面运行,会采用各种虚拟机检测方法。这里简单介绍一下一种新的纯用户层虚拟机检测方法,不需要驱动。本方法容易被绕过(绕过的方法多,也容易被虚拟机用户先启动的驱动拦截相关检测函数,如WinAPI的各种导出函数),仅供参考,不作稳定性和有效性保证。下面直接上源码:

#include <stdio.h>
#include <Windows.h>
#include <winternl.h>
#include <locale.h>

typedef struct _RTL_PROCESS_MODULE_INFORMATION
{
  HANDLE Section;
  PVOID MappedBase;
  PVOID ImageBase;
  ULONG ImageSize;
  ULONG Flags;
  USHORT LoadOrderIndex;
  USHORT InitOrderIndex;
  USHORT LoadCount;
  USHORT OffsetToFileName;
  UCHAR FullPathName[256];
}RTL_PROCESS_MODULE_INFORMATION, *PRTL_PROCESS_MODULE_INFORMATION;
typedef struct _RTL_PROCESS_MODULES
{
  ULONG ModulSayisi;
  RTL_PROCESS_MODULE_INFORMATION Moduller[1];
}RTL_PROCESS_MODULES, *PRTL_PROCESS_MODULES;

int main()
{
  NTSTATUS ntstatus;
  PRTL_PROCESS_MODULES modules;
  modules = (PRTL_PROCESS_MODULES)VirtualAlloc(NULL, 1024 * 1024, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
  if (!modules){
    return -1;
  }
  decltype(NtQuerySystemInformation)* NtQuerySystemInformationPtr;
  NtQuerySystemInformationPtr = reinterpret_cast<decltype(NtQuerySystemInformation)*>(GetProcAddress(GetModuleHandleW(L"ntdll.dll"),"NtQuerySystemInformation"));
  if (!NT_SUCCESS(ntstatus = NtQuerySystemInformationPtr((SYSTEM_INFORMATION_CLASS)11, modules, 1024 * 1024, NULL))){
    VirtualFree(modules, 0, MEM_RELEASE);
    return -1;
  }
  for (ULONG i = 0; i < modules->ModulSayisi; i++){
    const char* module_name = (const char*)(modules->Moduller[i].FullPathName + modules->Moduller[i].OffsetToFileName);
    if (!lstrcmpiA(module_name, "vmmouse.sys")|| !lstrcmpiA(module_name, "vmrawdsk.sys")|| !lstrcmpiA(module_name, "vmusbmouse.sys")){
      printf("vmware!!!!!\n");
    }
  }
  VirtualFree(modules, 0, MEM_RELEASE);
  return 0;
}

将该内容嵌入项目即可,简单有效,可以自行定制修改。

VM虚拟机

麦科技原创,转载请说明出处