usb流量分析

常见的usb流量分析分为鼠标协议和键盘协议

USB流量的介绍

  • USB UART : 这种方式下,设备只是简单的将 USB 用于接受和发射数据,除此之外就再没有, 其他通讯功能了。
  • USB HID : 这一类通讯适用于交互式,有这种功能的设备有:键盘,鼠标,游戏手柄和数字显示设备。
  • USB Memory : 数据传输存储

鼠标协议相关知识

USB协议的数据部分在Leftover Capture Data域之中,如下图

mouse

每一个数据包的数据区有四个字节

  1. 第一个字节代表按键,当取 0x00 时,代表没有按键,为 0x01 时,代表按左键,为 0x02 时,代表当前按键为右键。
  2. 第二个字节可以看成是一个 signed byte 类型,其最高位为符号位,当这个值为正时,代表鼠标水平右移多少像素,为负时,代表水平左移多少像素。
  3. 第三个字节与第二字节类似,代表垂直上下移动的偏移。

键盘协议相关知识

keyboard

键盘数据包的数据长度为 8 个字节

  1. 第一个字节代表特殊按键

    |--bit0: Left Control是否按下,按下为1 |--bit1: Left Shift 是否按下,按下为1 |--bit2: Left Alt 是否按下,按下为1 |--bit3: Left GUI(Windows键) 是否按下,按下为1 |--bit4: Right Control是否按下,按下为1 |--bit5: Right Shift 是否按下,按下为1 |--bit6: Right Alt 是否按下,按下为1 |--bit7: Right GUI 是否按下,按下为1

    当第一个字节为00时,代表没有按键,第一个字节为02或者20时统一当shift键)

  2. 第二个字节是保留位

  3. 第三个字节~第8个字节是普通按键(主要看第三个字节)

    第四到第八个字节好像是处理多键同时按下的

    data 值与具体键位的对应关系:keyboard_pro

分析一个流量包

以ISCC2024 的时间刺客为例

USB 协议的数据部分在 Leftover Capture Data 域之中

Linux 下可以用 tshark 命令可以将 leftover capture data 单独提取出来:

tshark -r example.pcap -T fields -e usb.capdata //如果想导入usbdata.txt文件中,后面加上参数:>usbdata.txt

而在Windows我没可以通过wireshark自带的工具提取出来:

在 wireshark 的安装环境下,在 wireshark目录下有个 tshark.exe,输入命令:

tshark.exe -r example.pcap -T fields -e usb.capdata //如果想导入usbdata.txt文件中,后面加上参数:>usbdata.txt

查看 usbdata.txt 发现数据包长度为八个字节

image-20240510191821845

发现数据包长度为八个字节,说明是键盘usb,也就是说只关心第三个字节即可

给出转化脚本:

mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." } nums = [] keys = open('usbdata.txt') for i in keys: i = i.strip() line = "" for j in range(0,len(i),2): line += i[j:j+2] + ":" line = line[:len(line)-1] # print(line) if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0': continue nums.append(int(line[6:8],16)) keys.close() output = "" for n in nums: if n == 0 : continue if n in mappings: output += mappings[n] else: output += '[unknown]' print('output : ' + output)

得到: FLAGPR3550NWARDSA2FEE6E0

另附上 鼠标转化脚本:

nums = [] keys = open('./mouse_data.txt','r') f = open('xy.txt','w') posx = 0 posy = 0 for i in keys: line = "" i = i.strip() for j in range(0,len(i),2): line += i[j:j+2] + ":" line = line[:len(line)-1] if len(line) != 11 : continue x = int(line[3:5],16) y = int(line[6:8],16) if x > 127 : x -= 256 if y > 127 : y -= 256 posx += x posy += y btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing if btn_flag == 1 : # 1 代表左键 f.write(str(posx)) f.write(' ') f.write(str(posy)) f.write('\n') f.close() from PIL import Image img = Image.new('RGB',(2000,2000),(255,255,255))#创建Image对象 f =open('xy.txt')#xy.txt文件 for line in f.readlines(): point =line.split() img.putpixel((int(point[0]),int(point[1])),(0,0,0))#读取文件中的每一行,并修改像素 f.close() img.show()

配合 gnuplot 将坐标轴转换为图像

参考: https://github.com/jas502n/sangfor/blob/master/1earn/Security/BlueTeam/笔记/USB取证.md


__EOF__

本文作者_TLSN
本文链接https://www.cnblogs.com/lordtianqiyi/p/18190748.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   TLSN  阅读(442)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示