流量分析 - USB流量(手搓+一把梭)
原创 xiaoliao1
2025年04月23日 18:38 湖南
usb.pcapng

第一种方法:手搓
直接打开流量包

随便选一个看到data位置是8位的
知识补充:
键盘流量
基本知识
USB协议数据部分在Leftover Capture Data域中,数据长度为八个字节。
 标准8字节键盘数据格式
标准8字节键盘数据格式
|  字节位置   |        名称         |                             描述                             |
| :———: | :—————–: | :———————————————————-: |
|  字节1  | 修饰键(Modifiers) | 表示功能键(Ctrl、Shift、Alt等)的按下状态,每个二进制位对应一个按键。 |
|  字节2  |      保留字段       |   通常为 0x00,部分设备可能用于扩展功能(如多媒体键)。    |
| 字节3-8 |     普通按键码      |     最多6个同时按下的普通按键的键码(每个按键占1字节)。     |
字节1:Modifier Keys(功能键位掩码)
| 位(Bit) |    对应按键    | HID Usage ID |       描述       |
| :——-: | :————: | :———-: | :————–: |
|   Bit 0   |     左Ctrl     |     0xE0     | 按下时值为 1。 |
|   Bit 1   |    左Shift     |     0xE1     |                  |
|   Bit 2   |     左Alt      |     0xE2     |                  |
|   Bit 3   | 左GUI(Win键) |     0xE3     |                  |
|   Bit 4   |     右Ctrl     |     0xE4     |                  |
|   Bit 5   |    右Shift     |     0xE5     |                  |
|   Bit 6   |     右Alt      |     0xE6     |                  |
|   Bit 7   | 右GUI(Win键) |     0xE7     |                  |
字节3-8:普通按键码(HID Usage ID)
| HID键码(Hex) | 对应按键  | 字符/功能  |
| :————: | :——-: | :——–: |
|    0x00    |  无按键   |     -      |
|    0x04    |     A     |    A/a     |
|    0x05    |     B     |    B/b     |
|    0x06    |     C     |    C/c     |
|    0x07    |     D     |    D/d     |
|    0x08    |     E     |    E/e     |
|    0x09    |     F     |    F/f     |
|    0x0A    |     G     |    G/g     |
|    0x0B    |     H     |    H/h     |
|    0x0C    |     I     |    I/i     |
|    0x0D    |     J     |    J/j     |
|    0x0E    |     K     |    K/k     |
|    0x0F    |     L     |    L/l     |
|    0x10    |     M     |    M/m     |
|    0x11    |     N     |    N/n     |
|    0x12    |     O     |    O/o     |
|    0x13    |     P     |    P/p     |
|    0x14    |     Q     |    Q/q     |
|    0x15    |     R     |    R/r     |
|    0x16    |     S     |    S/s     |
|    0x17    |     T     |    T/t     |
|    0x18    |     U     |    U/u     |
|    0x19    |     V     |    V/v     |
|    0x1A    |     W     |    W/w     |
|    0x1B    |     X     |    X/x     |
|    0x1C    |     Y     |    Y/y     |
|    0x1D    |     Z     |    Z/z     |
|    0x1E    |     1     |    1/!     |
|    0x1F    |     2     |    2/@     |
|    0x20    |     3     |    3/#     |
|    0x21    |     4     |    4/$     |
|    0x22    |     5     |    5/%     |
|    0x23    |     6     |    6/^     |
|    0x24    |     7     |    7/&     |
|    0x25    |     8     |    8/     |
|    0x26    |     9     |    9/(     |
|    0x27    |     0     |    0/)     |
|    0x28    |   Enter   |   回车键   |
|    0x29    |    Esc    |   Esc键    |
|    0x2A    | Backspace |   退格键   |
|    0x2B    |    Tab    |   Tab键    |
|    0x2C    |   Space   |   空格键   |
|    0x2D    |     -     |    -/_     |
|    0x2E    |     =     |    =/+     |
|    0x2F    |     [     |    [/{     |
|    0x30    |     ]     |    ]/}     |
|    0x31    |     \     |    /\|     |
|    0x33    |     ;     |    ;/:     |
|    0x34    |     '     |    '/”     |
|    0x35    |     |/~     |
|    0x36    |     ,     |    ,/<     |
|    0x37    |     .     |    ./>     |
|    0x38    |     /     |     /?     |
|    0x39    | Caps Lock | 大写锁定键 |
|    0x3A    |    F1     |  F1功能键  |
|    0x3B    |    F2     |  F2功能键  |
|      …       |    …    |    …     |
|    0x52    |     ↑     |  方向键上  |
|    0x51    |     ↓     |  方向键下  |
|    0x50    |     ←     |  方向键左  |
|    0x4F*    |     →     |  方向键右  |
直接用data字段进行比对

这里是00.00.10.00.00.00.00.00 前面两个00.00对应的是修饰

我们从第3位10去对于上面的字符表

所以第一位就是m
知道上面这些,就可以构造脚本把所有data内容提取出来直接梭哈
# 导入所需库
import os
import subprocess
import json
# 定义tshark命令:从usb.pcapng文件中提取特定USB设备(2.2.1)的HID数据,输出为JSON格式
command = 'tshark -r usb.pcapng -Y usb.addr=="2.2.1"  -T json  -e usbhid.data > 1.json'
# 使用subprocess执行命令
proc = subprocess.Popen(command, shell=True,
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 等待命令执行完成
proc.communicate()
# 加载生成的JSON文件
with open("1.json","r") as f:
    data=json.load(f)  # data现在包含所有匹配的USB数据包
a2=[]
for i in data:
    try:
        # 提取每个数据包的usbhid.data字段
        a1=i['_source']['layers']['usbhid.data'][0]  # [0]取第一个出现的数据
        a2.append(a1)
    except:
        continue  # 跳过没有usbhid.data字段的数据包
# 定义键盘映射表
normalKeys = {
    "04":"a", "05":"b", "06":"c", "07":"d", "08":"e", 
    # ... 其他常规按键映射 ...
    "39":"<CAP>"  # 大写锁定键
}
shiftKeys = {
    "04":"A", "05":"B", "06":"C", "07":"D", "08":"E",
    # ... 其他Shift组合键映射 ...
    "39":"<CAP>"  # 大写锁定键(实际应保持相同)
}
nums = []
for line in a2:
    if len(line)!=16:
        continue  # 过滤长度不符合要求的HID数据
    # 组合前两位(修饰键)和5-6位(实际按键代码)
    nums.append(line[0:2]+line[4:6])  
output = []
for n in nums:
    if n[2:4] == "00" :  # 00表示没有按键动作
        continue
    if n[2:4] in normalKeys:
        if n[0:2]=="02":  # 02表示Shift键按下
            output.append(shiftKeys[n[2:4]])
        else :
            output.append(normalKeys[n[2:4]])
    else:
        output += '[unknown]'  # 未识别的键值
print(output)  # 输出原始解析结果
flag = 0  # 大写锁定状态标志
# 退格键处理
for i in range(len(output)):
    try:
        a = output.index('<DEL>')  # 查找退格键位置
        del output[a]              # 删除DEL本身
        del output[a - 1]          # 删除前一个字符
    except:
        pass  # 没有DEL时跳过
# 大写锁定处理
for i in range(len(output)):
    try:
        if output[i] == "<CAP>":
            flag += 1
            output.pop(i)          # 移除CAP标记
            if flag == 2:          # 两次CAP恢复小写
                flag = 0
        if flag != 0:
            output[i] = output[i].upper()  # 转换为大写
    except:
        pass  # 处理索引越界等情况
# 最终输出
print("".join(output))
写完执行一下

moectf{Learned_a6ou7_USB_tr@ffic}
第二种方法:自动化工具一把梭
打开一把梭工具

把文件导入,执行一下

秒了
moectf{Learned_a6ou7_USB_tr@ffic}
 
           
        
      