前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SandBox检测之即插即用设备

SandBox检测之即插即用设备

作者头像
鸿鹄实验室
发布2021-04-01 11:35:35
8440
发布2021-04-01 11:35:35
举报
文章被收录于专栏:鸿鹄实验室

今天学到的一个思路,利用设备的属性,来判断是否为沙箱。即是否为即插即用设备。首先来看一下正常机器的设备属性:

再看一下虚拟机中的设备属性,这里使用的是VMware环境进行测试。

可以清楚的看到两者的区别。当然,也有大佬给出了powershell版本的检测方法:

代码语言:javascript
复制
Get-WmiObject Win32_PnPSignedDriver | select DeviceName|where {$_.DeviceName -like "*PnP*"}

在虚拟机中该语句将返回空。

武器化

这个检测方式其实是属于一种正常的功能,微软也在其官方文档中给出了示例代码,链接如下:https://docs.microsoft.com/en-us/windows/win32/gdi/getting-information-on-a-display-monitor

其核心API为,

EnumDisplayDevicesA,API定义如下:

代码语言:javascript
复制
BOOL EnumDisplayDevicesA(
  LPCSTR           lpDevice,
  DWORD            iDevNum,
  PDISPLAY_DEVICEA lpDisplayDevice,
  DWORD            dwFlags
);

唯一需要主要的是第三个参数,DISPLAY_DEVICE的一个指针。结构体内容如下:

代码语言:javascript
复制
typedef struct _DISPLAY_DEVICEA {
  DWORD cb;
  CHAR  DeviceName[32];
  CHAR  DeviceString[128];
  DWORD StateFlags;
  CHAR  DeviceID[128];
  CHAR  DeviceKey[128];
} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA;

然后我们下面来编写代码就ok了。

代码语言:javascript
复制
#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
  DISPLAY_DEVICE dd;
  dd.cb = sizeof(dd);
  int deviceIndex = 0;
  while (EnumDisplayDevices(0, deviceIndex, &dd, 0))
  {
    std::wstring deviceName = dd.DeviceName;
    int monitorIndex = 0;
    while (EnumDisplayDevices(deviceName.c_str(), monitorIndex, &dd, 0))
    {
      int flag = strlen((const char*)dd.DeviceString);
      if (flag > 2) {
        std::wcout << "this is vm";
      }
      else
      {
        std::wcout << "this is not vm";
      }
      ++monitorIndex;
    }
    ++deviceIndex;
  }
  return 0;
}

参考文章:

https://twitter.com/NinjaParanoid/status/1358098804122083334

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿鹄实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档