USBHound驱动开发笔记
+ -

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

2022-07-29 498 13

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

BOOLEAN isFind = FALSE;
WCHAR PropertyBuffer[64] = { 0 };
ULONG  ResultLength = 0;
status = IoGetDeviceProperty(PhysicalDeviceObject, DevicePropertyHardwareID, sizeof(PropertyBuffer), PropertyBuffer, &ResultLength);
if (status == STATUS_SUCCESS)
{
    KdPrint(("DevicePropertyHardwareID:%S\n", PropertyBuffer));
    if (wcsstr(PropertyBuffer, L"USB\\VID_1908&PID_2070&REV_0100") != NULL)
    {
        isFind = TRUE;
    }
}

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

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

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

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

NTSTATUS UrbFunctionControlTransfer(PDEVICE_OBJECT DeviceObject, PURB Urb)
{
    PFILTER_DEVICE_EXTENSION DeviceExtension = (PFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
    PUCHAR buffer = GetTransferBuffer(Urb->UrbControlTransfer);
    ULONG nLength = GetTransferLength(Urb->UrbControlTransfer);

    UNREFERENCED_PARAMETER(DeviceExtension);
    UNREFERENCED_PARAMETER(buffer);
    UNREFERENCED_PARAMETER(nLength);
    KdPrint(("DeviceObject:%p\n", DeviceObject));
    KdPrint(("DeviceExtension:%p\n", DeviceExtension));


    KdPrint(("UrbFunctionControlTransfer:\n"));
    DumpUsbCtrlCmd(Urb->UrbControlTransfer.SetupPacket, sizeof(Urb->UrbControlTransfer.SetupPacket));

    if (Urb->UrbControlTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN)
    {
        KdPrint(("IN:"));
    }
    else
    {
        KdPrint(("OUT:"));
    }

    if (Urb->UrbControlTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK)
    {
        DumpHex(buffer, nLength);
    }
    else
    {
        KdPrint(("USTS %08x\n", Urb->UrbControlTransfer.Hdr.Status));
    }
    return STATUS_SUCCESS;
}

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


Urb=FFFFB580151E77E0,urb2=FFFFB580151E77E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 00 01 00 00 12 00 
IN:12 01 10 01 00 00 00 40 08 19 70 20 00 01 01 02 
03 01 

Urb=FFFFB580151E77E0,urb2=FFFFB580151E77E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 00 02 00 00 09 00 
IN:09 02 6E 00 02 01 00 80 C8 

Urb=FFFFB580151E77E0,urb2=FFFFB580151E77E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 00 02 00 00 6E 00 
IN:09 02 6E 00 02 01 00 80 C8 09 04 00 00 00 01 01 
00 00 09 24 01 00 01 28 00 01 01 0C 24 02 01 01 
01 00 02 03 00 00 00 0A 24 06 02 01 01 03 00 00 
00 09 24 03 03 01 03 00 02 00 09 04 01 00 00 01 
02 00 00 09 04 01 01 01 01 02 00 00 07 24 01 01 
01 01 00 0B 24 02 01 02 02 10 01 80 BB 00 09 05 
02 09 C0 00 01 00 00 07 25 01 01 01 01 00 

Urb=FFFFB58015272910,urb2=FFFFB58015272910
Urb->UrbHeader.Function=0



Urb=FFFFB5801581D310,urb2=FFFFB5801581D310
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 02 03 09 04 04 00 
IN:1C 03 55 00 

Urb=FFFFB5801581D310,urb2=FFFFB5801581D310
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 02 03 09 04 1C 00 
IN:1C 03 55 00 53 00 42 00 32 00 2E 00 30 00 20 00 
44 00 65 00 76 00 69 00 63 00 65 00 

580151BFBB0
UsbSleepStudy_DeviceD0Entry: Exit Handle 0XFFFFB580151BFBB0
Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 02 03 09 04 04 00 
IN:1C 03 55 00 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 80 06 02 03 09 04 1C 00 
IN:1C 03 55 00 53 00 42 00 32 00 2E 00 30 00 20 00 
44 00 65 00 76 00 69 00 63 00 65 00 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: A1 81 00 01 00 02 01 00 
IN:00 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: A1 81 00 02 00 02 02 00 
IN:78 80 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: A1 82 00 02 00 02 02 00 
IN:00 80 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: A1 83 00 02 00 02 02 00 
IN:FF 80 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: A1 84 00 02 00 02 02 00 
IN:01 00 

Urb=FFFFB580155F4710,urb2=FFFFB580155F4710
Urb->UrbHeader.Function=1
UrbFunctionSelectInterface:
     InterfaceNumber:01
     AlternateSetting:00
     Class:01
     NumberOfPipes:00

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 21 01 00 01 00 02 01 00 
OUT:00 

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 21 01 00 02 00 02 02 00 
OUT:6E 80 

Urb=FFFFB580148A1C00,urb2=FFFFB580148A1C00
Urb->UrbHeader.Function=1
UrbFunctionSelectInterface:
     InterfaceNumber:01
     AlternateSetting:01
     Class:01
     NumberOfPipes:01

Urb=FFFFB58014F00880,urb2=FFFFB58014F00880
Urb->UrbHeader.Function=8
DeviceObject:FFFFB5801529B270
DeviceExtension:FFFFB5801529B3C0
UrbFunctionControlTransfer:
CTL: 22 01 00 01 02 00 03 00 
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的分析了。本人今天......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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