这些数据包使用什么校验和算法?

问题描述 投票:1回答:1

我正在构建一个Python库来操纵我的廉价中文iGK64机械键盘的照明和可编程性功能,因为Windows驱动程序在Linux上不起作用。

我已经在Windows VM中运行制造商的驱动程序应用程序,并捕获了USB数据包以进行分析。在我的空闲时间的最后几天里,我一直在分解这些数据包的内容,以确定不同的部分以及它们的作用。

到目前为止,我已经确定了这些事实:

  • 发送到键盘和从键盘接收的每个数据包都是64字节。
  • 第一个字节是某种目的地指示符。我将其称为“注册ID”,可能更准确地说是“页面ID”。此字段的长度为1个字节。
  • 第二个字节是“指令”。例如,“写入”为0x02,“读取”为0x01,我也看到过0x09(我认为是“执行”)和0x00(我认为是noop或ping)。此字段的长度为1个字节。
  • 下一部分是“地址”,它是一个16位无符号整数,指示where进行读取或写入。此字段的长度为2个字节,小端。
  • 接下来是有效载荷长度。一个16位无符号整数,指示要读取或写入多少字节。此字段的长度为2个字节,小端。
  • 在有效负载本身之前是校验和。一个16位的值,对此我知之甚少。字段的长度为2个字节,我假设使用little-endian。
  • 有效负载为最后。它的长度在0到56个字节之间,但用0填充,因此总包大小为64位。
  • 一起看起来像reg:{} instr: {} addr: {} len: {} checksum: {} payload: {}
  • 以下是数据包的示例:

    原始:

0x220200003800E670FFFFFFFFFFFFFFFF010000020200000204000002080000021000000220000002FFFFFFFFFFFFFFFF00040002000500020006000200070002

已解构:

reg: 0x22 instr: 0x02 addr: 0x0000 len: 56 (0x3800) sum: 0xE670
payload: 0xFFFFFFFFFFFFFFFF010000020200000204000002080000021000000220000002FFFFFFFFFFFFFFFF00040002000500020006000200070002

我一直在确定用于计算校验和的算法。我已经尝试了一些基本的异或序列,以及一些加/减方法,但是没有一个是正确的。

这是两个几乎相同的数据包的示例,都到达相同的寄存器,并且有效载荷长度为零,唯一的区别是指令和地址。但请参阅校验和不同。

Raw1:

0x210201000000B63D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

已解构1:

reg: 0x21 instr: 0x02 addr: 0x0100 len: 00 (0x0000) sum: 0xB63D
payload: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Raw2:

0x21000000000092610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deconstructed2:

reg: 0x21 instr: 0x00 addr: 0x0000 len: 00 (0x0000) sum: 0x9261
payload: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

在这种情况下,这是从主机到外围设备的通信(写tr寄存器0x21,addr 0x100,有效载荷为零),然后是从外围设备到主机的通信(寄存器0x21“ ack”)。

我很确定包的每个属性都用于计算校验和,包括reg id,instr,addr,len和整个有效负载。

这里有更多示例,可能有助于阐明校验和的计算方式:

Raw3(这是主机和外围设备之间每秒发送几次的PING或“活动”数据包):

0x0C0000000000A70D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deconstructed3:

reg: 0x0C instr: 0x00 addr: 0x0000 len: 00 (0x0000) sum: 0xA70D
payload: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Raw4(有效载荷均为0xFF的一个:]

0x220288013800BC74FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Deconstructed4:

reg: 0x22 instr: 0x02 addr: 0x8801 len: 56 (0x3800) sum: 0xBC74 
payload 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

我有几个较大的原始通信转储,但是与此处提供的示例相比,它们对于确定校验和算法可能不再有用。

任何帮助将不胜感激!

我正在构建一个python库来操纵我廉价的中文iGK64机械键盘的照明和可编程性功能,因为Windows驱动程序在Linux上不起作用。 ...

python algorithm usb driver checksum
1个回答
1
投票

Ashley,这是CRC-CCITT,大声笑。您愿意接受我的回答吗:-)

© www.soinside.com 2019 - 2024. All rights reserved.