首页
社区
课程
招聘
[原创]编写驱动检测虚拟机
发表于: 2019-2-22 22:15 10475

[原创]编写驱动检测虚拟机

2019-2-22 22:15
10475

原理:通过检查功能号1的CPUID返回的ecx的最高位是否为1,如果为1,则在虚拟环境下运行。真机的最高位不为1.

我们说到的第一种CPUID的方法可能通过修改VMX的配置等方法绕过。
还有一种方式是遍历当前系统中所有的sys。我们要查找的是vmmouse.sys,vmrawdsk.sys,vmusbmouse.sys中的任意一个。
核心是利用NtQuerySystemInformation

注:在X64下使用上文的汇编代码时,需要修改下asm的属性

效果

github

 
   bit   Name     Description
  ---------------------------------------------------------
    00   SSE3     Streaming SIMD Extensions 3
    01            Reserved
    02   DTES64   64-Bit Debug Store
    03   MONITOR  MONITOR/MWAIT
    04   DS-CPL   CPL Qualified Debug Store
    05   VMX      Virtual Machine Extensions
    06   SMX      Safer Mode Extensions
    07   EST      Enhanced Intel SpeedStep® Technology
    08   TM2      Thermal Monitor 2
    09   SSSE3    Supplemental Streaming SIMD Extensions 3
    10   CNXT-ID  L1 Context ID
  12:11           Reserved
    13   CX16     CMPXCHG16B
    14   xTPR     xTPR Update Control
    15   PDCM     Perfmon and Debug Capability
  17:16           Reserved
    18   DCA      Direct Cache Access
    19   SSE4.1   Streaming SIMD Extensions 4.1
    20   SSE4.2   Streaming SIMD Extensions 4.2
    21   x2APIC   Extended xAPIC Support
    22   MOVBE    MOVBE Instruction
    23   POPCNT   POPCNT Instruction
  25:24           Reserved
    26   XSAVE    XSAVE/XSTOR States
    27   OSXSAVE
  31:28           Reserved

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-2-22 22:47 被微笑明天编辑 ,原因:
上传的附件:
收藏
免费 9
支持
分享
打赏 + 6.00雪花
打赏次数 2 雪花 + 6.00
 
赞赏  Editor   +1.00 2019/02/25 精品文章~
赞赏  kanxue   +5.00 2019/02/23 感谢分享~
最新回复 (18)
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
学习一下.
2019-2-22 22:40
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
根据楼主的思路改了一个应用层的献给论坛的伸手党们.

#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;
}


2019-2-22 23:02
3
雪    币: 6639
活跃值: (3479)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
哦哦哦学习
2019-2-23 12:33
0
雪    币: 1430
活跃值: (4378)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
5
猪会被杀掉 学习一下.
看过你的CSDN学到挺多知识的
2019-2-23 14:48
0
雪    币: 18
活跃值: (1059)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
黑手鱼 看过你的CSDN学到挺多知识的[em_1]
2019-2-23 16:06
0
雪    币: 6124
活跃值: (4646)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
遍历内核模块确实是简单的方法。
不过,如果别人先你一步加载驱动,挂了NtQuerySystemInformation这个函数又该怎么办呢?
2019-2-23 16:36
0
雪    币: 1430
活跃值: (4378)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
8
注册表、判断磁盘个数、磁盘大小好多好多方法。。
2019-2-24 12:06
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
检测方法很多的  这只是其中两种办法 
2019-2-24 13:38
0
雪    币: 26588
活跃值: (63252)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
10
感谢分享!
2019-2-25 09:41
0
雪    币: 198
活跃值: (46)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
com 里面的检测才多
2019-3-1 17:11
0
雪    币: 2973
活跃值: (4881)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
12
killpy 检测方法很多的 这只是其中两种办法
2020-10-17 12:03
0
雪    币: 3846
活跃值: (3618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
骚操作
2020-10-17 17:45
0
雪    币: 515
活跃值: (3252)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem
14
2020-10-18 08:03
0
雪    币: 7515
活跃值: (5347)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
从显卡入手也很方便
2020-10-18 09:45
0
雪    币: 8387
活跃值: (4961)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
黑洛 遍历内核模块确实是简单的方法。 不过,如果别人先你一步加载驱动,挂了NtQuerySystemInformation这个函数又该怎么办呢?
重载内核即可
2020-10-18 15:10
0
雪    币: 6124
活跃值: (4646)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
17
大道在我 重载内核即可
确实,都默认可以hook了
2020-10-18 17:07
0
雪    币: 15
活跃值: (279)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
那就在他头部挂啊 写个自动检测挂钩常用的几个字节 还不容易
2020-12-7 05:59
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
vbox呢?
有人提到從顯卡入手,似乎是個好辦法
2020-12-8 02:48
0
游客
登录 | 注册 方可回帖
返回
//