要检测一个USB设备(比如USB虚拟摄像头)是虚拟设备还是物理设备,目前我知道的有以下几个方式:
1,查询USB设备VID和PID号。
如果查询失败,或者查询到的硬件ID在usb.ids里面查询不到的,直接判定为虚拟USB设备。
2,向设备发送特定的URB请求。
部分虚拟设备仅仅实现了主要功能的数据收发,针对其他不常用的USB请求并未处理。
3,检测USB设备的父设备驱动名。
USB设备的父设备驱动一般是usbhub或者usbhub3
usbhub,usbhub3的父设备一般是usbohci,usbuhci,usbxhci,当然也有第三方驱动的usb控制器设备。
虚拟设备的父设备驱动名目前市面上已有的产品基本不是这几个名字。
一个虚拟USB设备如果能对以上3个点处理好,基本可以逃避硬件检测,
1和2的针对性处理实现并不难,正确的框架加上各种控制码细心的处理,基本都能实现。
难点在3,怎么让你的父设备变成微软自带的usbhub和usbxhci呢,改驱动名肯定不现实,会有一系列问题。
这里我想到一个方法,就是通过vmware虚拟机把你主机host上的虚拟设备映射重定向到虚拟机guest内部。
这样就能让你的设备的USB控制器和USB HUB的驱动程序为微软自带的了。
以下是我自己实现的一个USB UVC虚拟摄像头映射到vmware虚拟机内部的演示视屏:
虚拟摄像头通过vmware虚拟机映射到guest系统内部躲避usb设备物理检测
也许有人会说,不用那么麻烦,直接hook真实的USB物理设备,在USB协议层模拟数据收发就行了。
对,这确实是一个更简单更直接的方案。
后面我也会实现一个hook的方案。
相关截图: