如果此类问题不允许或不适合我在此道歉,请在此情况下删除我的问题。
我正在尝试对两个嵌入式设备之间的协议进行反向工程。它们发送多播UDP数据包。
UDP包中的有效负载部分如下所示:
00000000: 00 00 00 01 5d 28 52 c5 26 30 30 3a 30 32 3a 39 |....](R.&00:02:9|
00000010: 42 3a 39 33 3a 34 41 3a 38 34 26 31 32 39 26 31 |B:93:4A:84&129&1|
我发现有效载荷部分由
组成MAC地址可以是上面总是恒定的地址(是多播UDP数据包的接收设备的MAC地址),也可以是& FF:FF:FF:FF:FF:FF就像一个接收设备未知时广播。
广播MAC地址(和另一个命令值)的另一个例子如下所示:
00000000: 00 00 00 01 95 46 84 1e 26 46 46 3a 46 46 3a 46 |.....F..&FF:FF:F|
00000010: 46 3a 46 46 3a 46 46 3a 46 46 26 31 32 38 26 31 |F:FF:FF:FF&128&1|
这里的hash / crc是:95 46 84 1e
相同MAC地址,相同命令值和相同序列号的组合在具有一定时间间隔的不同UDP分组中重复,并且将始终产生相同的散列/ crc。 所以我的猜测是hash / crc在某种程度上只取决于MAC地址,命令值和序列号的值。
我尝试过一个名为HashCalc的免费Windows哈希/ crc计算器来自Slavesoft,但是我无法获得相同的hash / crc,甚至删除了&符号和冒号的任何组合。
但我无法弄清楚hash / crc算法,因此我需要一些有更多知识的人的帮助。 我需要帮助首先找到基于mac-address,命令和序列号计算4字节hash / crc的算法。
其次,当找到算法时,我还需要一个实现,最好是在Python中。
如果您能指出我在哪里寻找并了解更多信息,我们将非常感谢您的帮助。
我还有一个小文件(19 kB),有更多的例子,但我不知道如何附加它,如果有必要的话。
我将非常感谢能得到的所有帮助。
答案 0 :(得分:1)
您可以使用CRC RevEng搜索CRC。事实证明这很简单,因为它是标准的CRC:
% ./reveng -w 32 -s 2630303a30323a39423a39333a34413a38342631323926315d2852c5
width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0x00000000 check=0x0376e6e7 name="CRC-32/MPEG-2"
% ./reveng -w 32 -s 2646463a46463a46463a46463a46463a46462631323826319546841e
width=32 poly=0x04c11db7 init=0xffffffff refin=false refout=false xorout=0x00000000 check=0x0376e6e7 name="CRC-32/MPEG-2"
这将计算CRC:
#include <stddef.h>
#include <stdint.h>
#define POLY 0x04c11db7
/* Compute CRC of buf[0..len-1] with initial CRC crc. This permits the
computation of a CRC by feeding this routine a chunk of the input data at a
time. The value of crc for the first chunk should be 0xffffffff. */
uint32_t crc32c(uint32_t crc, const unsigned char *buf, size_t len)
{
int k;
while (len--) {
crc ^= (uint32_t)(*buf++) << 24;
for (k = 0; k < 8; k++)
crc = crc & 0x80000000 ? (crc << 1) ^ POLY : crc << 1;
}
return crc;
}