gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:00:10 30 4
gpt4 key购买 nike

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

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

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

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

  • 下面是一个数据包的例子:

    生的:
    0x220200003800E670FFFFFFFFFFFFFFFF010000020200000204000002080000021000000220000002FFFFFFFFFFFFFFFF00040002000500020006000200070002
    解构:
    reg: 0x22 instr: 0x02 addr: 0x0000 len: 56 (0x3800) sum: 0xE670
    payload: 0xFFFFFFFFFFFFFFFF010000020200000204000002080000021000000220000002FFFFFFFFFFFFFFFF00040002000500020006000200070002

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

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

    原始 1:
    0x210201000000B63D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    解构1:
    reg: 0x21 instr: 0x02 addr: 0x0100 len: 00 (0x0000) sum: 0xB63D
    payload: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    原始2:
    0x21000000000092610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    解构2:
    reg: 0x21 instr: 0x00 addr: 0x0000 len: 00 (0x0000) sum: 0x9261
    payload: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    在这种情况下,这是从主机到外设的通信(写入 tr 寄存器 0x​​21,addr 0x100,零负载),然后是从外设到主机(寄存器 0x​​21“ack”)。

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

    以下是更多示例,它们可能有助于阐明校验和的计算方式:

    Raw3(这是一个 PING 或“事件”数据包,每秒在主机和外设之间发送多次):
    0x0C0000000000A70D0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
    解构3:
    reg: 0x0C instr: 0x00 addr: 0x0000 len: 00 (0x0000) sum: 0xA70D
    payload: 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    Raw4(一个负载全为 0xFF 的):
    0x220288013800BC74FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
    解构4:
    reg: 0x22 instr: 0x02 addr: 0x8801 len: 56 (0x3800) sum: 0xBC74 
    payload 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

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

    任何帮助将不胜感激!

    最佳答案

    为了帮助其他人,我在这里添加了 Ashley 如何为原始数据提出正确的校验和

    2202880138000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

    Came up with 0x74BC

    2202000038000000FFFFFFFFFFFFFFFF010000020200000204000002080000021000000220000002FFFFFFFFFFFFFFFF00040002000500020006000200070002

    Came up with 0x70E6 on CRC-CCITT (0xFFFF) 0x70E6
    现场 https://www.lammertbies.nl/comm/info/crc-calculation.html
    要在原始数据包中获得正确的校验和,只需从原始数据包中删除校验和并将其输入到 crc-calculation 站点以查找校验和类型。
    这是确定校验和的代码,由 stackoverflow 提供 falsetru:
    (你需要(pip)或pip3安装crc16)
    import binascii
    import crc16

    def crccitt(hex_string):
    byte_seq = binascii.unhexlify(hex_string)
    crc = crc16.crc16xmodem(byte_seq, 0xffff)
    return '{:04X}'.format(crc & 0xffff)

    #In [387]: #crccitt('21020100000000000000000000000000000000000000000000000000000000000#000000000000000000000000000000000000000000000000000000000000000')
    #Out[387]: '3DB6'

    关于python - 这些数据包使用什么校验和算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58907921/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com