DroneSecurity (NDSS 2023)
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 3 年前 | ||
| 3 年前 |
DJI OcuSync 2.0无人机识别接收器
本项目是针对DJI无人机识别协议(Drone-ID)的接收器。该接收器既可实时通过软件定义无线电(SDR)工作,也能离线处理预先录制的数据捕获。
在NDSS'23会议上的论文《无人机安全与DJI DroneID之谜》中,我们详细介绍了协议和接收器设计:无人机安全与DJIGO无人机ID的神秘案例 [PDF]
如果您寻找的是模糊测试工具,我们即将上传。
该实时接收器经过以下设备测试:
- Ettus USRP B205-mini
- DJI Mini 2, DJI Mavic Air 2
我们的软件是一种概念验证接收器,用于逆向工程未知协议,因此,并未针对恶劣射频条件、性能或范围优化。

示例文件
我们在samples/文件夹提供了示例文件。
这些样本直接来自实时接收的第一阶段,它能够检测候选帧而不会进行其他数据处理;通常会直接交给离线测试用的代码处理。
您可以使用inspectrum可视化原始样本文件:
sudo apt install inspectrum
inspectrum -r 50e6 samples/mini2_sm

快速入门(离线)
创建Python虚拟环境并安装依赖项:
python3 -m venv .venv
source .venv/bin/activate
pip3 install -r requirements.txt
现在,您可以在示例文件上运行解码器:
./src/droneid_receiver_offline.py -i samples/mini2_sm
``**
### 结果
脚本执行探测和解码,就像实时接收器一样操作。它会打印每个无人机ID帧解码后的载荷:
```json
## 无人机ID载荷 ##
{
"pkt_len": 88,
"unk": 16,
"version": 2,
"sequence_number": 878,
"state_info": 8179,
...
"app_lat": 43.26826445428658,
"app_lon": 6.640125363111847,
...
"crc-packet": "c935",
"crc-calculated": "c935"
}
总结包含了解码统计信息和飞行路径。在mini2_sm样本中,由于无人机尚未锁定GPS坐标,仅发送了智能手机的位置:
$ ./src/droneid_receiver_offline.py -i samples/mini2_sm
...
Frame detection: 10 candidates
Decoder: 9 total, CRC OK: 7 (2 CRC errors)
Drone Coordinates:
App Coordinates:
(51.447176178716916, 7.266528392911369)
...
而在samples/mavic_air_2中,同时传输了无人机和智能手机的位置:
$ ./src/droneid_receiver_offline.py -i samples/mavic_air_2
...
Decoder: 1 total, CRC OK: 1 (0 CRC errors)
Drone Coordinates:
(51.44633393111904, 7.26721594197086, 12.8)
App Coordinates:
(51.44620788045814, 7.267101350460944)
实时接收器
实时接收器还需要UHD驱动程序以及相当强大的硬件(尤其是对于50 MHz带宽的捕捉)。
环境要求:
- Ettus USRP B205-mini
- DJI Mini 2, DJI Mavic Air 2
首先设置Python环境。由于需要UHD驱动,这无法在虚拟环境中完成。如果之前激活了虚拟环境,请先退出。安装Python需求:
pip3 install -r requirements.txt
安装UHD:
sudo apt install libuhd-dev uhd-host python3-uhd
运行接收器:
./src/droneid_receiver_live.py
接收器会跳过一系列频率,一旦检测到无人机即锁定该频段。
深入探讨:脚本输出

如果您希望更深入地了解处理步骤,建议以--debug选项调用离线解码器,这将启用一个GUI进行逐步解码。
./src/droneid_receiver_offline.py -i samples/mini2_sm --debug
首先,SpectrumCapture类执行包检测并将捕获文件分割为独立的帧:
Packet #0, start 0.000076, end 0.000721, length 0.000644, cfo -12207.031250
...
一些帧可能是假阳性,我们不期待它们能成功解码。开始和结束时间以秒为单位,可以使用inspectrum查看单个帧。
接下来,Packet类检测Zadoff-Chu序列并进行时间和频率偏移校正,然后将帧分割为单独的OFDM符号。
FFO: -6546.528614
Found ZC sequences: 600 147
ZC Offset: -2.867868
Decoder类获取OFDM符号并使用QPSK对子载波进行解调。由于不知道QPSK的方向,我们采用穷举法处理方向问题。decoder.magic()执行解扰和涡轮解码。
DroneIDPacket将结果位流解包成无人机ID结构。此时,消息可能已被解码,但可能已损坏(需进行CRC检查)。
错误的CRC很容易识别,例如从序列号(应为'SecureStorage?')可以看出:
"serial_number": "Sa#upeStore&q?\u0010\b",
...
"crc-packet": "d985",
"crc-calculated": "9b01"
}
CRC Check FAILED!
最后,我们会打印一些统计信息:
Successfully decoded 14 / 34 packets
4 Packets with CRC error
总体而言,我们解码了18个包,其中14个具有正确的CRC。这符合预期,因为样本文件包含质量大相径庭的无人机ID帧。
常见问题解答(FAQ)
DJI 的无人机标识(Drone-ID)与基于蓝牙或 Wi-Fi 的标准化“远程标识”相同吗?
不同。DJI 使用专门的无线协议为其无人机标识服务,因此需要安装接收器来实现功能。
我能使用这个软件定位其他制造商的无人机吗?
不可以。这个软件只解码 DJI 特定的协议,不适用于基于 Wi-Fi 或蓝牙的“远程标识”。
没有这款软件我还能定位无人机吗?
可能可以。自 2022 年底以来,美国和欧盟开始要求无人机制造商实施基于 Wi-Fi 或蓝牙的国际标准“无人机远程标识”。你可以使用智能手机应用来定位支持该标准的无人机。新的无人机已经内置了基于 Wi-Fi/蓝牙的“远程标识”,而现有的无人机正在逐步升级(例如,通过固件更新)。
在哪里可以找到更多关于基于 Wi-Fi/蓝牙的远程标识的信息?
欧盟的标准文档:EN 4709;美国的标准:ASTM F3411。 实际操作信息可参考联邦航空管理局(FAA)的此页面。如果你在寻找开源实现(如 Android 应用),我们推荐访问 opendroneid.org 和他们的 GitHub 存储库。
你们是否计划改进接收器,添加新功能或移植到其他 SDR?
目前我们没有计划新增特性。这个工具作为学术论文的一部分提供,旨在让研究人员复现我们的研究结果,并帮助研究隐私影响。它不是为了实际、可靠的无人机定位设计的。
你们的接收器是唯一可用的接收器吗?
不是。proto17/dji_droneid 中的代码是并行开发的。我们认为它很棒,如果你对细节感兴趣,应该查看两个实现版本。
引用论文
如果你想引用我们的工作,请使用以下 BibTeX 入口:
@inproceedings{schiller2023drone,
title={Drone Security and the Mysterious Case of DJI's DroneID},
author={Schiller, Nico and Chlosta, Merlin and Schloegel, Moritz and Bars, Nils and
Eisenhofer, Thorsten and Scharnowski, Tobias and Domke, Felix and Sch{\"o}nherr, Lea and Holz, Thorsten},
booktitle={Network and Distributed System Security Symposium (NDSS)},
year={2023}
}