我正在尝试对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,但没有成功。
为什么我需要知道如何计算校验和?因为我想控制 电动机也来自模拟操纵杆,我不能复制粘贴数千个值并映射它们。
也许您有任何想法?
您可以对样本进行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。