USBHound驱动开发笔记
+ -

自研BUSHOUND工具USBHound开发调试笔记-USB控制传输的数据抓包实现

2022-07-29 778 13

本想着搞一个自研的BUSHOUND应该是一件比较简单的事,但没想到也麻烦了。
搞了一天upperfilter,最终还是投降,换成了lowerfilter.
前面搞的时候,对系统中所有USB设备进行过滤,导致系统中的数据打印太多,无法分清谁是谁。当然也可以分清,每个设备的地址不一样,并且设备栈也是明确的,但如果要对着一大堆的十六进制数,虽然本人看的多也习惯了,但也抗不住啊。
所以,为了化繁为简,本人使用的是一个USB音箱来测试的,只对这个音箱来进行类过滤。过滤的方法也就很简单粗爆,就是通过硬件ID来实现。

  1. BOOLEAN isFind = FALSE;
  2. WCHAR PropertyBuffer[64] = { 0 };
  3. ULONG ResultLength = 0;
  4. status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyHardwareID, sizeof(PropertyBuffer), PropertyBuffer, &ResultLength);
  5. if (status == STATUS_SUCCESS)
  6. {
  7. KdPrint(("DevicePropertyHardwareID:%S\n", PropertyBuffer));
  8. if (wcsstr(PropertyBuffer, L"USB\\VID_1908&PID_2070&REV_0100") != NULL)
  9. {
  10. isFind = TRUE;
  11. }
  12. }

所以最终通过!devstack查看到的设备栈如下:

  1. 1: kd> !devstack FFFFB5801529B270
  2. !DevObj !DrvObj !DevExt ObjectName
  3. ffffb58012950060 \Driver\usbccgp ffffb580129501b0 0000005f
  4. > ffffb5801529b270 \Driver\USBHound ffffb5801529b3c0
  5. ffffb5801530d8e0 \Driver\USBHUB3 ffffb580152d4e70 USBPDO-15

可以看到,我们的设备ffffb5801529b270是usbccgp驱动ffffb58012950060的下层过滤驱动,但又为了HUB创建的ffffb5801530d8e0之上。这样就可以对该设备ffffb58012950060进行数据过滤了。

延用昨天的代码,后面完善了一下UrbFunctionControlTransfer的代码:

  1. NTSTATUS UrbFunctionControlTransfer(PDEVICE_OBJECT DeviceObject, PURB Urb)
  2. {
  3. PFILTER_DEVICE_EXTENSION DeviceExtension = (PFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
  4. PUCHAR buffer = GetTransferBuffer(Urb->UrbControlTransfer);
  5. ULONG nLength = GetTransferLength(Urb->UrbControlTransfer);
  6. UNREFERENCED_PARAMETER(DeviceExtension);
  7. UNREFERENCED_PARAMETER(buffer);
  8. UNREFERENCED_PARAMETER(nLength);
  9. KdPrint(("DeviceObject:%p\n", DeviceObject));
  10. KdPrint(("DeviceExtension:%p\n", DeviceExtension));
  11. KdPrint(("UrbFunctionControlTransfer:\n"));
  12. DumpUsbCtrlCmd(Urb->UrbControlTransfer.SetupPacket, sizeof(Urb->UrbControlTransfer.SetupPacket));
  13. if (Urb->UrbControlTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN)
  14. {
  15. KdPrint(("IN:"));
  16. }
  17. else
  18. {
  19. KdPrint(("OUT:"));
  20. }
  21. if (Urb->UrbControlTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK)
  22. {
  23. DumpHex(buffer, nLength);
  24. }
  25. else
  26. {
  27. KdPrint(("USTS %08x\n", Urb->UrbControlTransfer.Hdr.Status));
  28. }
  29. return STATUS_SUCCESS;
  30. }

插入设备之后,通过windbg打印出的数据信息如下:

  1. Urb=FFFFB580151E77E0,urb2=FFFFB580151E77E0
  2. Urb->UrbHeader.Function=8
  3. DeviceObject:FFFFB5801529B270
  4. DeviceExtension:FFFFB5801529B3C0
  5. UrbFunctionControlTransfer:
  6. CTL: 80 06 00 01 00 00 12 00
  7. IN:12 01 10 01 00 00 00 40 08 19 70 20 00 01 01 02
  8. 03 01
  9. Urb=FFFFB580151E77E0,urb2=FFFFB580151E77E0
  10. Urb->UrbHeader.Function=8
  11. DeviceObject:FFFFB5801529B270
  12. DeviceExtension:FFFFB5801529B3C0
  13. UrbFunctionControlTransfer:
  14. CTL: 80 06 00 02 00 00 09 00
  15. IN:09 02 6E 00 02 01 00 80 C8
  16. Urb=FFFFB580151E77E0,urb2=FFFFB580151E77E0
  17. Urb->UrbHeader.Function=8
  18. DeviceObject:FFFFB5801529B270
  19. DeviceExtension:FFFFB5801529B3C0
  20. UrbFunctionControlTransfer:
  21. CTL: 80 06 00 02 00 00 6E 00
  22. IN:09 02 6E 00 02 01 00 80 C8 09 04 00 00 00 01 01
  23. 00 00 09 24 01 00 01 28 00 01 01 0C 24 02 01 01
  24. 01 00 02 03 00 00 00 0A 24 06 02 01 01 03 00 00
  25. 00 09 24 03 03 01 03 00 02 00 09 04 01 00 00 01
  26. 02 00 00 09 04 01 01 01 01 02 00 00 07 24 01 01
  27. 01 01 00 0B 24 02 01 02 02 10 01 80 BB 00 09 05
  28. 02 09 C0 00 01 00 00 07 25 01 01 01 01 00
  29. Urb=FFFFB58015272910,urb2=FFFFB58015272910
  30. Urb->UrbHeader.Function=0
  31. Urb=FFFFB5801581D310,urb2=FFFFB5801581D310
  32. Urb->UrbHeader.Function=8
  33. DeviceObject:FFFFB5801529B270
  34. DeviceExtension:FFFFB5801529B3C0
  35. UrbFunctionControlTransfer:
  36. CTL: 80 06 02 03 09 04 04 00
  37. IN:1C 03 55 00
  38. Urb=FFFFB5801581D310,urb2=FFFFB5801581D310
  39. Urb->UrbHeader.Function=8
  40. DeviceObject:FFFFB5801529B270
  41. DeviceExtension:FFFFB5801529B3C0
  42. UrbFunctionControlTransfer:
  43. CTL: 80 06 02 03 09 04 1C 00
  44. IN:1C 03 55 00 53 00 42 00 32 00 2E 00 30 00 20 00
  45. 44 00 65 00 76 00 69 00 63 00 65 00
  46. 580151BFBB0
  47. UsbSleepStudy_DeviceD0Entry: Exit Handle 0XFFFFB580151BFBB0
  48. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  49. Urb->UrbHeader.Function=8
  50. DeviceObject:FFFFB5801529B270
  51. DeviceExtension:FFFFB5801529B3C0
  52. UrbFunctionControlTransfer:
  53. CTL: 80 06 02 03 09 04 04 00
  54. IN:1C 03 55 00
  55. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  56. Urb->UrbHeader.Function=8
  57. DeviceObject:FFFFB5801529B270
  58. DeviceExtension:FFFFB5801529B3C0
  59. UrbFunctionControlTransfer:
  60. CTL: 80 06 02 03 09 04 1C 00
  61. IN:1C 03 55 00 53 00 42 00 32 00 2E 00 30 00 20 00
  62. 44 00 65 00 76 00 69 00 63 00 65 00
  63. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  64. Urb->UrbHeader.Function=8
  65. DeviceObject:FFFFB5801529B270
  66. DeviceExtension:FFFFB5801529B3C0
  67. UrbFunctionControlTransfer:
  68. CTL: A1 81 00 01 00 02 01 00
  69. IN:00
  70. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  71. Urb->UrbHeader.Function=8
  72. DeviceObject:FFFFB5801529B270
  73. DeviceExtension:FFFFB5801529B3C0
  74. UrbFunctionControlTransfer:
  75. CTL: A1 81 00 02 00 02 02 00
  76. IN:78 80
  77. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  78. Urb->UrbHeader.Function=8
  79. DeviceObject:FFFFB5801529B270
  80. DeviceExtension:FFFFB5801529B3C0
  81. UrbFunctionControlTransfer:
  82. CTL: A1 82 00 02 00 02 02 00
  83. IN:00 80
  84. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  85. Urb->UrbHeader.Function=8
  86. DeviceObject:FFFFB5801529B270
  87. DeviceExtension:FFFFB5801529B3C0
  88. UrbFunctionControlTransfer:
  89. CTL: A1 83 00 02 00 02 02 00
  90. IN:FF 80
  91. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  92. Urb->UrbHeader.Function=8
  93. DeviceObject:FFFFB5801529B270
  94. DeviceExtension:FFFFB5801529B3C0
  95. UrbFunctionControlTransfer:
  96. CTL: A1 84 00 02 00 02 02 00
  97. IN:01 00
  98. Urb=FFFFB580155F4710,urb2=FFFFB580155F4710
  99. Urb->UrbHeader.Function=1
  100. UrbFunctionSelectInterface:
  101. InterfaceNumber:01
  102. AlternateSetting:00
  103. Class:01
  104. NumberOfPipes:00
  105. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  106. Urb->UrbHeader.Function=8
  107. DeviceObject:FFFFB5801529B270
  108. DeviceExtension:FFFFB5801529B3C0
  109. UrbFunctionControlTransfer:
  110. CTL: 21 01 00 01 00 02 01 00
  111. OUT:00
  112. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  113. Urb->UrbHeader.Function=8
  114. DeviceObject:FFFFB5801529B270
  115. DeviceExtension:FFFFB5801529B3C0
  116. UrbFunctionControlTransfer:
  117. CTL: 21 01 00 02 00 02 02 00
  118. OUT:6E 80
  119. Urb=FFFFB580148A1C00,urb2=FFFFB580148A1C00
  120. Urb->UrbHeader.Function=1
  121. UrbFunctionSelectInterface:
  122. InterfaceNumber:01
  123. AlternateSetting:01
  124. Class:01
  125. NumberOfPipes:01
  126. Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
  127. Urb->UrbHeader.Function=8
  128. DeviceObject:FFFFB5801529B270
  129. DeviceExtension:FFFFB5801529B3C0
  130. UrbFunctionControlTransfer:
  131. CTL: 22 01 00 01 02 00 03 00
  132. OUT:80 BB 00

这个数据的显示竟然和BUSHOUND抓到的包一致(不一致就怪了),那就兴奋一下,可以过一个美好的周末了。

BUSHOUND抓包

不过话说回来,今年的进展确实够慢。不过技术就是个探索的过程。
本人大概研究了一下BUSHOUND的原理,不过没有研究明白,他是类过滤驱动但是没有对设备进行类驱动栈的增加,系统只也只有一个控制设备。而我的就不样了。

  • BUSHOUND设备栈
    BUSHOUND设备栈

  • USBHound设备栈
    USBHound设备栈

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB音箱 工作抓包分析
USB音响打开Length Phase Data -------- ----- ------------------------------ -------------- CTL ......
UVC摄像头的关闭流程及抓包分析
通过UVC协议规范可以知道,UVC的数据传输支持USB四种传输中的批量传输和同步传输,所以对于UVC摄像头,当我们在摄像头正在工作时,需要停止摄像头工作,执行的操作是不同的。在Linux的源代码中,摄像头的流关闭是由函数uvc_video_stop_streaming完成的。代码比较简单,我们直接给......
ubuntu下使用usbmon进行usb抓包
开发或者调试USB设备相关的工具或者驱动,一个调试的利器就是usbmon抓包。 在ubuntu下使用步骤如下:1 运行命令 sudo mount -t debugfs none /sys/kernel/debug ,如果提示已经挂载,则下次抓包就可以不运行这个命令了。表示系统默认会挂载。 2 ......
华为UAC麦克风的工作过程数据分析
看完了耳机的数据分析,再来分析麦克风,就相对来说很简单了,这是因为:第一:麦克风没有音频控制特效单元描述符,所以少了很多特定类请求。第二:麦克风只有一个音频流转换接口,且只支持采样率为48000HZ 16位。具体的过程见下:Length Phase Data-------- --......
BusHound的使用方法详解
在开始菜单日运行Bus Hound软件,将USB设备插入电脑U口。如图所示,进入”Devices”目录,在”Devices”内选择要监听的设备。例如:我的设备置是一个U盘,则装置为USB大容量储存设备,点选”USB大容量储存设备”图示,可以在下面的”Properties”图框内看到设备的设备树及设备......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
Windows下使用Wireshark分析USB通信
USB技术的应用越来越广泛,我们常用的U盘、鼠标、键盘都是USB设备。我们有时也会遇见要对这种设备进行调试的情形,但是很少有人知道其实Wireshark也是可以胜任这一任务的。Wireshark可以像处理网络中的通信一样来捕获和解析USB设备的通信。Wireshark2.0之后就加入了对USB协议的......
关于UVC摄像头指示灯的调试过程总结
最近遇到了一个很是奇怪的UVC摄像头指示灯问题,现象如下:上层应用是一个会议系统软件,当需要进行会议时,点击会议按钮添加会议。这时应用软件打开摄像头,并开始与服务器进行网络连接。当然由于摄像头的打开,摄像头指示灯点亮。上层应用软件与服务器连接后,进行会议界面。这时突然摄像头指示灯熄灭,但会议正常,摄......
UVC摄像头打开关闭数据分析
UVC相机在打开时,会使用SET_INTERFACE命令,在停止播放时,也会发送SET_INTERFACE命令。打开时,数据抓包为:CTL 01 0b 01 00 01 00 00 00 SET INTERFACE停播放时,数据抓包为:CTL 01 0b 00 00 01......
BusHound简介及安装
BusHound简介BusHound软件是由美国perisoft公司研制的一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名“hound”的中文意思为“猎犬”,即指其能敏锐地感知到总线的丝毫变化。Bus Hound是一个超级软件总线协议分析器,用于捕捉来自设备的协议包和输入输出操作,其优......
BusHound设备窗口
使用BusHound进行数据抓包抓包的目标为设备。BusHound提供了一个类似设备管理器的窗口,以树形的方式显示。设备树主要包括SCSI设备树和Usb设备树。设备IDBusHound为每个显示在设备窗口中的设备树分配一个ID,这个ID在设备窗口树列表中,设备名前中括号中的数字为设备ID.点击设备......
Linux源码分析UVC摄像头的打开流程及抓包分析
和关闭摄像头类似,Linux使用uvc_video_start_streaming函数打开摄像头int uvc_video_start_streaming(struct uvc_streaming *stream){ int ret; ret = uvc_video_clock_init......
UVC 描述符实例
通过BUSBOUND抓取USB摄像头插入电脑时的数据信息,这里只是选报设备描述符和接口描述符信息Device Phase Data Description Cmd.Phase.Ofs(rep)------ ----- ----------......
BUSHOUND抓包stall pid的USTS c0000004错误
对USB设备进行数据分析,使用最多的也就是BUSHOUND了,不过经常遇到一个问题就是 USTS c0000004 stall pid 错误。USTS c0000004 stall pid在本站中搜......
手动分析使用BUSHOUND抓取同步传输的URB
BUSHOUND大家太熟了,使用它来进行数据抓包那不太太方便。但在BUSHOUND的抓取配置项中,有一个叫了URB的东西,我相信大家都没有选中过,因为一般来说,对WINDOWS USB驱动开发人员来说都不一定有用,更何况大家也只是用来抓取一下几个数据的输入输出,更没有必要进行USB的分析了。本人今天......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

    打开支付宝扫一扫,即可进行扫码打赏哦

    您的支持,是我们前进的动力!