USB流量分析
鼠标流量
鼠标的流量包有三个字节是有用的,从左到右依次代表着按键
,水平方向位移
,垂直方向位移
注意这里是代表着位移
,而之后在gnuplot工具中描绘出鼠标轨迹需要知道坐标,那么位移值(单位是像素)应该依次相加;而按键分为没有操作,左按键,右按键
,分别对应0x00,0x01,0x02
一般鼠标流量是4个字节
,也就是32bits,那么上面提到的有用字节应该分别是第1,2,3字节
也有可能是8字节
的,那么有用的字节应该分别是第1,3,5字节
也有可能是其他字节长度的,这里就不一一举例了
关于流量包中的USB数据是这样的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTmORn0U-1642501848235)(C:/Users/Menglin/AppData/Roaming/Typora/typora-user-images/image-20220118180054970.png)]
从流量包中导出USB数据
tshark -r xxx.pcapng -T fields -e usb.capdata > usbdata.txt
这样导出的数据里面除了鼠标流量,还有键盘流量,关于后者之后会提到
以我这边为例,导出的数据是以两位十六进制代表一位字节的数据
0100ffff01000000
0100000001000000
那么提取第1,3,5字节,由于这里涉及的是光标是一个绘图过程(需要按着左键进行),所以当有左键也就是第1字节等于0x01时,收集第3,5字节的数据并使用gnuplot画图
注意,当垂直或者水平位移值超过127时,那么ta代表的是负值
代码实现
from tqdm import tqdm
f2 = open("result.txt","a+")
with open("usbdata.txt","r") as f:
posx = 0 # 记录光标的相对于第一个数据的坐标值
posy = 0
for line in tqdm(f.readlines()):
# print(len(line))
if len(line) != 16: # 根据实际需要调整
continue
x = int(line[4:6],16) # 这是位移像素值
y = int(line[8:10],16)
if x > 127: # 切换成负位移
x -= 256
if y > 127:
y -= 256
posx += x
posy += y
click = int(line[0:2],16)
if click == 1:
f2.write(str(posx)+" "+str(-posy)+'\n') # 由于重新选取鼠标位移,是与实际看到的屏幕是呈镜像的,所以将垂直坐标取反,以得到正确显示在屏幕上的轨迹过程
f.close()
f2.close()
最后得到的是各个时刻的光标的坐标值
gnuplot
plot "result.txt"
这样就成功将鼠标流量中的绘图过程重新展现出来了
键盘流量
长度为8个字节,按键信息在第3个字节上
按键数据的大小对应不同的键位
与鼠标流量一样的,导出数据
tshark -r xxx.pcap -T fields -e usb.capdata > usbdata.txt
创建一个字典来对应第3个字节的大小来替换按键
参考文章
USB流量分析tshark命令:tshark(1) (wireshark.org)
深入理解USB流量数据包的抓取与分析 - Angel_Kitty - 博客园 (cnblogs.com)