GNU Radio Primer
Ray Felch //
免责声明:在传输任何数据前,请务必使用法拉第袋或屏蔽笼,避免因意外在受监管频段非法传输而违法。此外,拦截和解密他人数据是非法的,因此在研究自身通信时需谨慎。
前言:
最近我初涉SDR(软件定义无线电)领域,在此过程中学到了大量知识。我发现不仅可以使用SDR Sharp、GQRX、SIGINTOS、CubicSDR、RTL-SDR支持软件等应用模拟实际射频(RF)硬件组件,还能通过GNU Radio流图(如“grgsm_livemon.grc”)实时捕获GSM移动网络数据包。
尽管该项目极具教育意义,但我希望更深入理解GNU Radio流图。我想掌握创建这些流图的基础知识,而非仅依赖现有流图却不完全理解其工作原理。
尽管网络上有大量文档,GNU Radio(及GNURADIO-COMPANION)对初学者仍显 daunting。通过多次谷歌搜索,我最终发现了Great Scott Gadgets的Michael Ossmann提供的在线课程,这对我帮助极大。https://greatscottgadgets.com/sdr/ 此外,GNU Radio教程 https://wiki.gnuradio.org/index.php/Tutorials 也巩固了我的学习。
为熟悉GNU Radio基础,我选择了一个可能与重放攻击相关的项目(查找、捕获和重放原始RF信号),以绕过FOB(频率操作按钮)解锁我的1999款福特登山家。
需提前说明:尽管我成功从FOB捕获解锁信号并重放(通过HackRF传输),但并未实际解锁车辆。原因是多年前已采用“滚动码”(有时称为“跳码”)技术来防止此类重放攻击。
在此更改前,车辆和车库门开启器使用固定码,易被拥有适当接收器的攻击者发现。攻击者可利用此信息稍后获取访问权限。截至本文撰写时,已有多种滚动码绕过方法被提及,包括干扰技术和代码重置技术。
无论如何,我发现完成该项目是值得的。它让我更深入理解GNU Radio,并掌握了创建自定义流图所需的知识。
基础GNU Radio与流图信息:
GNU Radio中的所有信号处理均通过流图完成,流图由执行单个数字信号处理操作(如滤波、解码、复用等)的独立块组成。
数据在这些块之间以各种格式传递,包括复数或实数整数、浮点数或任何自定义数据类型。
每个流图至少需要一个源块(输入)和一个汇块(输出)。源或汇可以是USB加密狗(如HackRF、BladeRF等)、声卡、文件或FFT(快速傅里叶变换)等。https://en.wikipedia.org/wiki/Fast_Fourier_transform
获取FOB特定信息:
为确定FOB的工作频率,我首先搜索了与车辆相关的FCC编号。通过谷歌搜索和FCC搜索,获得以下信息:
FCC搜索结果提供了所需频率:
掌握设备RF频率(315MHz)后,我尝试捕获“解锁车辆”信号。通常,我可以使用众多可用应用(如SDR Sharp等)监控和捕获原始数据,但这次我想使用GNU Radio流图自行构建模块。
我进入家庭项目目录并执行以下命令:
$ sudo gnuradio-companion
加载gnuradio-companion后,我点击创建新流图:
注意新流图已预定义两个块:Options和Variable。Options(ID: top_block)定义我们将使用的工具链库:QT-GUI、WX-GUI、无、分层块等;Variable块(ID: samp_rate)用于选择信号采样率,默认为32ksps(每秒32千样本)。
我将使用HackRF(由osmocom源块支持),使用HackRF时的推荐最小采样率为每秒2M样本。我可以通过在列表中找到并双击osmocom源来选择它。
此时,我可能想将采样率变量从默认的32k(32e3)更改为2M(2e6)。流图中任何指定变量“samp_rate”的块现在将使用新(编辑)值。
为所需(目标)RF中心频率315MHz(315e6)设置变量也很有帮助。这可以通过复制和粘贴“samp_rate”变量块并命名新变量块为“center_freq”轻松实现。
现在我可以右键单击osmocom源块,将默认CH0频率(100e6)更改为变量“center_freq”。我的流图现在如下所示:
注意两个变量“samp_rate”和“center_freq”的值现在被osmocom源块遵循。定义变量在流图规模增大和可读性降低时非常有用。
此外,注意osmocom源的蓝色输出。蓝色表示将提供复数值(实部和虚部)。如果输出颜色为橙色,则输出为实数值(整数、浮点数、绝对值等)。这是一个需要了解的重要概念。输入和输出颜色必须匹配,否则将抛出错误。不匹配可以通过编辑违规块的输出类型或输入类型属性来纠正。
最后,注意osmocom源(ID)以红色字母显示。GNU Radio使用红色表示流图中的错误。此处错误源于源块缺少输出连接。当我添加输出(汇)块并将两个块连接起来时,此错误将得到解决。
创建汇:
为完成我的“初步”流图,我需要添加一个FFT汇,以便监控信号活动并确保一切按预期工作。这可以通过在Instrumentation下选择QT-GUI频率汇块来实现。我需要进入属性窗口并指定变量“center_freq”作为中心频率参数。此外,我需要将osmocom源的输出连接到QT-GUI频率汇的输入。
要执行我的流图,我点击绿色执行按钮。
这应打开一个FFT窗口,显示HackRF接收到的315MHz RF信号。
此时,我可以看到流图正在以315MHz中心频率采样2MHz带宽。到目前为止,流图似乎按预期工作。
接下来,我希望能够按下FOB上的“解锁”按钮并显示结果信号。这可以使用相同的流图实现,但首先我需要进入运行的FFT窗口并点击鼠标中键。这将打开一个下拉菜单,我可以在其中选择“Max Hold”。此功能将显示任何高于当前显示信号的信号。
启用Max Hold执行我的流图,当我点击FOB按钮时,显示如下:
捕获FOB解锁信号以重放:
为捕获生成的FOB信号并保存到文件,我需要在流图中包含另一个汇块(输出)。此新块可在文件操作符下找到,称为文件汇。右键单击允许我打开属性窗口并输入捕获原始数据的文件名。我选择将此文件命名为“fob_capture”。
我的修改后流图现在如下所示:
执行流图并捕获FOB信号后,生成一个49.3M字节的原始文件。
目录列表:
-rw-r–r– 1 root root 49311744 Nov 10 21:06 fob_capture
从捕获文件重放FOB信号:
要重放捕获的信号,我们通常可能创建一个全新的流图,但为演示“禁用块”功能,我决定仅禁用osmocom源、QT GUI频率汇和文件汇块。禁用后,这三个块现在显示为灰色。
接下来,我使用文件操作符下的文件源块创建了一个新源块。我打开块属性并输入先前捕获的文件名“fob_capture”。
然后我创建了先前使用的QT-GUI频率汇(FFT)块的副本(复制和粘贴),以便观察重放的信号。
最后我使用了一个osmocom汇块,通过HackRF实际传输重放信号。
我的修改后流图现在如下所示:
以下视频(用手机拍摄)显示了执行此流图的结果:
其他有用GNU Radio信息:
如果您有使用硬件设备(如示波器、频率发生器、频率计数器、频谱分析仪等)的经验,很高兴知道这些设备可以添加到流图中,以进一步补充项目开发和测试。
以下演示了使用示波器在更低级别锁定实际捕获的FOB信号,显示实际数字脉冲(组成代码)。尽管此级别信息对于重放攻击并非必需,但了解这些选项可用是好事。
另请注意,我使用WX-GUI库演示示波器块,而非先前使用的QT-GUI库。
节流块(何时及为何使用):
同样值得提及的是节流块,可在列表中的“杂项”类别下找到。节流块通常直接附加到“非硬件”源块(信号源块等)的输出,以限制该源块创建样本的速率。我们使用节流块来限制样本流,使得平均速率不超过指定速率(samp_rate)。
节流块应仅当流图中不包含速率限制块(通常是硬件,如SDR加密狗、扬声器、麦克风等)时使用。例如,节流块可用于模拟实际硬件但缺少实际时钟的流图中。
在以下示例流图中,如果我们移除节流块,输出看起来相同,但CPU将达100%且GNU Radio可能崩溃。这是何时使用节流块的好例子。
还应注意,“节流”采样在精确控制样本速率方面并不非常准确。这需要通过连接到采样时钟的源或汇(如USRP或声卡)来控制,此时不应使用节流块。
一般来说,节流块通常不必要,应避免使用,尤其是在使用硬件源(如USRP、SDR-RTL等)时钟时。这是因为节流块是一个糟糕的时钟,通常会导致双时钟问题,并可能产生非常糟糕的结果。经验法则是:如果流图连接了无线电设备(如USRP、SDR-RTL等)或音频设备(如声卡等),请勿使用节流块。
总结:
如开头所述,尽管我能够从FOB捕获解锁信号并重放该信号,我仍认为此努力是成功的(即使我并未实际通过重放解锁车辆)。
未来,新的RF(射频)相关项目无疑将出现。新漏洞将被暴露。凭借通过软件(流图)模拟昂贵无线电硬件的能力,GNU Radio将始终是我武器库中有价值的工具。
这无疑是一场猫鼠游戏,但得益于信息安全社区的持续研究和贡献,我们可以继续分享知识,努力保持系统安全。