giải thích dấu vết usb wireshark


10

Tôi đang cố gắng thiết kế lại một thiết bị usb (HID) và thực sự không thể hiểu được những gì tôi thấy trên wireshark (usbmon + wireshark trên linux hoặc windows) liên quan đến giao thức usb?. Tôi đã xem giao thức usb từ www.usb.org.

Wireshark thể hiện điều gì?

1) Một dòng trên mỗi gói? (mã thông báo, dữ liệu, bắt tay)

2) Một dòng trên mỗi giao dịch? (mã thông báo + [dữ liệu] + bắt tay) (phỏng đoán của tôi)

3) Một dòng trên mỗi lần kiểm soát chuyển?

Hướng của giao dịch cũng rất lạ (đến / từ các trường). Ít nhất, nó không phù hợp với mong đợi của tôi :-) ... Và phần dữ liệu của bảng liệt kê, ẩn báo cáo, v.v ... đôi khi dường như được hiển thị với dữ liệu thiết lập (8 byte) và đôi khi không ... tôi không Tôi thực sự không biết URB là gì ... không có gì đề cập đến trong giao thức usb như tôi có thể thấy ... Tôi thấy rằng dấu vết của wireshark / usbmon ở cấp độ ngăn xếp cao hơn và cố gắng suy luận xem điều gì sẽ xảy ra trên dây từ đó ...

Một ví dụ về những gì tôi có thể thấy được đưa ra dưới đây, những gì chúng ta thấy ở đây?.

a) Tôi thậm chí không thể tìm thấy bmtype = 0x20 (của thiết lập, khung No = 599) trong thông số kỹ thuật.

b) Vì tôi có thiết bị HID, tôi cho rằng đây có thể là cấu hình báo cáo / tính năng (bảng liệt kê được thông qua ở giai đoạn này). Vì vậy, tôi có thể đồng ý với hướng (máy chủ-> thiết bị). nhưng dữ liệu ở đâu? Hoặc không có giai đoạn dữ liệu ở đây? Khung 600 là gì?

c) khung 600 là gì? dữ liệu?

d) khung 601 là gì? trạng thái ACK? ... nhưng sau đó dữ liệu và ACK có cùng một nguồn không?

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               ............

Rõ ràng là tôi đang thiếu một cái gì đó. Một lời giải thích chung về cách hiển thị của wireshark liên quan đến giao thức và, (dựa trên nó), ý nghĩa của dấu vết trên được hoan nghênh!

Tôi đã đăng bài này lên Stack Overflow, nhưng được cho biết đây không phải là câu hỏi lập trình trực tiếp. Hy vọng nó phù hợp hơn ở đây.

Câu trả lời:


11

USB URB giống như một gói IP và điểm cuối USB giống như một cổng IP. Điểm cuối USB 0x00-0x7F nằm trên máy chủ và điểm cuối 0x80-0xFF nằm trên thiết bị (tôi nghĩ). Do đó, điểm cuối mã hóa hướng chuyển. lsusbsẽ cho bạn biết điểm cuối nào và loại chuyển giao nào mà thiết bị hỗ trợ.

Tôi sẽ sử dụng "gói" trong dấu ngoặc kép để chỉ đơn vị hoạt động mà wireshark nắm bắt. Đây không phải là những gì đang được gửi trên dây. Ví dụ: "gói" sẽ có dấu thời gian khi chuyển được bắt đầu, mặc dù điều này không được truyền qua bus USB.

Tôi nghĩ rằng khía cạnh khó hiểu nhất của việc đánh hơi giao thức USB là bạn thấy hai "gói" Wireshark cho mỗi USB URB. Khi máy chủ bắt đầu một số chuyển, đó là URB_SUBMIT(bộ lọc hiển thị Wireshark usb.urb_type == URB_SUBMIT). Khi quá trình truyền hoàn tất, đó là URB_COMPLETE(bộ lọc hiển thị của Wireshark usb.urb_type == URB_COMPLETE)

Từ những gì tôi có thể nói, khi có sự chuyển từ máy chủ sang thiết bị, SUBMIT"gói" chứa dữ liệu USB thực tế được truyền. Khi có sự chuyển từ thiết bị sang máy chủ (do máy chủ khởi tạo, như mọi khi), COMPLETE"gói" chứa dữ liệu USB thực tế được truyền.

Từ quan điểm phân tích một giao thức, tất cả các "gói" khác là một sự phân tâm HOẶC một lỗi URB. Để lọc các phiền nhiễu, tôi sử dụng bộ lọc hiển thị sau !(usb.urb_type == URB_SUBMIT && usb.endpoint_number.direction == IN) && !(usb.urb_type == URB_COMPLETE && usb.endpoint_number.direction == OUT)

Tôi tin rằng giao thức USB liên quan đến một số bắt tay và ACK và truyền lại, nhưng tất cả điều này được xử lý bởi bộ điều khiển máy chủ và HĐH không liên quan. Tôi không nghĩ, ví dụ, HĐH theo dõi các xác nhận hoặc truyền lại.

Nhân tiện, tôi đang sử dụng lệnh sau để phân tích một giao thức. Ngoài việc thực hiện lọc ở trên, nó chỉ hiển thị số điểm cuối (ở dạng thập phân) và dữ liệu USB. Đây là trên máy GNU / Linux sử dụng thiết bị usbmon1 để đánh hơi và giả sử rằng thiết bị USB tôi muốn theo dõi nằm trên bus 1 và có địa chỉ 11.

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


Cảm ơn câu trả lời của bạn, Gus. Trên thực tế, điều này không trả lời tất cả các câu hỏi của tôi, nhưng bạn đã đưa ra câu trả lời tốt nhất (duy nhất)!. Bạn có phiền khi bình luận về việc chụp tôi đã đưa vào làm ví dụ (lấy từ một thiết bị HID). Chúng ta thấy gì? những lĩnh vực trong dấu vết cho biết những gì? Cảm ơn một lần nữa!
user415772

3

Nhật ký USB của WireShark được thực hiện ở cấp HĐH. Với Linux, nó dựa trên dữ liệu mà usbmon tạo ra dựa trên cấu trúc URB bên trong của Linux được mô tả ở đây . Vì vậy, nhìn vào các nhận xét và tài liệu của kernel và WireShark cung cấp cái nhìn sâu sắc nhất về nó là gì.

Những gì tôi đã tìm thấy từ các tài liệu kernel là các gói là các cấu trúc usbmon theo sau là dữ liệu được gửi và nhận. Đây là cấu trúc (được sao chép từ đây ):

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 */
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.