---
name: re-sdr
type: atomic
description: >
  射频逆向：信号采集、频谱分析、解调、帧同步与协议恢复、重放。
  触发词：SDR、射频、信号分析、解调、RTL-SDR、HackRF、无线协议、遥测。
capabilities: [rf-analysis, sdr-analysis]
---

# 射频信号逆向（SDR）

## 何时使用 / 何时不用

- 用：无线协议/遥控/遥测信号（IoT 无线、遥控器、遥测链路）、信号级协议恢复
- 用：433/868/915MHz ISM 频段传感器/遥控设备快速识别（`rtl_433` 自带解码器，见 [[commands]]）
- 用：重放攻击验证（仅授权目标——先把帧解出来再重放，别盲放）
- 不用：有线协议（转 [[re-protocol]]）；无线 IoT 协议已封装分析（转 [[re-iot-proto]]）
- 不用：只分析已解调的数据流/应用层（直接 [[re-proto-rev]] / [[re-crypto-decrypt]]）
- 不用：多通道同时监测（单 RTL-SDR 单通道；多通道需多设备或相位一致的采集方案）

## 工具准备

### RTL-SDR / HackRF（接收硬件）

- 选购指引：RTL-SDR（接收，低成本入门）/ HackRF（收发，重放需要）
- 驱动: `apt install rtl-sdr` / `brew install rtl-sdr`；HackRF: `apt install hackrf` / `brew install hackrf`
- 验证: 硬件插入后 `rtl_test` 或 `hackrf_info` 有输出
- 频率校准: `rtl_test -p` 挂几分钟读稳定 ppm 误差值，采集时 `rtl_sdr ... -e <ppm>` 补偿——频率偏移是解调乱码的首要原因
- 带宽差异: RTL-SDR 稳定带宽约 2.4MHz（理论 3.2MHz 不稳）；HackRF 最高 20MHz、半双工——宽带采集/主动发射选 HackRF（见 [[gotchas]]）

### GNU Radio（信号处理）

- Linux: `apt install gnuradio` / `pacman -S gnuradio`；macOS: `brew install gnuradio`
- Windows: 官方安装包
- 验证: `gnuradio-companion --version` 或 `grcc --version`
- 无头编译: `grcc flow.grc` 把流程图编译成可执行 Python 脚本——批量/重复解调链用文件管理比每次 GUI 拖线快

### Gqrx（频谱/接收 GUI）

- Debian/Ubuntu: `apt install gqrx-sdr`（注意包名带 -sdr 后缀）；Arch: `pacman -S gqrx`；Fedora: `dnf install gqrx`；macOS: `brew install --cask gqrx`
- 验证: `gqrx --version`（或 GUI 能打开并看到频谱瀑布）
- 用途: 实时频谱/瀑布图快速定位活跃信号与中心频率，比命令行扫频直观

### inspectrum（频谱/时序可视化）

- Linux: `apt install inspectrum` 或源码编译；macOS: `brew install inspectrum`
- 验证: `inspectrum --version`
- 用途: 对录好的 IQ 文件做离线时域/频谱分析（找帧结构、符号宽度）

### Universal Radio Hacker (URH)（解调与帧恢复）

- 多平台: `pip install urh`
- 验证: `urh --version`
- 用途: 解调（调制识别）、位流分析（同步字/编码反转）、字段划分一体

### rtl_433（ISM 频段传感器解码）

- Debian/Ubuntu: `apt install rtl-433`；Fedora: `dnf install rtl-433`；macOS: `brew install rtl_433`（下划线）；Arch: `pacman -S rtl_433`
- 验证: `rtl_433 -h` 列出支持设备列表（如 0: 通用协议族、1: 温湿度计……）
- 用途: 433/868MHz 气象站/温湿度/车库门等常见遥控协议一键解码
- 持续输出: `rtl_433 -F json -f 433.9M` 按 JSON 持续打印解码结果——长时间监测/采集多个设备信号时配合日志重定向

## 操作步骤

按顺序执行；仅限授权测试（红线：重放/交互需授权）。

1. **信号采集与频谱分析**：
   ```sh
   # 示例（工具可替换）：GNU Radio 或命令行采集
   rtl_sdr -f 433.9M -s 1M capture.iq
   ```
   - 先全频段扫（找活跃信号）→ 定中心频率与带宽 → 采集 IQ
   - 扫描: `rtl_power -f 400M:470M:250k -g 40 -i 10 scan.csv`（输出 CSV，可用 gnuplot 画图）或用 Gqrx 瀑布图
   - 调制识别：频谱形状（FSK 双峰/PSK 平坦/AM 载波）；Gqrx 实时看，inspectrum 离线细看
   - 采集参数: `rtl_sdr -f <频率> -s <采样率> -g <增益> -n <采样数> out.iq`；`-g 0` 自动增益
   - 采样率原则: 采样率 ≥ 2×信号带宽——窄带遥控（几十 kHz）用 250k–1M 足够，别为省事开满 2.4M 徒增文件体积

2. **解调**：
   - URH：加载 IQ → 自动/手动调制识别 → 解调出位流
   - GNU Radio：按识别结果搭解调链（AM/FM/PSK/QAM/FSK）
   - 快速监听: `rtl_fm -f 433.9M -M fm -s 22050`（FM 语音/FSK 音频监听，听/录音频辅助识别）
   - 产出：解调位流（0/1 序列）

3. **帧同步与协议恢复**：
   - URH 打开捕获文件 → 位流分析视图找同步字、试编码反转（NRZ/Manchester）
   - 找同步字（重复模式/固定前缀）→ 定帧边界 → 字段划分（地址/长度/载荷/CRC）
   - 多帧对照（重复发射）→ 不变字段=固定头、变化字段=数据/序号
   - 位流转字节: 先确认位序（MSB/LSB first）与长度对齐（8 的倍数）——URH 默认按位显示，转字节前核对，否则字段划分全错
   - 产出：帧结构表（字段偏移/长度/语义）
   - 已知 ISM 设备: 先跑 `rtl_433 -f 433.9M -A`（`-A` 分析模式打印解出的脉冲序列与协议猜测）——常见协议（气象站/车库门/胎压）直接命中，省去人工恢复

4. **重放与交互**（授权场景）：
   - HackRF 回放捕获帧（重放攻击验证——仅授权目标）:
     ```sh
     hackrf_transfer -r capture.iq          # 先采集（HackRF 口）
     hackrf_transfer -t capture.iq -f 433.9M -a 1 -s 2M   # 回放（-a 1 开放大器）
     ```
   - 交互式：改字段重发（滚动码/加密需先分析算法——转 [[re-crypto-id]] / [[re-crypto-decrypt]]）
   - 重放前先验证采样率/增益与采集时一致——参数不匹配重放出去目标收不到（见 [[gotchas]]）

5. **证据整理（收尾）**：IQ 文件、解调位流、帧结构表（字段偏移/长度/语义）、重放记录（时间/参数/结果）对照入档；结论写 [[re-analyze/analysis-contract]]——信号级证据（截图/波形）与协议级结论（帧结构）分开归档

## 跨域联合

- [[re-iot-proto]]：无线 IoT 协议衔接（MQTT/CoAP 等封装层）
- [[re-protocol]]：帧结构状态机重建衔接
- [[re-crypto-id]] / [[re-crypto-decrypt]]：载荷加密分析
- [[re-feedback]]：信号案例经验沉淀（脱敏后）

## 常见坑与陷阱

- **频率偏移/采样率错误**：现象——解调全乱码；原因——中心频率偏、采样率不匹配；对策——先用已知信号（FM 广播）校准
- **调制误判**：现象——FSK 当 PSK 解；原因——频谱特征相似；对策——对照时域波形（inspectrum）再定
- **重放需授权**：现象——未授权重放触发设备动作；原因——越界操作；对策——红线：仅授权目标
- **编码反转漏看**：现象——位流全反；原因——NRZ/Manchester 未识别；对策——试反相与编码模式组合
- **捕获不完整**：现象——帧被截断；原因——带宽不够/触发时机；对策——加宽带宽、延长采集、按同步字触发
- **RTL-SDR 镜像频率/带宽限制**：现象——采到的信号在错误频率出现、带宽超 2.4MHz 后解调全乱；原因——直接采样混叠、USB 传输不稳；对策——带宽 ≤2.4M、先 `rtl_test -p` 校准 ppm 后用 `-e` 补偿（详见 [[gotchas]]）
- **URH 对复杂调制支持弱**：现象——DSSS/OFDM/跳频信号 URH 解不出稳定位流；原因——URH 面向简单调制（ASK/FSK/PSK）设计；对策——频谱扩展类信号改用 GNU Radio 搭完整解调链（解扩/均衡），URH 只做后续位流分析
- 硬件差异、工具特有坑见 [[gotchas]]；命令速查见 [[commands]]
