Android:反向工程BLE设备-校验和?

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

我正在尝试对BLE设备(云台)进行反向工程。在嗅探btsnoop_hci.log之后,我已经成功地复制了确切的命令,下面是其中的一些:

* AF: a55a030232200001 00 03 bd03
* TF: a55a030232200001 00 02 9c13
* HF: a55a030232200001 00 01 ff23
* LK: a55a030232200001 00 00 de33

这些命令更改了操作模式,我猜它以十六进制形式从01编码为03。其中有四个,因此很有意义。但是,最后有四个字符,恕我直言,这是某种校验和,但我不知道是哪种类型。尝试过此online tool,但没有成功。

为什么我需要知道如何计算校验和?因为我想控制 电动机也来自模拟操纵杆,我不能复制粘贴数千个值并映射它们。

也许您有任何想法?

android bluetooth-lowenergy checksum crc
1个回答
0
投票

您可以对样本进行XOR对以减少变量数量,因为这消除了任何初始值或最终xor(就像两个都是0):

* AF: a55a030232200001 00 03 bd03
* TF: a55a030232200001 00 02 9c13
      0000000000000000 00 01 2110

* HF: a55a030232200001 00 01 ff23
* LK: a55a030232200001 00 00 de33
                          01 2110

起初,我假定交换了最后2个字节,所以01 2110将是01 10 21,这是一个普通的CRC,但是没有成功。然后,我假定最后2个字节是大端字节,然后单个数据字节0x01导致CRC 0x2110,对于单个数据字节0x01上的非反射CRC,CRC与多项式相同。但是,多项式的最低有效位(位0)需要为1,0x2110的位0为0,这意味着CRC是反射的CRC。]

进行蛮力搜索,对于单个数据字节= 0x01,导致CRC为0x2110的反射多项式,有3种情况,但只有其中一种情况的位15 == 1,0xEBB2,因此假定多项式。

然后用蛮力搜索初始值和最终xor = 0x0000或0xffff,以匹配所有4个示例,初始值= 0xa6ab,最终xor = 0x0000。

示例位级别代码:

typedef unsigned char   uint8_t;
typedef unsigned short uint16_t;

#define POLY (0xebb2)
#define INIT (0xa6ab)

uint16_t crc16(uint8_t * bfr, size_t size)
{
uint16_t crc = INIT;
int i;
    while(size--){
        crc ^= *bfr++;
        for(i = 0; i < 8; i++)
            /* assumes two's complement */
            crc = (crc>>1)^((0-(crc&1))&POLY);
    }
    return(crc);
}

如果首先在CRC后面附加最高有效字节,则得到的CRC将与4个示例匹配:

crc = crc16(bfr, 10);
bfr[10] = crc>>8;
bfr[11] = crc&0xff;

由于CRC字节以相反的顺序存储,所以检查0 == crc16(bfr,12)不起作用。要检查CRC:

crc = crc16(bfr, 10);
if((bfr[10] == crc>>8) && (bfr[11] == crc&0xff))
    printf("match\n");

尽管这对于这4种情况都有效,但我不能确定这是没有更多情况下使用的实际CRC。

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