USB(键盘)流量分析

5 篇文章 1 订阅
5 篇文章 1 订阅


hws2023的一道misc,没接触过,写一份博客,稍微带一点鼠标流量,自己做题收获,可能在某些情况仅适用本题

找到有用的usb流量

网上大部分讲USB协议数据在Leftover Capture Data域中,就这道题,以及目前已知少量博客显示,HID Data域中也具有价值(USB URB里找有没有数据就行)。鼠标流量数据长度为四个字节,键盘流量数据长度为八个字节,就这个题而言,若鼠标流量数据长度不满足,格式也不太对

鼠标流量

第一个字节:代表按键(00时,代表没有按键;01时,代表按左键;02时,代表当前按键为右键)
第二个字节:值为正时,代表鼠标右移像素位;
值为负时,代表鼠标左移像素位
第三个字节:代表垂直上下移动的偏移(当值为正时,代表鼠标上移像素位;值为负时,代表鼠标下移像素位)
上述引用和进一步了解后续鼠标流量具体流程可参考这篇文章:https://blog.csdn.net/qq_46150940/article/details/115431953

在这里插入图片描述

键盘流量(自己做题收获,可能仅适用本题)

本题就在HID Data域

第一个字节:代表按键(00时,代表没有按键;不论02或者20做题时统一当shift键)
第三个字节:代表键盘敲击时具体字母(hid键盘报告格式

在这里插入图片描述

脚本或者自己对照

找出相应信息后,脚本直接还原信息比较快速方便,但是如果刚刚接触,一下子拿一个现成的脚本去改,不理解,修改难度比较大,就可以先找一个差不多脚本运行一下(得出结果不全,但是可以给手动对照一点参考,自己理解对照的对不对),然后自己手动对照hid键盘报告格式,了解原理,改着也方便
取一小段:

02:00:00:00:00:00:00:00   // 第三个字节没有数据不看
02:00:04:00:00:00:00:00   // 第一个字节为02,键盘操作shift键和第三个字节代表的键
//由上边可得第三个字节没有数据的可以直接忽略,即第一个字节为02或者20,shift键只作用于本行
20:00:26:00:00:00:00:00   // 第一个字节为20,shift键和第三个字节代表的键

20:00:00:00:00:00:00:00
00:00:00:00:00:00:00:00
00:00:10:00:00:00:00:00   // 直接第三个字节代表的键
00:00:00:00:00:00:00:00

USB(键盘)流量分析具体流程

流量包直接导入即可,寻找有用信息的IP,过滤导出

usb.src =="2.3.1"

在这里插入图片描述
拖kali里面(python运行方便,也不咋出错),拖不进去的配一下tools。python脚本在那块,就在哪块,右键打开终端!!!不容易出错
在这里插入图片描述
使用tshark 命令把pcap的数据提取并去除空行到usbdata.txt

# sed '/^\s*$/d' 剔除空行,减少不必要麻烦特别鼠标流量
tshark -r usb.pcapng -T fields -e usb.capdata | sed '/^\s*$/d' > usbdata.txt

对!没错,我改包名了,不太会tshark命令,就和找到教程里面的包名保持一致,还是要了解一下的。可以看这个!

注意大小写
-r: 读取本地文件,可以先抓包存下来之后再进行分析;
-T 设置解码结果输出的格式,包括text,ps,psml和pdml,默认为text。
-t 设置解码结果的时间格式。“ad”表示带日期的绝对时间,“a”表示不带日期的绝对时间,“r”表示从第一个包到现在的相对时间,“d”表示两个相邻包之间的增量时间(delta)。
-E: 当-T字段指定时,设置输出选项,header=y意思是头部要打印;
-e: 当-T字段指定时,设置输出哪些字段

# 字节和字节间加冒号的脚本
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
    a=f.readline().strip()
    if a:
        if len(a)==16: # 鼠标流量的话len改为8
            out=''
            for i in range(0,len(a),2):
                if i+2 != len(a):
                    out+=a[i]+a[i+1]+":"
                else:
                    out+=a[i]+a[i+1]
            fi.write(out)
            fi.write('\n')
    else:
        break

fi.close()

还原信息(有冒号时提取数据的[6:8],无冒号时数据在[4:6])

# x
normalKeys = {
    "04":"a", "05":"b", "06":"c", "07":"d", "08":"e",
    "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j",
     "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o",
      "13":"p", "14":"q", "15":"r", "16":"s", "17":"t",
       "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y",
        "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4",
         "22":"5", "23":"6","24":"7","25":"8","26":"9",
         "27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t",
         "2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\",
         "32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".",
         "38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>",
         "3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>",
         "44":"<F11>","45":"<F12>"}
# shift+x
shiftKeys = {
    "04":"A", "05":"B", "06":"C", "07":"D", "08":"E",
     "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J",
      "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O",
       "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T",
        "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y",
         "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$",
          "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")",
          "28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>",
          "2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"",
          "34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>",
          "3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>",
          "41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"}
output = []
keys = open('out.txt')
for line in keys:
    try:
#通过line[]取值过滤无用信息,注意(line[0]!='0' and line[0]!='2') or (line[1]!='0' and line[1]!='2') ,一般情况x不等于信息字符位其余的位line[x]!='0'即可
        if (line[0]!='0' and line[0]!='2') or (line[1]!='0' and line[1]!='2') 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' or line[6:8]=="00":
             continue
        if line[6:8] in normalKeys.keys():
#由于02,20两种情况,output += 不能写一行,加一个if语句
            if line[0]=='2':
            		output += [[normalKeys[line[6:8]]],[shiftKeys[line[6:8]]]][line[0]=='2']
            else:
            		output += [[normalKeys[line[6:8]]],[shiftKeys[line[6:8]]]][line[1]=='2']
        else:
#对照的很全了,基本可以忽略[unknown]
            output += ['[unknown]']
    except:
        pass

keys.close()

flag=0
print("".join(output))
for i in range(len(output)):
    try:
        a=output.index('<DEL>')
        del output[a]
        del output[a-1]
    except:
        pass

for i in range(len(output)):
    try:
        if output[i]=="<CAP>":
            flag+=1
            output.pop(i)
            if flag==2:
                flag=0
        if flag!=0:
            output[i]=output[i].upper()
    except:
        pass
# 注意版本,有的为:print 'output :' + "".join(output)
print ('output :' + "".join(output))

运行可得(运行时由于tab键和空格混用,可能会报错)
在这里插入图片描述
放大一点
请添加图片描述
解释一下,运行完的第一行,每一行还原后的结果,看不懂output:这一行怎么来的,自己键盘敲一遍就行(<DEL>删除前一个,<CAP> <CAP>之间的大写)[unknown]直接删就行,前提需要确保脚本的正确,以及对照数据的完整性(例如:例子脚本中的normalKeys和shiftKeys数据)

流程学习于:https://blog.csdn.net/qq_43625917/article/details/107723635

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是意法半导体公司推出的一系列32位ARM Cortex-M微控制器。它们具有强大的性能和丰富的外设,常用于嵌入式系统开发。其中,STM32的USB键盘代码分析是指对STM32芯片上实现USB键盘功能的代码进行研究和分析。 在STM32微控制器中,使用USB键盘功能需要使用相关的库和驱动程序。通常,可以使用STM32Cube软件包来进行开发。首先,在开发环境中配置USB外设为HID键盘。然后,通过使用USB设备库和键盘中断处理函数,可以实现USB键盘的输入和输出功能。 对于USB键盘的输入,可以通过检测按键输入和发送对应的键码数据来实现。当按下一个按键时,会触发键盘中断处理函数,函数内部会处理相应的按键信息并发送到主机。同时,还可以实现特殊按键功能,例如功能键和组合键。 对于USB键盘的输出,可以通过主机下发的数据来控制键盘的灯光状态,例如大写锁定灯和滚动锁定灯。在键盘中断处理函数中,可以根据主机下发的数据来控制相应的灯光状态。 此外,STM32还提供了丰富的USB功能,例如USB传输控制协议(USB-HID),可以实现多种USB外设的功能,如键盘、鼠标、游戏手柄等。 总之,STM32的USB键盘代码分析主要涉及对STM32芯片上实现USB键盘功能的相关库和驱动的研究和分析。通过对代码的分析,可以深入了解STM32的USB键盘实现原理以及如何使用相关库和驱动来实现USB键盘功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值