0x00 前言
由于之前在研究 RTL-SDR 时受挫 (没有空旷的场地架天线), 我放弃了购买 HackRF 进一步研究的想法.
不过在搜索时发现的另外一些比较有创意的 (离谱的) SDR 发射方法引起了我的兴趣, 故成此文.
随意发射无线电信号很可能违反当地的无线电相关规定, 在尝试操作前须悉知当地的无线电相关法规并掌握足够的无线电知识. 请参考本文文末的信息以及对应项目文档的警告.
0x01 rpitx
这是一个在 Raspberry Pi 系列单片机上运行的 SDR, 仅仅需要一个受支持的 Raspberry Pi 和可选的一小节导线作为天线就能使用 Pi 发出从 5kHz 到 1500MHz 的无线信号.
作者在 GitHub 仓库 F5OEO/rpitx 中展示了不少用法, 但没怎么提及其原理. 我找到的唯一相关资料是作者本人介绍这个项目的一段 Youtube 视频, 感兴趣的话可以完整看一下.
(TL;DR 作者通过控制 Broadcom BCM2835 的 PLL 在多个可选的频率上快速切换, 模拟出任意频率下的信号; 并通过 DMA 实现稳定速率的采样信号发送.)
虽说我一直嫌弃树莓派的性能差 IO 少价格还贵, 但树莓派的软件支持确实完善. 于是我马上去整了一块 Raspberry Pi Zero 来进行实验. (p.s. 后来发现其实 Zero W会更方便一些, 不需要额外外接 USB 网卡就可以直接连 WIFI)
装好 Raspberry Pi OS 连上网络后, 直接 clone rpitx 的仓库并执行其中的 install.sh
就能一键安装.
在国内的 430-440MHz 的业余频段上尝试一下官方在仓库中提供的实例, 并用 RTL-SDR 作为接收端, 在 Pi 旁边接收信号:
Chirp 示例会在指定的频率附近生成一个移动的信号峰
在 434.5MHz 广播一小段 Wav 音频
可以看到除了指定的 434.5MHz 上有信号, 附近也有很多其它产生的”噪音”信号, 但如果接收端稍远一些, 就只能接收到目标频段上的信号了.
在不到 2 米外接收 FM 广播, 噪音已经消失, 只剩下目标频段的信号了(频谱图中其他峰是附近的其他设备, 不是 Pi 发出的)
当然在完全没有接天线的情况下, 走到不到 10 米开外就几乎接收不到任何信号了.
除了作者给出的十几种示例外, 作者还给了一个 sendiq
的小工具, 可以用于重放捕获或使用其他工具生成的 IQ 格式文件 (虽然受限于这种发射方式的原理, 采样率只能到 250kS/s, 最大理论带宽就被限制到了 125kHz):
1 | sendiq -0.2 |
0x02 osmo-fl2k
如果说 RTL-SDR 和 rpitx 的玩法还算是在意料之中, 那 osmo-fl2k 这位的创意则是让人眼前一黑.
这个项目只需要用电脑控制一个 USB3.0 转 VGA 的转接器 (??) 就能发送高达 155MS/s 采样率的信号, 并且由于 VGA 输出没有低通滤波, 我们可以从原本的输出中得到很多谐波, 达到比原本的 165MHz 输出高得多的频率. (下文模拟了高达 1575MHz 的 GPS 信号)
你没看错, 拿来当 SDR 的大概就是这么一个玩意儿, 网上不到 30 块就能买到
根据其项目首页, osmo-fl2k 逆向了 Fresco Logic FL2000 这款转接芯片的 USB 通信协议, 可以通过发送自定义的数据包产生任意需要的模拟信号. (考虑到 VGA 原本就是一个高频的模拟信号, 所以这个转接芯片其实就是个 DAC, 这么想倒也没那么离谱)
当然, 在转接器选购上, 我们必须要买使用 FL2000 这个特定芯片的. 现在淘宝上能找到的 USB转VGA
有 MS2160 和 FL2000 两种芯片方案的, 比较坑的是现在不同型号的芯片用的都是完全一样的外壳, 外观上不能分辨, 并且商家自己可能也搞不清楚, 我成功连续买错了三次.
官方文档给出的分辨方法是: 商品标称是 USB3.0转VGA
, 不支持 Mac 系统, 并且描述提到了 “USB3.0 模式输出 1920x1080, USB2.0 模式输出 800x600” 相关信息的大概率是 FL2000.
但我实测这个方法并不靠谱, 因为他喵的很多商家的商品介绍都是抄的或者从不更新. 我买的是明确写出不支持 MacOS 的转接卡, 结果到手一看还是支持 Mac 的 MS2160. 我在淘宝上按这个标准连买三次, 买的全是错的.
USB3.0 转 VGA 本身就是一个小众的品类, 我发现一个小技巧, 就是去 1688 直接搜索 FL2000
购买. 1688 上很多商品会标明型号, 如果标明了一般是对的. 也可以直接问下客服确认, 这里的客服作为批发商客服基本都了解芯片型号.
在几经波折, 等了四轮快递之后我终于拿到了正确型号的转接器. 如标题所示, 我们来尝试伪造一下 GPS 信号.
东西到手后不用安装其自带的驱动, Windows 下只需用 Zadig 装一个 libusb 驱动, 并下载其 git CI 上构建好的 Windows 二进制就可以开始了.
先使用 fl2k_test
测试一下是否能识别到设备以及适合的发射采样率.
1 | $ ./fl2k_test.exe -s 158e6 |
可以看到我电脑能以大约 155MS/s 的速率发送样本, 和 Wiki 上列出的大部分设备接近, 此时是 USB3.0 限制了速率. 不过此时的 PPM 波动很大, 会导致发射的信号很不稳定, 我们主动降低速率进行测试.
1 | $ ./fl2k_test.exe -s 138e6 |
在我关闭电脑上额外的应用, 拔掉不需要的 USB 设备, 使用 138MS/s 的速率发送时, PPM 稳定了很多. 我们就采用采样率 138MHz, PPM 130 这组参数继续. GPS 接收设备对频率要求严格, 所以这里要确保 PPM 波动不大.
使用 fl2k-examples 这个仓库中的 GPS 示例, 用 gps-sdr-sim 生成一个包含伪造 GPS 信号的 I/Q 文件.
1 | gps-sdr-sim -e brdc0660.25n -l 30.0,125.0,100 |
其中 brdc0660.25n
是来自 NASA 每日发布的 RINEX 格式的某种星历, 可以去 NASA 的网站下载 (偷懒的话也可以用仓库里自带的, 不过时间比较旧), 后面的三个值是要模拟的纬度, 经度和高度.
生成完得到一个 gpssim.bin
文件, 我们的 FL2000 无法直接发送这么高频率的文件, 还要下载一个 GNU Radio, 打开仓库中给出的grc
文件, 对这个 gpssim.bin
文件进行处理.
一定记得修改左上角的 PPM 变量成自己实测的值, 以及选择输入输出文件
处理完成后得到的新的 bin 文件就可以直接发送了:
1 | fl2k_file -s 138e6 gpssim_resample.bin |
这里我尝试了两个接收设备:
第一个是电脑通过 USB 串口外接的 GPS 模块, 他有一个专用的天线, 接收信号很快, 大概十几秒定位就能更新, 在 FL2000 的附近半米都能收到.
电脑收到很强的 GPS 信号, 并定位到了伪造的位置
另一个是我的手机, 手机接收信号就要困难一些, 需要把手机贴在和 FL2000 很近的地方, 耐心等那么几分钟, 手机才能被定位到新位置.
手机的内置 GPS 也成功收到伪造的卫星, 定位到了 30.0,125.0 (开地图软件看的话就是飞在海上)
0x03 小结&注意事项
一开始是真没想到能用一个 VGA 转接头模拟 GPS 信号, 这明显是一些很 hacky 的方式, 但足以满足小范围的实验需求, 而且价格比一系列昂贵的 SDR 设备差出了1-2个数量级.
不过, 这两种方式产生的信号都会产生大量的谐波和目标信号以外的噪音, osmo-fl2k 本来就是利用谐波产生高频信号, rpitx 的 PLL 方波会产生很多额外的噪音. 如果不经滤波, 使用天线发射这样的信号会干扰其他频段上正常的无线电应用, 还可能被无线电当地管理机构找上门, 所以要正经发射还是买专用设备吧.
本文中我的实验都在室内进行, 在使用小段导线作为天线时, 信号影响范围不超过一个房间, 并在几分钟内就停止了发射.
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/hacky-tx-sdr/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬