Wireshark USB痕迹说明


10

我正在尝试对USB(HID)设备进行逆向工程,但无法真正弄清我在Wireshark(Linux或Windows上的Usbmon + Wireshark)上看到的与USB协议之间的关系吗?我从www.usb.org看过USB协议。

Wireshark显示了什么?

1)每包一行?(令牌,数据,握手)

2)每笔交易一行?(令牌+ [数据] +握手)(我的猜测)

3)每次控制传输一行?

事务的方向(到/从字段)也很奇怪。至少,它不符合我的期望:-) ...枚举,隐藏报告等的数据部分似乎有时与设置数据(8字节)一起显示,有时却不显示...我不知道我真的不知道URB是什么...据我所知,在usb协议中没有提及...在我看来,wireshark / usbmon在更高的堆栈级别上进行跟踪并试图推断出什么从那...

下面提供了一个我可以看到的示例,我们在这里看到了什么?

a)我什至无法在规格中找到bmtype = 0x20(设置编号为599)。

b)因为我有一个HID设备,所以我认为这可能是一个报告/功能配置(此阶段已通过枚举)。所以我可以同意这个方向(主机->设备)。但是数据在哪里?还是这里没有数据阶段?那么600帧是什么?

c)600框架是什么?数据?

d)601是什么?状态ACK?...但是数据和ACK具有相同的来源?

No.     Time        Source                Destination           Protocol Length Info
    599 67.996889   host                  2.0                   USB      36     URB_CONTROL out

Frame 599: 36 bytes on wire (288 bits), 36 bytes captured (288 bits)
USB URB
    USBPcap pseudoheader length: 28
    IRP ID: 0xfffffa800a1e2610
    IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
    URB Function: URB_FUNCTION_CLASS_DEVICE (0x001a)
    IRP information: 0x00, Direction: FDO -> PDO
    URB bus id: 1
    Device address: 2
    Endpoint: 0x00, Direction: OUT
    URB transfer type: URB_CONTROL (0x02)
    Packet Data Length: 8
    Control transfer stage: Setup (0)
    [Response in: 601]
    [bInterfaceClass: Unknown (0xffff)]
URB setup
    bmRequestType: 0x20
        0... .... = Direction: Host-to-device
        .01. .... = Type: Class (0x01)
        ...0 0000 = Recipient: Device (0x00)
    bRequest: 0
    wValue: 0x0000
    wIndex: 0
    wLength: 16

0000  1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 1a 00   ...&............
0010  00 01 00 02 00 00 02 08 00 00 00 00 20 00 00 00   ............ ...
0020  00 00 10 00                                       ....

No.     Time        Source                Destination           Protocol Length Info
    600 67.997889   2.0                   host                  USB      44     URB_CONTROL out

Frame 600: 44 bytes on wire (352 bits), 44 bytes captured (352 bits)
USB URB
    USBPcap pseudoheader length: 28
    IRP ID: 0xfffffa800a1e2610
    IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
    URB Function: URB_FUNCTION_CONTROL_TRANSFER (0x0008)
    IRP information: 0x01, Direction: PDO -> FDO
    URB bus id: 1
    Device address: 2
    Endpoint: 0x00, Direction: OUT
    URB transfer type: URB_CONTROL (0x02)
    Packet Data Length: 16
    Control transfer stage: Data (1)
    [Request in: 599]
    [Time from request: 0.001000000 seconds]
    [bInterfaceClass: Unknown (0xffff)]
CONTROL response data

0000  1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 08 00   ...&............
0010  01 01 00 02 00 00 02 10 00 00 00 01 05 04 0d 56   ...............V
0020  fb 82 c0 1d 10 18 cc 02 00 00 00 01               ............

No.     Time        Source                Destination           Protocol Length Info
    601 67.997889   2.0                   host                  USB      28     GET STATUS Status

Frame 601: 28 bytes on wire (224 bits), 28 bytes captured (224 bits)
USB URB
    USBPcap pseudoheader length: 28
    IRP ID: 0xfffffa800a1e2610
    IRP USBD_STATUS: USBD_STATUS_SUCCESS (0x00000000)
    URB Function: URB_FUNCTION_CONTROL_TRANSFER (0x0008)
    IRP information: 0x01, Direction: PDO -> FDO
    URB bus id: 1
    Device address: 2
    Endpoint: 0x00, Direction: OUT
    URB transfer type: URB_CONTROL (0x02)
    Packet Data Length: 0
    Control transfer stage: Status (2)
    [Request in: 599]
    [Time from request: 0.001000000 seconds]

0000  1c 00 10 26 1e 0a 80 fa ff ff 00 00 00 00 08 00   ...&............
0010  01 01 00 02 00 00 02 00 00 00 00 02               ............

显然我缺少了一些东西。关于wireshark显示与协议以及(基于该协议)协议之间关系的一般说明,欢迎您!

我最初将此内容发布在Stack Overflow上,但被告知这不是直接的编程问题。希望它适合这里。

Answers:


11

USB URB就像IP数据包,USB端点就像IP端口。USB端点0x00-0x7F位于主机上,端点0x80-0xFF位于设备上(我认为)。因此,端点编码传输的方向。lsusb将向您显示设备支持的端点和传输类型。

我将在引号中使用“数据包”来表示wireshark捕获的活动单位。从字面上看,这些并不是在线发送的内容。例如,即使未通过USB总线传输,“数据包”也将具有开始传输的时间戳。

我认为嗅探USB协议最令人困惑的方面是每个USB URB都有两个Wireshark“数据包”。当主机启动某些传输时,即为URB_SUBMIT(Wireshark显示过滤器usb.urb_type == URB_SUBMIT)。传输完成后,即为URB_COMPLETE(Wireshark显示过滤器usb.urb_type == URB_COMPLETE

据我所知,当从主机到设备进行传输时,SUBMIT“数据包”包含实际传输的USB数据。当从设备到主机进行传输时(通常由主机发起),COMPLETE“数据包”包含实际传输的USB数据。

从分析协议的角度来看,所有其他“数据包”都是干扰或URB错误。为了滤除干扰,我使用以下显示过滤器 !(usb.urb_type == URB_SUBMIT && usb.endpoint_number.direction == IN) && !(usb.urb_type == URB_COMPLETE && usb.endpoint_number.direction == OUT)

我相信USB协议确实涉及一些握手,ACK和重传,但这全部由主机控制器处理,并且不涉及操作系统。例如,我认为OS不会跟踪确认或重新传输。

顺便说一句,我正在使用以下命令来分析协议。除了进行上述过滤外,它仅显示端点号(十进制)和USB数据。这是在使用usbmon1设备进行嗅探的GNU / Linux计算机上,并假设我要监视的USB设备在总线1上,并且具有地址11。

tshark -i usbmon1 -Y "usb.device_address == 11 && !(usb.urb_type == URB_SUBMIT && usb.endpoint_address.direction == IN) && !(usb.urb_type == URB_COMPLETE && usb.endpoint_address.direction == OUT)" -Tfields -e usb.endpoint_address -e usb.capdata


谢谢你的回答,古斯。实际上,这并不能回答我的所有问题,但是您给出了最好的(作为唯一的)答案!您是否介意评论我作为示例包含的捕获(从HID设备获取)。我们看到了什么?跟踪中的哪些字段说明了什么?再次感谢!
user415772 2015年

3

WireShark USB日志在操作系统级别完成。使用Linux,它基于usbmon生成的数据,该数据基于此处描述的Linux内部URB结构。因此,查看内核和WireShark的注释和文档,可以最好地了解其含义。

我从内核文档中发现,数据包是usbmon结构,其后是发送和接收的数据。这是结构(从此处复制):

struct usbmon_packet {
    u64 id;         /*  0: URB ID - from submission to callback */
    unsigned char type; /*  8: Same as text; extensible. */
    unsigned char xfer_type; /*    ISO (0), Intr, Control, Bulk (3) */
    unsigned char epnum;    /*     Endpoint number and transfer direction */
    unsigned char devnum;   /*     Device address */
    u16 busnum;     /* 12: Bus number */
    char flag_setup;    /* 14: Same as text */
    char flag_data;     /* 15: Same as text; Binary zero is OK. */
    s64 ts_sec;     /* 16: gettimeofday */
    s32 ts_usec;        /* 24: gettimeofday */
    int status;     /* 28: */
    unsigned int length;    /* 32: Length of data (submitted or actual) */
    unsigned int len_cap;   /* 36: Delivered length */
    union {         /* 40: */
        unsigned char setup[SETUP_LEN]; /* Only for Control S-type */
        struct iso_rec {        /* Only for ISO */
            int error_count;
            int numdesc;
        } iso;
    } s;
    int interval;       /* 48: Only for Interrupt and ISO */
    int start_frame;    /* 52: For ISO */
    unsigned int xfer_flags; /* 56: copy of URB's transfer_flags */
    unsigned int ndesc; /* 60: Actual number of ISO descriptors */
};
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.