USBHound驱动开发笔记
+ -

USBHound开发调试笔记-数据的过滤打印

2022-07-28 398 0

上周说要搞一个和BUSHOUND一样的USB数据抓包工具USBHOUND,专门来抓USB的数据。
说干就干,就开始写代码,一个简易的工程就如下:
USBHOUND

通过注册表,将该驱动通过注册表安装到系统中。
最开始的时候,是和BUSHOUND一样,弄成了上层过滤驱动:

HKLM, System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}, UpperFilters, 0x00010008, USBHound ; usb

不过好像不知道什么原因,没有进入IRP_MJ_INTERNAL_DEVICE_CONTROL中。就自己想着先弄成下层过滤驱动,先调试再说:

HKLM, System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}, Lowerjb Filters, 0x00010008, USBHound ; usb

然后自己就在其对应的派遣函数中代码如下:

    if (commonData->Type == DEVICE_TYPE_FIDO)
    {
        if (irpStack->MajorFunction == IRP_MJ_INTERNAL_DEVICE_CONTROL
            && irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_SUBMIT_URB)
        {
            PURB urb = irpStack->Parameters.Others.Argument1;
            if (urb != NULL)
            {
                return UsbUrbFilter(DeviceObject, Irp);
            }
        }
        return FilterPassNextDevice(DeviceObject, Irp);
    }

而在UsbUrbFilter中,对IRP设置完成例程,在完成例程中根据URB的Urb->UrbHeader.Function来解析不同的USB请求。
为了只是看一些数据,就草草写了一部分代码来调试

  switch (Urb->UrbHeader.Function)
        {

            case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
            case URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE:
            {
                UrbFunctionGetDescriptor(DeviceObject,Urb);
                break;
            }
            case URB_FUNCTION_CLASS_INTERFACE:
            {
                UrbFunctionClassInterface(DeviceObject, Urb);
                break;
            }
            case URB_FUNCTION_SELECT_INTERFACE:
            {
                UrbFunctionSelectInterface(DeviceObject, Urb);
                break;
            }
            case URB_FUNCTION_CONTROL_TRANSFER:
            {
                UrbFunctionControlTransfer(DeviceObject, Urb);
                break;
            }
             case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
            {
                UrbFunctionBulkOrInterruptTransfer(DeviceObject, Urb);
                break;
            }
            case URB_FUNCTION_ISOCH_TRANSFER:
            {
                UrbFunctionISOTransfer(DeviceObject, Urb);
                break;
            }
            default:
            {
                break;
            }
        }     
    }

可竟然没有想到,URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE和URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE竟然没有调用,这和我平时做的USB虚拟设备有些不一样阿,这些请求全部到了URB_FUNCTION_CONTROL_TRANSFER中去了。
通过DMP其URB_FUNCTION_CONTROL_TRANSFER的数据,确实有相关的请求。

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"));

    DumpHex(buffer, nLength);

    return STATUS_SUCCESS;
}

通过windbg的输出如下:

Urb=FFFFC30B384132E0,urb2=FFFFC30B384132E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFC30B335D8BA0
DeviceExtension:FFFFC30B335D8CF0
UrbFunctionControlTransfer:
12 01 00 02 00 00 00 08 EF 17 8D 60 00 01 01 02 
00 01 
Breakpoint 0 hit
USBHound!UrbFunctionControlTransfer+0xc3:
fffff800`913b16a3 33c0            xor     eax,eax
0: kd> g

Urb=FFFFC30B384132E0,urb2=FFFFC30B384132E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFC30B335D8BA0
DeviceExtension:FFFFC30B335D8CF0
UrbFunctionControlTransfer:
09 02 22 00 01 01 00 A0 32 

Urb=FFFFC30B384132E0,urb2=FFFFC30B384132E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFC30B335D8BA0
DeviceExtension:FFFFC30B335D8CF0
UrbFunctionControlTransfer:
09 02 22 00 01 01 00 A0 32 09 04 00 00 01 03 01 
02 00 09 21 11 01 00 01 22 2E 00 07 05 81 03 04 
00 0A 

Urb=FFFFC30B352621D0,urb2=FFFFC30B352621D0
Urb->UrbHeader.Function=32

Urb=FFFFC30B384132E0,urb2=FFFFC30B384132E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFC30B335D8BA0
DeviceExtension:FFFFC30B335D8CF0
UrbFunctionControlTransfer:

Urb=FFFFC30B384132E0,urb2=FFFFC30B384132E0
Urb->UrbHeader.Function=8
DeviceObject:FFFFC30B335D8BA0
DeviceExtension:FFFFC30B335D8CF0
UrbFunctionControlTransfer:
05 01 09 02 A1 01 09 01 A1 00 05 09 19 01 29 03 
15 00 25 01 95 08 75 01 81 02 05 01 09 30 09 31 
09 38 15 81 25 7F 75 08 95 03 81 06 C0 C0

当然,对于电脑中的鼠标和键盘消息也可以通过UrbFunctionBulkOrInterruptTransfer来打印出来。不过好像当前的设备都是HUB了。
设备栈如下:

2: kd> !devstack DeviceObject:FFFFC30B335D8BA0
  !DevObj           !DrvObj            !DevExt           ObjectName
  ffffc30b323f3290  \Driver\USBHUB3    ffffc30b322e9310  
> ffffc30b335d8ba0  \Driver\USBHound   ffffc30b335d8cf0  
  ffffc30b322e6040  \Driver\ACPI       ffffc30ae4296bd0  
  ffffc30b316f0650  \Driver\USBXHCI    ffffc30b31739a90  USBPDO-0
!DevNode ffffc30b335cb920 :
  DeviceInst is "USB\ROOT_HUB30\4&31789dfb&0&0"
  ServiceName is "USBHUB3"

鼠标的输入报告:

Urb=FFFFC30B34D4A8D0,urb2=FFFFC30B34D4A8D0
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 FD 00 

Urb=FFFFC30B34D3F8D0,urb2=FFFFC30B34D3F8D0
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 F2 00 

Urb=FFFFC30B34D4A8D0,urb2=FFFFC30B34D4A8D0
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 FD EF 00 

Urb=FFFFC30B34D3F8D0,urb2=FFFFC30B34D3F8D0
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 FE F8 00

键盘的输入内容:

Urb=FFFFC30B35247690,urb2=FFFFC30B35247690
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 04 00 00 00 00 00 

Urb=FFFFC30B35247690,urb2=FFFFC30B35247690
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 04 00 00 00 00 00 

Urb=FFFFC30B35744780,urb2=FFFFC30B35744780
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 00 00 00 00 00 00 

Urb=FFFFC30B35744780,urb2=FFFFC30B35744780
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 00 00 00 00 00 00 

Urb=FFFFC30B34DAA0E0,urb2=FFFFC30B34DAA0E0
Urb->UrbHeader.Function=9
UrbFunctionBulkOrInterruptTransfer:
00 00 05 00 00 00 00 00

可以看到,都是标准的键鼠HID输入报告数据格式,至于为什么抓的信息和自己理解的不一致。我还不太清楚,还得研究一下。

最后附一张我们的驱动截图:
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 篇笔记 写笔记

BusHound的使用方法详解
在开始菜单日运行Bus Hound软件,将USB设备插入电脑U口。如图所示,进入”Devices”目录,在”Devices”内选择要监听的设备。例如:我的设备置是一个U盘,则装置为USB大容量储存设备,点选”USB大容量储存设备”图示,可以在下面的”Properties”图框内看到设备的设备树及设备......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
关于UVC摄像头指示灯的调试过程总结
最近遇到了一个很是奇怪的UVC摄像头指示灯问题,现象如下:上层应用是一个会议系统软件,当需要进行会议时,点击会议按钮添加会议。这时应用软件打开摄像头,并开始与服务器进行网络连接。当然由于摄像头的打开,摄像头指示灯点亮。上层应用软件与服务器连接后,进行会议界面。这时突然摄像头指示灯熄灭,但会议正常,摄......
BusHound简介及安装
BusHound简介BusHound软件是由美国perisoft公司研制的一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名“hound”的中文意思为“猎犬”,即指其能敏锐地感知到总线的丝毫变化。Bus Hound是一个超级软件总线协议分析器,用于捕捉来自设备的协议包和输入输出操作,其优......
BusHound设备窗口
使用BusHound进行数据抓包,抓包的目标为设备。BusHound提供了一个类似设备管理器的窗口,以树形的方式显示。设备树主要包括SCSI设备树和Usb设备树。设备IDBusHound为每个显示在设备窗口中的设备树分配一个ID,这个ID在设备窗口树列表中,设备名前中括号中的数字为设备ID.点击设备......
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在本站中搜......
USBCCGP 总线过滤驱动接口
总线驱动或过滤驱动的接口其实就是一个USBC_DEVICE_CONFIGURATION_INTERFACE_V1的结构体,其用于创建PDO.#define USBC_DEVICE_CONFIGURATION_INTERFACE_VERSION_1 0x0001typedef s......
手动分析使用BUSHOUND抓取同步传输的URB
BUSHOUND大家太熟了,使用它来进行数据抓包那不太太方便。但在BUSHOUND的抓取配置项中,有一个叫了URB的东西,我相信大家都没有选中过,因为一般来说,对WINDOWS USB驱动开发人员来说都不一定有用,更何况大家也只是用来抓取一下几个数据的输入输出,更没有必要进行USB的分析了。本人今天......
使用BUSHOUND手动分析USB控制传输的URB
USB的控制传输是最基本的传输类型,控制传输适用于设备的枚举和设备的状态控制。我里我们使用BUSHOUND来抓取USB控制传输的URB。同样的,我们使用的操作系统是Windows10 x64,和同步传输的URB抓包一样,我们先抓取数据,然后再分析数据结构。这里我插入电脑的U盘的枚举以获取设备描述符为......
使用BUSHOUND手动分析USB批量传输的URB
使用BUSHOUND抓取U盘的批量传输的URB数据,我们对其其进行数据分析:13 IN 55 53 42 53 40 0b ac 57 00 00 00 00 00 URB80 00 09 00 00 00 00 00 d8 f2 75 a0 77 7f 00 00 ......
USB设备抓包工具BusHound的Windows驱动抓包
BusHound可以抓包的设备类型有硬盘、1394火线和USB设备数据,并且抓到的数据并非是各总线上的,而是经过各总线传递到Windows内核的内核数据。BusHound采用的是Windows过滤驱动的方式进行抓包的,并且可以区分各总线上相关的数据协议,如USB的输入输出事务,同步传输,CTRL请求......
Bus Hound version 7
Bus Hound version 7是Windows下的抓包工具。免费下载地址:https://www.perisoft.net/cgi-bin/bhfree.cgi官方网址:https://www.perisoft.net/bushound/index.htm视频教程:https://spac......
BusHound抓包的USTS数据内容来源介绍
在Windows操作系统下开发USB设备驱动程序,或者分析USB设备固件通讯的时候,难免遇到一个错误信息,其中一项重要的数据条目就是USTS的显示。如:Device Phase Data Description Cmd.Phase.......
STM32发送数据与接收到的数据长度不一致问题
群里一位同发提了一个问题,自己弄了一个USB HID游戏控制器,一次发送了7字节,不过通过BUSHOUND抓到只有5字节。还贴上了图。各位,请问一下我做的一个USBHID游戏控制器,一次发送的是7位数据,为什么BusHound上只接收到五位?由于没有显示长度,所以刚开始我还以为是BUSHOU......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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