SandBox检测之即插即用设备

  • A+
所属分类:安全文章


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


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检测之即插即用设备

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: