今天学到的一个思路,利用设备的属性,来判断是否为沙箱。即是否为即插即用设备。首先来看一下正常机器的设备属性:
再看一下虚拟机中的设备属性,这里使用的是VMware环境进行测试。
可以清楚的看到两者的区别。当然,也有大佬给出了powershell版本的检测方法:
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定义如下:
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;
}
参考文章:
https://twitter.com/NinjaParanoid/status/1358098804122083334
▼