USBHound开发简介-跟我一起写USB抓包工具
2022-07-22
1800
0
USBHound就是USB抓包工具,起的名字来源于BUSHOUND,不过人家实现的是USB、HID、SCSI,1394等总线的抓包工具,而对于我们仅用于实现USB设备(后期可能会增加HID类)。
以前我们讨论过BUSHOUND抓包工具的原理:http://www.usbzh.com/article/detail-1049.html 所以这里我们也使用此相同的原理来实现,即设备类过滤驱动的方式实现数据的抓包。
Windows总线过滤驱动分为上层过滤驱动和下层过滤驱动。
- 上层过滤驱动可通过完成函数获取IRP完成时的数据信息,当然了,我们也可以获取请示下发时的默认参数信息。这其实可以作为一个亮点来做,对比一个URB中下发时和完成时的参数信息。
- 下层过滤驱动一般用的很少,其可以理解为总线驱动程序的上层过滤驱动。
USBHound安装
编译后的驱动文件为:
2022/07/22 11:25 784 USBHound.cer
2022/07/24 05:08 2,508 USBHound.inf
2022/07/22 11:25 47,408 USBHound.sys
当时是开发过程中的版本,故只需要右键INF文件安装即可。
安装后会在注册表中写入如下值:
其中INF文件中的注册表内容如下:
[ClassFilter_AddReg]
HKLM, System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}, UpperFilters, 0x00010008, USBHound ; usb
驱动安装后,这里重启了一下机器后,打开任意一个USB设备,通过设备管理器可以看该设备的驱动程序:
并且我们通过我的内核打印日志显示出了系统中所有USB设备类的相关信息:
其中一项的内容如下:
DevicePropertyDeviceDescription:USB Composite Device
DevicePropertyHardwareID:USB\VID_1A2C&PID_2124&REV_0110
DevicePropertyManufacturer:(Standard USB Host Controller)
而我们的代码如下:
KdPrint(("-------------------------\n"));
status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyDeviceDescription, sizeof(PropertyBuffer), PropertyBuffer, &ResultLength);
if (status == STATUS_SUCCESS)
{
KdPrint(("DevicePropertyDeviceDescription:%S\n", PropertyBuffer));
}
status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyFriendlyName, sizeof(PropertyBuffer), PropertyBuffer, &ResultLength);
if (status == STATUS_SUCCESS)
{
KdPrint(("DevicePropertyFriendlyName:%S\n", PropertyBuffer));
}
status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyHardwareID, sizeof(PropertyBuffer), PropertyBuffer, &ResultLength);
if (status == STATUS_SUCCESS)
{
KdPrint(("DevicePropertyHardwareID:%S\n", PropertyBuffer));
}
status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyManufacturer, sizeof(PropertyBuffer), PropertyBuffer, &ResultLength);
if (status == STATUS_SUCCESS)
{
KdPrint(("DevicePropertyManufacturer:%S\n", PropertyBuffer));
}
这里在调试的时候发现了一个知识点:
- AddDevice会对所有设备来回调,不过我们可以只对感兴趣的设备来创建我们的过滤驱动设备,然后再堆栈。而对于我们不感兴趣的,就直接返回STATUS_SUCCESS就可以了。
- 如果所有设备都不创建设备栈,那系统会有大量的DRIVER_ENTRY和DriverUnload函数。这样会对所有设备安装该类驱动,但是都没有生成栈,故会卸载掉该驱动。
参考资料
- https://blog.csdn.net/weixin_30379973/article/details/98929268
- https://www.cnblogs.com/raymon-tec/p/5058365.html
- https://blog.csdn.net/lixiangminghate/article/details/52081225
- https://blog.csdn.net/lixiangminghate/article/details/52144740
- https://blog.csdn.net/zj510/article/details/8332658
- C:\WinDDK\7600.16385.1\src\setup\infs\clasfilt\ClasFilt.inf
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936