SandBox检测之即插即用设备

admin 2021年2月7日11:25:34评论212 views字数 1288阅读4分17秒阅读模式


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


SandBox检测之即插即用设备


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


SandBox检测之即插即用设备


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


Get-WmiObject Win32_PnPSignedDriver | select DeviceName|where {$_.DeviceName -like "*PnP*"}


SandBox检测之即插即用设备


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


武器化


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

其核心API为,


EnumDisplayDevicesA,API定义如下:


BOOL EnumDisplayDevicesA(  LPCSTR           lpDevice,  DWORD            iDevNum,  PDISPLAY_DEVICEA lpDisplayDevice,  DWORD            dwFlags);


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


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了。


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


参考文章:



     ▼
更多精彩推荐,请关注我们

SandBox检测之即插即用设备



本文始发于微信公众号(鸿鹄实验室):SandBox检测之即插即用设备

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年2月7日11:25:34
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   SandBox检测之即插即用设备http://cn-sec.com/archives/264114.html

发表评论

匿名网友 填写信息