คำอธิบาย wireshark usb ร่องรอย


10

ฉันพยายามที่จะทำวิศวกรรมอุปกรณ์ usb (HID) และไม่สามารถหาวิธีที่ฉันเห็นใน wireshark (usbmon + wireshark บน linux หรือ windows) เกี่ยวข้องกับโปรโตคอล usb หรือไม่ ฉันดูโปรโตคอล usb จาก www.usb.org

wireshark แสดงอะไร?

1) หนึ่งบรรทัดต่อแพ็คเก็ต? (โทเค็นข้อมูลจับมือ)

2) หนึ่งบรรทัดต่อธุรกรรม? (โทเค็น + [ข้อมูล] + จับมือกัน) (ฉันเดา)

3) หนึ่งบรรทัดต่อการถ่ายโอนการควบคุม?

ทิศทางของการทำธุรกรรมนั้นแปลกมากเช่นกัน (ไปยัง / จากช่อง) อย่างน้อยมันไม่ตรงกับความคาดหวังของฉัน :-) ... และส่วนข้อมูลของการแจงนับซ่อนรายงาน ฯลฯ ... บางครั้งดูเหมือนว่าจะแสดงพร้อมกับข้อมูลการติดตั้ง (8 ไบต์) และบางครั้งไม่ ... ฉันไม่ ไม่รู้จริง ๆ ว่า URB คืออะไร ... ไม่มีการเอ่ยถึงสิ่งนั้นในโปรโตคอล usb เท่าที่ฉันจะได้เห็น ... มันดูเหมือนว่า wireshark / usbmon trace ในระดับสแต็กที่สูงขึ้นและพยายามที่จะอนุมานว่าอะไรจะเกิดขึ้น บนสายจากที่ ...

ตัวอย่างของสิ่งที่ฉันเห็นได้ด้านล่างเราจะเห็นอะไรที่นี่?

a) ฉันไม่สามารถหา bmtype = 0x20 (จากการตั้งค่า, เฟรม No = 599) ในรายละเอียด

b) เนื่องจากฉันมีอุปกรณ์ HID ฉันคิดว่านี่อาจเป็นรายงาน / การกำหนดค่าคุณลักษณะ (การแจงนับจะถูกส่งในขั้นตอนนี้) ดังนั้นฉันสามารถเห็นด้วยกับทิศทาง (โฮสต์ -> อุปกรณ์) แต่ข้อมูลอยู่ที่ไหน หรือไม่มีเฟสข้อมูลที่นี่? เฟรม 600 คืออะไร

c) เฟรม 600 คืออะไร ข้อมูล?

ง) เฟรม 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 แต่ได้รับการบอกว่ามันไม่ใช่คำถามการเขียนโปรแกรมโดยตรง หวังว่าจะเหมาะกับที่นี่ดีกว่า

คำตอบ:


11

USB URB เปรียบเสมือนแพ็กเก็ต IP และจุดปลาย USB เปรียบเสมือนพอร์ต IP จุดปลาย USB 0x00-0x7F อยู่ในโฮสต์และจุดปลาย 0x80-0xFF อยู่บนอุปกรณ์ (ฉันคิดว่า) ดังนั้นจุดสิ้นสุดจะเข้ารหัสทิศทางของการถ่ายโอน lsusbจะแสดงให้คุณเห็นว่าอุปกรณ์ปลายทางใดและประเภทการถ่ายโอนที่อุปกรณ์รองรับ

ฉันจะใช้ "แพ็คเก็ต" ในเครื่องหมายคำพูดเพื่อหมายถึงหน่วยของกิจกรรมที่ wireshark จับ สิ่งเหล่านี้ไม่ใช่สิ่งที่ถูกส่งเข้ามา ตัวอย่างเช่น "แพ็คเก็ต" จะมีการประทับเวลาสำหรับเมื่อการถ่ายโอนเริ่มต้นแม้ว่าจะไม่ได้ส่งผ่านบัส USB

ฉันคิดว่าแง่มุมที่สับสนที่สุดในการดมกลิ่นโปรโตคอล USB คือคุณเห็น Wireshark "แพ็กเก็ต" สองอันสำหรับ USB URB แต่ละอัน เมื่อโฮสต์เริ่มการถ่ายโอนนั่นคือ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 และการส่งสัญญาณใหม่ แต่ทั้งหมดนี้จัดการโดยโฮสต์คอนโทรลเลอร์และระบบปฏิบัติการไม่เกี่ยวข้อง ฉันไม่คิดว่าตัวอย่างเช่นระบบปฏิบัติการจะติดตามการตอบรับหรือการส่งสัญญาณซ้ำ

อย่างไรก็ตามฉันใช้คำสั่งต่อไปนี้เพื่อวิเคราะห์โปรโตคอล นอกเหนือจากการทำการกรองด้านบนแล้วจะแสดงเฉพาะหมายเลขปลายทาง (เป็นทศนิยม) และข้อมูล USB นี่เป็นเครื่อง GNU / Linux ที่ใช้อุปกรณ์ usbmon1 เพื่อดมกลิ่นและสมมติว่าอุปกรณ์ 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

3

บันทึก WireShark USB เสร็จแล้วที่ระดับ OS กับ Linux บนพื้นฐานของข้อมูลที่ usbmon สร้างซึ่งจะขึ้นอยู่กับโครงสร้างภายใน URB ลินุกซ์อธิบายไว้ที่นี่ ดังนั้นการดูที่ความคิดเห็นเคอร์เนลและ WireShark และเอกสารให้ข้อมูลเชิงลึกที่ดีที่สุดในสิ่งที่มันเป็น

สิ่งที่ฉันพบจากเคอร์เนล docs คือแพ็คเก็ตเป็น usbmon structs ตามด้วยข้อมูลที่ส่งและรับ นี่คือ struct (คัดลอกมาจากที่นี่ ):

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 */
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.