LOADING

加载过慢请开启缓存 浏览器默认开启

一次无线电分析经历

利用URH的步骤

  1. 记录信号
  2. 信号说明
  3. 信号分析

首先找到通过URH自带的频谱分析器寻找到系统通信的中心频率。

找到中心频率后利用记录信号工具捕获信号。urh可以记录从sdr中捕获的原始音频信号。

过放大捕获的音频信号并观察清晰的正弦波形以及非平凡的模式,可以验证捕获很可能是正确的

一旦信号被捕获到就可以利用URH的发送信号工具进行重播

逆向工程RF协议

所讨论的系统使用 RF 信号在设备之间进行无线通信。这些无线电波用于在每个设备之间传输二进制数据,即 0 和 1。通过无线电波传输二进制数据的过程称为调制 。

有三种主要的简单调制二进制信号的方式:幅度键控 (ASK)、频率键控 (FSK) 和相位键控 (PSK)。它们分别产生不同的波形,可以很容易地通过视觉识别。如图所示。

每种技术都使用正弦波的不同属性来分别编码零和一。幅度键控 (ASK) 使用波的振幅,其中较高的振幅通常编码为 1,较低的振幅编码为 0。频率键控 (FSK) 则保持振幅和相位不变。而是在两个不同的频率之间进行切换以区分 0 和 1。最后,相位键控 (PSK) 使用相位变化来区分这两个符号。

解调是将调制信号转换回原始二进制数据的过程。在 RF 通信的大多数实际应用中,这是直接在硬件中完成的,使用专门的无线电接收器和电路自动将信号转换回二进制数据 。通常,该硬件还实现了错误校正、噪声过滤和其他技术,以增加通信的可靠性,因为干扰和其他干扰在现实世界中是不可避免的。

urh可以自动解调,但是很多时候无法找到正确的调制参数。因此我们可以使用audacity进行手动解调。

解调的步骤如下:

  1. 将 URH 捕获的原始信号数据通过菜单选项文件 - 导入 - 原始数据导入到 Audacity 中。URH 将信号保存为有符号 8 位字节的原始 IQ 数据。通过选择编码为有符号 8 位 PCM 的 2 通道 (立体声),可以将数据的 I 和 Q 组件分开并导入到两个单独的轨道中。在这种情况下,仅使用其中一个足以提取信息。因此,在 Audacity 中,将立体声轨道拆分为两个单声道轨道,然后删除第二个轨道。导入选项的其余部分并不重要。
  2. 其次,记录 Audacity 感知到的中心频率。可以通过菜单选项分析 - 绘制频谱来找到这一点。注意,由于样本率等多个特征不是原始信号数据的一部分,因此此频率可能不等于实际的 868.64 MHz 的中心频率。在下面的步骤中使用了这个频率。
  3. 对第一个轨道应用高通滤波器,并对第二个轨道应用低通滤波器,将滚降值设置为 48 dB。前者基本上将较高的频率映射到输出波中的较高振幅,后者则相反。
  4. 使用 Audacity 的脚本语言 Nyquist 对每个轨道应用绝对值。使用了简短的 Nyquist 程序 (s-abs track) 来实现。然后对两个轨道应用了低通滤波器,计算了信号的包络。最后,对最初应用了低通滤波器的轨道进行了反转。这意味着现在两个轨道分别对应于原始信号的高频和低频部分。
  5. 接下来,将两个轨道混合到一起形成一个新轨道,即将信号相加。
  6. 将混合轨道放大到尽可能高的程度,并启用剪切,以创建一个二进制信号。这创建了最终信号,即从原始信号解调出的原始二进制信号。
  7. 最后,将最终的二进制波形导出为原始数据到文件中。通过选择最终轨道并使用菜单选项文件 - 导出 - 导出所选音频 来完成。在随后的文件对话框中,选择”其他未压缩文件”作为类型,并选择无标题 (例如 RAW),并选择有符号 8 位 PCM 编码。这样就可以将信号导出为原始二进制振幅数据,表示为有符号字节。

这就是解调信号的过程

经过此过程的结果是一个二进制波形而不是一段实际的二进制数据,因此编写了一个简单的python程序用于提取

import matplotlib.pyplot as plt
SIGNAL_LEN, SYMBOL_LEN = 34000, 200
FILE, SIGNAL_OFFSETS = "door-signal.raw", [1800, 856160, ...]
with open(FILE, "rb") as f:
signal = [b if b < 128 else b - 256 for b in f.read()]
for i, offset in enumerate(SIGNAL_OFFSETS):
xs = range(offset, offset + SIGNAL_LEN, SYMBOL_LEN)
plt.scatter(xs, [0 for _ in xs], c="red")
bits = "".join(['1' if signal[x] > 0 else '0' for x in xs])
print(f"Packet {str(i).ljust(2)} =", hex(int(bits, 2)))
plt.plot(signal)
plt.show()

该程序期望一个 x 轴偏移值列表,其中包含信号的第一个比特位。这些值是手动找到的,通过手动查看程序创建的图来实现。信号长度和符号长度也是手动测量的,但这些对于所有捕获的信号来说是恒定的。只需手动推导出每个信号的信号起始偏移量,这相当耗时。因此,这个过程仅应用于少数信号,直到收集到足够的信息来对协议做出结论。

通过使用 Audacity 和描述的方法,从每个记录的信号中提取了二进制数据。这些数据以十六进制形式呈现在表中。分析数据后可以看到一个非常清晰的结构。所有记录的信号解码后都恰好为 170 位,并且始终具有以下结构。

  1. 1和0交替的序文。这是射频协议中非常常见的技术,用于通知传入信号并同步时钟频率
  2. 对于每个设备都是恒定的字节序列。例如,门传感器将始终发送相同的字节序列,摄像机将发送另一个字节序列,等等。这对应于一个同步字,它经常在射频协议中发现,用于确定协议类型或消息来自哪个设备。据推测,这是某种ID,用于告诉主面板该消息来自哪个外设。
  3. 一系列零位。据推测,这是同步字的一部分。这也是 RF 协议中常见的技术,用于让接收器知道这是什么协议,以及有效载荷数据从何处开始。
  4. 一串看似随机的比特,可能是有效载荷

门防拆传感器开启

  • 0xaaaaaaaa29cd29cd0a000015d477e072b922530064
  • 0xaaaaaaaa29cd29cd0a0000028648b07e291d2ceecc
  • 0xaaaaaaaa29cd29cd0a0000280b9d2e1d2d2ca7f31c
  • 0xaaaaaaaa29cd29cd0a00002548c662f2feeea7fe22
  • 0xaaaaaaaa29cd29cd0a000019201db301398d538674
  • 0xaaaaaaaa29cd29cd0a00000806d6a5ee37481e2f76

门防拆传感器关闭

  • 0xaaaaaaaa29cd29cd0a0000102366a5cb78d61c0d0c
  • 0xaaaaaaaa29cd29cd0a00000a3b2cb0867bf62aa616
  • 0xaaaaaaaa29cd29cd0a000028fe2271f089a9e8c984
  • 0xaaaaaaaa29cd29cd0a00001e23195bcbe8c65107ec
  • 0xaaaaaaaa29cd29cd0a00001913b1ee7e3448da1cf0
  • 0xaaaaaaaa29cd29cd0a000006f69dbb732deb2a120c

摄像头防拆传感器开启

  • 0x155555554539a539a14000034164758f44cfae66f1
  • 0x155555554539a539a14000034164758f44cfae66f1
  • 0x155555554539a539a14000034164758f44cfae66f1
  • 0x155555554539a539a14000034164758f44cfae66f1
  • 0x155555554539a539a14000034164758f44cfae66f1
  • 0x155555554539a539a14000034164758f44cfae66f1

摄像头防拆传感器关闭

  • 0x155555554539a539a140000342724d66fce053d3d7
  • 0x155555554539a539a140000342724d66fce053d3d7
  • 0x155555554539a539a140000342724d66fce053d3d7
  • 0x155555554539a539a140000342724d66fce053d3d7
  • 0x155555554539a539a140000342724d66fce053d3d7
  • 0x155555554539a539a140000342724d66fce053d3d7

然而,payload 显然被加密或至少以某种方式混淆了。实际方法是什么,以及它是否是一个加密安全的方法,这些问题都没有答案。加密可能很弱。在没有固件或关于 RF 协议的其他文档的情况下进一步的逆向工程几乎是不可能的。

RF 干扰攻击

无线电频谱是用于无线通信的介质。它本质上容易受到干扰攻击的影响。这可以类比于 RF 版本的 DoS 攻击。对 RF 通信进行干扰攻击涉及将电磁能量定向到一个或多个无线电频率,以干扰或阻止两个系统之间的信号传输。在实践中,这意味着在特定频率上发送信号,携带足够的能量来击败在相同频段传输的任何人。通过持续发送信号,使无线频段充满,可以阻止合法的流量。

由于 RF 通信使用共享介质,因此这是一种非常难以防范的攻击。通常,系统将在单一固定频率上进行通信,这可能使系统特别容易受到干扰攻击。尽管已经开发出许多复杂的技术来检测干扰,但检测和报告仅限于系统对干扰攻击的反应程度。通常情况下,除了可能切换频率带或切换到备用通信模式外,很少能做其他事情。

方法

为了发送信号,使用了 HackRF SDR。它被放置在系统附近,距离在 10-20 厘米之间。使用了开源程序 GnuRadio Companion。这是一个图形工具,用于控制 SDR。它基于创建连接组件的流图,用于接收、处理、修改和发送来自和到 SDR 的实时无线电信号。

为了生成噪声信号,在 GnuRadio Companion 中创建了一个流图,如图所示。

首先,使用快速噪声发生器作为源信号。然后将噪声输出链接到低通滤波器,以将信号集中到感兴趣的特定频率带。最后,将输出发送到 HackRF 通过 osmocom Sink 块。此外,低通滤波器的输出还发送到一个 QT GUI 频率接收器,以在执行攻击时可视化呈现发送信号数据。