haxorthematrix/semaeopus
GitHub: haxorthematrix/semaeopus
Semaeopus 是一个用于卫星安全教育和攻击演练的 CubeSat 黑客平台。
Stars: 0 | Forks: 0
# on" in English. "Checkout" might be a term from version control, but it's common. Translate to Chinese: "与路径A相同的检出 + Python安装,然后:".
[](#running-the-tests)
[](LICENSE)
[](https://semaeopus.net)
**一个真实的 CubeSat 黑客平台。** 从面包板和 Raspberry Pi Pico 构建一个 FlatSat 卫星 + 两个地面站,*或者*在您的笔记本电脑上运行纯软件模拟器。然后通过一门 13 课的课程来攻击它,该课程反映了真实卫星安全在现实中如何失败。
## 目录
1. [什么是 Semaeopus](#what-semaeopus-is)
2. [三种使用方式](#three-ways-to-use-it)
3. [快速开始](#quick-start)
4. [架构](#architecture)
5. [物料清单](#bill-of-materials)
6. [接线](#wiring)
7. [软件依赖](#software-dependencies)
8. [安装](#installation)
9. [运行测试](#running-the-tests)
10. [课程](#curriculum)
11. [仓库布局](#repository-layout)
12. [安全、合法性与道德](#safety-legality--ethics)
13. [许可证](#license)
## 什么是 Semaeopus
Semaeopus 重现了现代 CubeSat 的 **TT&C 链路**(遥测、跟踪与指挥),其逼真程度足以让课程知识迁移到真实的航天器工作中。空口协议是一个经过刻意简化的 [CCSDS 空间数据包],运行在 **ISM 433.92 MHz(欧盟)** 或 **915 MHz(美国)** 的 2-GFSK CC1101 PHY 之上——这与当今小型卫星运营商使用的协议栈形状相同,只是用面包板上的通孔模块代替了飞行集成。
该平台附带**四个安全等级**,您可以依次进行攻击:
| 等级 | 认证 | 机密性 | 重放防御 | 仍然有效的攻击 |
|------|--------------------------|--------|------------------------|----------------------------|
| L0 | 无(明文) | 无 | 无 | 重放、注入、窃听 |
| L1 | 仅对正文进行 HMAC | 无 | 无(HMAC ≠ 新鲜度) | 重放、窃听 |
| L2 | 对 `nonce ‖ body` 进行 HMAC | 无 | 严格的单调递增 nonce | 窃听、拒绝服务 |
| L3 | + AES-128-CTR | 是 | 严格的单调递增 nonce | DoS、侧信道 |
通过更改 `firmware/satellite/config.py` 中的一个常量(或向模拟器传递 `--security N`)来切换。课程将引导您逐个攻破每个等级。
这是**教育**:目标是让您离开时知道真实的飞行链路如何出错以及如何防御它们,而不是去攻击其他人的航天器。参见[安全、合法性与道德](#safety-legality--ethics)。
## 三种使用方式
| 路径 | 所需硬件 | 首个数据包时间 | 您可以做什么 |
|------|----------|----------------|----------------------------------|
| **A. 模拟器** | 无——仅需 Python | ~ 1 分钟 | 课程 L04–L12。重放与注入。端到端协议攻击。 |
| **B. 合成射频** | 无(+ 可选 SDR) | ~ 5 分钟 | 通过预渲染的 `.cu8` IQ 文件学习课程 L01–L04。构建 GFSK 解调器。 |
| **C. 真实硬件** | ~ 35 美元的零件 | ~ 2 小时 | 全部内容,包括 L09 对真实硅片的计时侧信道攻击和 L10 使用 HackRF 的射频干扰。 |
您**今天**就可以在零硬件的情况下运行路径 A 和 B。路径 C 是使用以下物料清单进行的完整工作台搭建。
## 快速开始
```
git clone https://github.com/haxorthematrix/semaeopus
cd semaeopus
pip install pyserial pytest
# 8. "07_radio_loopback.py needs two Picos+CC1101s; runs at the next stage" – Here, "07_radio_loopback.py" is a Python script, so keep it in English. "Picos" might refer to Raspberry Pi Pico, so keep it in English. "CC1101s" is a component, keep in English. Translate the rest: "需要两个Picos+CC1101s;在下一阶段运行".
python -m sim.virtual_satellite
# 9. "Operator's Pico — uses the GS front-end firmware" – "Operator's Pico" is a specific term, keep "Pico" in English. "GS front-end firmware" – "GS" might be ground station, so keep it in English. Translate: "操作员的Pico — 使用GS前端固件".
python -m groundstation.operator.gs --sim
op> ping
op> req 12
op> safe
# 10. "expect: 37 passed, 1 skipped in ~23 s" – This looks like test results. "Passed" and "skipped" are terms, translate appropriately. "s" is for seconds. So, "预期:37通过,1跳过,约23秒".
python -m groundstation.attacker.capture --sim --out cap.jsonl
# Now, I need to ensure that each translation is on a separate line, and there are exactly 10 lines. Also, only output the translations, no additional text.
python -m groundstation.attacker.inject --sim --apid 0xFF
```
要使用文本 TUI 仪表板而不是普通 CLI:
```
pip install textual rich
python -m groundstation.operator.tui --sim
```
有关 SDR / GNU Radio 路径,请参见 [`lessons/L02_demod_gnuradio.md`](lessons/L02_demod_gnuradio.md)。
要进行完整的硬件构建,请跳转到[安装 §C — 真实硬件](#c-real-hardware)。
## 架构
```
┌───────────────────────────────────────────────────────────────────────┐
│ SEMAEOPUS │
│ │
│ ┌──────────────────┐ ┌─────────────────────┐ │
│ │ "SATELLITE" │ │ OPERATOR GROUND │ │
│ │ (FlatSat) │ │ STATION │ │
│ │ │ <── 433/915 MHz ──> │ │ │
│ │ Pi Pico + CC1101 │ ISM downlink │ Pi Pico + CC1101 │ │
│ │ + housekeeping │ ISM uplink │ ↕ USB-serial │ │
│ │ sensors + OLED │ │ Laptop: gs / TUI │ │
│ └──────────────────┘ └─────────────────────┘ │
│ ▲ │
│ │ ┌─────────────────────┐ │
│ │ │ ATTACKER STATION │ │
│ └──── eavesdrop / inject ─────────►│ │ │
│ │ RTL-SDR v3 (RX) │ │
│ │ + Pi Pico + CC1101 │ │
│ │ or HackRF (TX/RX) │ │
│ │ Laptop: capture / │ │
│ │ replay / inject / │ │
│ │ fuzz / jam / spoof │ │
│ └─────────────────────┘ │
└───────────────────────────────────────────────────────────────────────┘
```
在**模拟器**中,将所有三个“Pi Pico + CC1101”框替换为加入 UDP 多播组的 Python 进程。协议层、固件模块和地面站代码在两条路径上是相同的。
| 子系统 | 真实 CubeSat | Semaeopus 类比 |
|--------------|-------------------------------|-----------------------------------|
| OBC(星载计算机) | STM32, SAMD, MSP430 | Raspberry Pi Pico (RP2040) |
| UHF 通信 | NanoCom AX100, EnduroSat UHF | CC1101 @ 433 / 915 MHz |
| EPS(电源) | GomSpace NanoPower P31u | INA219 读取"电池"轨道 |
| ADCS(姿态控制) | 星敏感器 + IMU + 反作用轮 | MPU6050 IMU |
| 热控 HK | 多个 PT1000 / 热敏电阻 | BME280 (T / P / RH) |
| RTC / 时间 | 芯片级原子钟 | DS3231 |
| 遥测信标 | 周期性 AX.25 / CCSDS 帧 | 每 10 秒一次 CCSDS-lite 信标 |
| 载荷 | 相机、科学仪器 | "相机"模拟——返回 JPEG 头 |
完整设计细节在 [`specification.md`](specification.md)。
## 物料清单
所有零件均为通孔件或已预焊在 0.1″ 分线板上。无需 PCB,无需 SMD 焊接。价格为美元,2025 年末零售价。
### 卫星(FlatSat)—— ~ 35 美元
| 序号 | 零件 | 作用 | 数量 | 约 $ |
|----|--------------------------------------------|-------------------------------------|-----|---------:|
| 1 | Raspberry Pi Pico(或 Pico W / 2 / 2 W) | OBC + 无线电控制器 | 1 | 4–6 |
| 2 | CC1101 433 MHz 模块 (E07-M1101D 或类似) | UHF 收发器 | 1 | 3–6 |
| 3 | SSD1306 0.96″ I²C OLED | 状态显示 | 1 | 3–5 |
| 4 | BME280 I²C 分线板 | 环境遥测 (T/P/RH) | 1 | 4–7 |
| 5 | MPU6050 I²C 分线板 (GY-521) | IMU / ADCS | 1 | 2–4 |
| 6 | INA219 I²C 分线板 | 电源遥测 | 1 | 3–5 |
| 7 | DS3231 I²C RTC + CR2032 | OBC 时间 | 1 | 2–4 |
| 8 | 5 mm LED ×2(不同颜色) | 收发活动指示 | 2 | <1 |
| 9 | 220 Ω ¼ W 电阻 ×2 | LED 限流 | 2 | <1 |
| 10 | 半尺寸面包板 (400 孔) | 构建基板 | 1 | 4–6 |
| 11 | 杜邦线跳线套件 (M-M, M-F 混合) | 接线 | 40 | 4–6 |
| 12 | 22 AWG 实心线,17 cm (433 MHz) | ¼ 波长鞭状天线 | 1 | <1 |
| 13 | USB 线缆(匹配 Pico 型号) | 电源 + 串行控制台 | 1 | 2–4 |
### 操作员地面站 —— ~ 20 美元(+ 笔记本电脑)
| 序号 | 零件 | 作用 | 数量 | 约 $ |
|---|-------------------------------------|-----------------------------------|-----|---------:|
| 1 | Raspberry Pi Pico | 射频前端 + USB-串口 | 1 | 4–6 |
| 2 | CC1101 433/915 MHz 模块 | UHF 收发器(匹配卫星) | 1 | 3–6 |
| 3 | SSD1306 0.96″ I²C OLED | 链路状态一目了然 | 1 | 3–5 |
| 4 | 半尺寸面包板 | 构建基板 | 1 | 4–6 |
| 5 | 杜邦线 | 接线 | 20 | 2–3 |
| 6 | 17 cm / 8.2 cm 导线 | ¼ 波长天线 | 1 | <1 |
| 7 | USB 线缆 | Pico → 笔记本电脑 | 1 | 2–4 |
### 攻击者地面站(两个层级)
**第一层 —— 最小配置(~ 45 美元)。** 足够用于课程 L00–L09。
| 序号 | 零件 | 作用 |
|---|-----------------------------------------|-------------------------------|
| 1 | RTL-SDR v3 适配器 + 附带天线 | 宽带接收 24 MHz – 1.7 GHz |
| 2 | Raspberry Pi Pico | 主动发射前端 |
| 3 | CC1101 433/915 MHz 模块 | 主动发射收发器 |
| 4 | 面包板 + 杜邦线 + 导线天线 | (与操作员 GS 相同) |
**第二层 —— 推荐配置(总计 ~ 360 美元)。** 解锁 L10(干扰)和 GPS 欺骗扩展。
| 序号 | 零件 | 作用 | 约 $ |
|---|--------------|---------------------------------------|---------:|
| 1 | HackRF One | 1 MHz – 6 GHz 半双工 SDR | 320–360 |
| 2 | ANT500 | 用于 HackRF 的伸缩天线 | 15 |
**请勿购买** CC1101 + PA/LNA 组合模块。它们会超出 ISM 功率限制,给您带来麻烦。
详细的替代方案说明在 [`hardware/satellite-bom.md`](hardware/satellite-bom.md) 和 [`hardware/ground-station-bom.md`](hardware/ground-station-bom.md)。
## 接线
所有**三块**电路板(卫星、操作员、攻击者-TX)使用相同的 Pi Pico ↔ CC1101 SPI 接线。卫星在此基础上增加了运维传感器。
### Pi Pico 引脚映射(卫星 —— 所有部件)
```
┌─────── USB ───────┐
GP0 │ 1 40│ VBUS (5 V from USB — unused)
GP1 │ 2 39│ VSYS (1.8–5.5 V battery in)
GND │ 3 38│ GND
GP2 │ 4 37│ 3V3 EN
SDA0 ◀── GP4 │ 6 36│ 3V3 OUT ──▶ to all 3V3 rails
SCL0 ◀── GP5 │ 7 35│ ADC_VREF
GND │ 8 33│ GND
MISO ◀── GP12 │16 25│ GP19 ─▶ MOSI (CC1101 SI)
CSn ◀── GP13 │17 24│ GP18 ─▶ SCK (CC1101 SCK)
GP14│19 22│ GP17 ─▶ TX-LED
GP15│20 21│ GP16 ─▶ RX-LED
GDO0 ◀── GP10 │14 26│ GP20 ─▶ SDA1 (DS3231 only)
27│ GP21 ─▶ SCL1 (DS3231 only)
└───────────────────┘
```
### CC1101 ↔ Pi Pico(所有电路板)
| CC1101 引脚 | Pi Pico 引脚 | 说明 |
|------------|-----------------|------------------------------------------|
| VCC | 3V3 OUT (引脚 36)| **仅限 3V3。** 5V 将烧毁芯片。 |
| GND | GND | 任何 GND 引脚 |
| CSN | GP13 | SPI 片选 |
| SCK | GP18 | SPI 时钟 |
| MOSI | GP19 | SPI MOSI |
| MISO | GP12 | SPI MISO |
| GDO0 | GP10 | 数据包结束中断 |
| GDO2 | (未使用) | 保持悬空 |
### I²C 总线 0 —— 传感器 + 显示屏(仅限卫星)
所有四个设备共享 `SDA = GP4` / `SCL = GP5`,外加 3V3 / GND。分线板通常自带上拉电阻,因此通常不需要外部电阻。如果读取不稳定,从每条线到 3V3 加一个 4.7 kΩ 电阻。
| 设备 | 默认地址 | 说明 |
|---------|-----------------|----------------------------------------|
| SSD1306 | 0x3C | 某些板子上是 0x3D —— 检查丝印 |
| BME280 | 0x76 | 如果 SDO 悬空则为 0x77 |
| MPU6050 | 0x68 | 如果 AD0 接高则为 0x69 |
| INA219 | 0x40 | 可通过 A0/A1 焊盘跳线配置 |
### I²C 总线 1 —— RTC(独立总线避免 MPU6050/DS3231 地址 0x68 冲突)
| 设备 | 默认地址 | SDA | SCL |
|---------|-----------------|------|------|
| DS3231 | 0x68 | GP20 | GP21 |
### Let me list the translations line by line:
```
GP16 (RX) ── 220 Ω ──[GRN LED]── GND (active high)
GP17 (TX) ── 220 Ω ──[RED LED]── GND (active high)
```
### 天线
- **433.92 MHz**(欧盟/R1 默认):22 AWG 实心线,**170 mm** 长,焊接或拧接到 CC1101 的 ANT 焊盘。
- **915 MHz**(美国 Part 15.247):相同导线,**82 mm** 长。
保持天线垂直,在工作台上相距 ≥ 30 厘米(太近会使前端饱和接收机)。
### ASCII 面包板图
完整的 ASCII 面包板视图在 [`hardware/wiring-satellite.md`](hardware/wiring-satellite.md) 中,地面站变体在 [`hardware/wiring-ground-station.md`](hardware/wiring-ground-station.md) 中。
## 软件依赖
### 必需(任何路径)
| 包 | 原因 |
|--------------------|--------------------------------------------------|
| Python 3.11+ | 所有主机代码 |
| `pyserial` | 通过 USB-串口连接 Pico 前端 |
| `pytest` | 测试套件 |
```
pip install pyserial pytest
```
### 可选 —— TUI 仪表板
| 包 | 原因 |
|--------------------|--------------------------------------------------|
| `textual` | 用于操作员的交互式终端 UI |
| `rich` | TUI 内部的彩色日志/表格渲染 |
```
pip install textual rich
```
### 可选 —— SDR / GNU Radio 路径(使用真实 RX 的课程 L01–L03)
| 包 | 原因 |
|--------------------|--------------------------------------------------|
| `gnuradio` ≥ 3.10 | 频谱/解调流图 |
| `gr-satellites` | 参考 CCSDS / AX.25 解码器 |
| `rtl-sdr` | RTL-SDR 适配器驱动程序 |
| `hackrf` | HackRF One 驱动程序(可选,用于 L10) |
| `gqrx` 或 `SDR++` | 频谱可视化 |
| `inspectrum` | 离线 IQ 检查 |
Debian/Ubuntu: `sudo apt install gnuradio gr-satellites rtl-sdr hackrf gqrx-sdr inspectrum`。
### 可选 —— 安全等级 3 (AES-CTR + HMAC)
| 包 | 原因 |
|--------------------|--------------------------------------------------|
| `pycryptodome` | CPython 上的 AES-128-CTR(MicroPython 使用内置 `ucryptolib`) |
```
pip install pycryptodome
```
### 可选 —— 硬件路径
| 包 | 原因 |
|--------------------|--------------------------------------------------|
| `mpremote` | 通过 USB 将代码上传到 Pi Pico |
```
pip install mpremote
```
加上刷入每个 Pico 的 MicroPython UF2 文件——见 [`hardware/install-os.md`](hardware/install-os.md)。
## 安装
### A. 模拟器(无硬件)
```
git clone https://github.com/haxorthematrix/semaeopus
cd semaeopus
pip install pyserial pytest
python -m pytest tests/ -q # expect: 37 passed, 1 skipped
python -m sim.virtual_satellite # leave running in one terminal
```
在第二个终端中:
```
python -m groundstation.operator.gs --sim
op> ping # should see PONG within ~1 s
op> req 10 # housekeeping telemetry on demand
op> safe # FORCE_SAFE — satellite reports M1 on next beacon
```
跳转到 [`lessons/L04_telemetry_decode.md`](lessons/L04_telemetry_decode.md) 或后续任何课程——它们默认都仅在模拟器中运行。
### B. 合成射频(无 SDR)
```
# 1. Semaeopus – Keep as is: "Semaeopus"
python -m tools.generate_iq # writes captures/baseline.iq (5 MB)
python -m tools.demod_iq # recovers all 11 frames, prints hex + CRC
```
在 `gqrx` 中打开 `captures/baseline.iq`(文件 → I/Q 文件,类型 "Raw I/Q",采样率 1 Msps)。课程 L02 将引导您完成 GNU Radio Companion 的构建。
### C. 真实硬件
#### 1. 为每个 Pico 刷入 MicroPython
在插入 Pico 时按住 **BOOTSEL** 键。它会挂载为 `RPI-RP2`。拖放匹配的 `.uf2` 文件(见 [`hardware/install-os.md`](hardware/install-os.md) 中的表格)。对第二个 Pico 重复此操作。
#### 2. 接线卫星
按照上面的[接线](#wiring)部分进行。分七个阶段启动,每完成一个阶段运行一个启动检查脚本——见 [`hardware/bringup-checks.md`](hardware/bringup-checks.md):
```
mpremote connect /dev/ttyACM0 run bringup/01_blink.py # MicroPython alive
mpremote connect /dev/ttyACM0 run bringup/02_i2c_scan.py # I²C devices respond
mpremote connect /dev/ttyACM0 run bringup/03_oled_test.py # display works
mpremote connect /dev/ttyACM0 cp -r firmware/satellite/lib :/bringup_lib
mpremote connect /dev/ttyACM0 run bringup/04_sensor_smoke.py # sensors read OK
mpremote connect /dev/ttyACM0 run bringup/05_spi_loopback.py # SPI wiring OK
mpremote connect /dev/ttyACM0 run bringup/06_cc1101_id.py # CC1101 fingerprint
# 2. Terminal 1 — start the virtual satellite – "Terminal 1 — 启动虚拟卫星"
```
每个脚本打印 **PASS** 或 **FAIL**,并在失败时给出关于检查什么的提示。
#### 3. 部署完整固件
```
mpremote connect /dev/ttyACM0 cp -r firmware/satellite/. :/
mpremote connect /dev/ttyACM0 cp -r protocol :/protocol
# 3. Terminal 2 — operator ground station, plain CLI – "Terminal 2 — 操作员地面站, 纯CLI"
mpremote connect /dev/ttyACM1 cp -r firmware/gs_frontend/. :/
mpremote connect /dev/ttyACM1 cp firmware/satellite/lib/cc1101.py :/lib/cc1101.py
```
重置两个 Pico。约 10 秒内,卫星发出第一个信标。
#### 4. 运行操作员 GS
```
python -m groundstation.operator.gs --port /dev/ttyACM1
```
您应该能看到信标、HK_TLM、ADCS_TLM、EPS_TLM 数据流。现在您与模拟器的功能设置**完全相同**——课程的其余部分工作方式完全一样。
## 运行测试
```
python -m pytest tests/ -q
# 4. Terminal 3 — attacker passive capture – "Terminal 3 — 攻击者被动捕获"
```
覆盖率:
| 测试文件 | 验证内容 |
|--------------------------|-------------------------------------------------------|
| `test_space_packet.py` | 编解码往返、CRC 位翻转检测、全部四个安全等级、L1/L2 重放规则、模糊往返 |
| `test_handlers.py` | TC 调度器 —— ping、set-mode、arm/fire 顺序、非法状态转换 |
| `test_sim_e2e.py` | 将虚拟卫星作为子进程生成,并断言注入的 `FORCE_SAFE` 确实将卫星切换到 SAFE 模式 |
| `test_iq.py` | GFSK 调制器自检;如果缺失则重新生成 `captures/baseline.iq` |
| `test_tui_smoke.py` | 操作员 TUI 顺利导入,且 `OperatorState` 产生单调递增的 nonce |
一个跳过的测试是 `test_l3_encrypts_and_authenticates` —— 它需要 `pycryptodome`。
## 课程
所有 13 课(L00–L12)均已编写完成,今天即可运行。
| 编号 | 标题 | 所需硬件 | 仅模拟器? |
|-----|-------------------------------------------|--------------------------|-----------|
| L00 | 构建与首个信标 | 卫星 + 操作员 | 部分 |
| L01 | 频谱勘测 | + RTL-SDR(或使用 IQ) | 使用 IQ |
| L02 | 在 GNU Radio 中解调 | + GNU Radio | 使用 IQ |
| L03 | 帧同步与 CRC | + Python | 使用 IQ |
| L04 | 遥测解码 | (任何) | ✓ |
| L05 | 重放攻击 | + 攻击者 Pico | ✓ |
| L06 | 命令注入 | + 攻击者 Pico | ✓ |
| L07 | 通过重放绕过 HMAC (L1) | (任何) | ✓ |
| L08 | 计数器绑定 HMAC (L2) | (任何) | ✓ |
| L09 | 计时侧信道 —— 恢复完整标签 | (任何) | ✓ |
| L10 | 加密 + 干扰与重放 (L3) | + HackRF 用于完整实验 | 部分 |
| L11 | 信标欺骗 | (任何) | ✓ |
| L12 | 毕业设计 | 全部 | ✓ |
每门课程都是一个自包含的 Markdown 文件,包含构建步骤、预期捕获、讨论问题和防御性实验。见 [`lessons/`](lessons/)。
## 仓库布局
```
specification.md ← full design + threat model + roadmap
README.md ← this file
LICENSE ← MIT (code) + CC-BY-SA 4.0 (lessons & docs)
docs/ ← project website (semaeopus.net)
index.html
style.css
assets/logo.svg
CNAME
hardware/ ← hardware references
satellite-bom.md
ground-station-bom.md
wiring-satellite.md ← ASCII breadboard diagram
wiring-ground-station.md
install-os.md ← MicroPython flash, mpremote setup
bringup-checks.md ← 7-stage wire-then-test sequence
bringup/ ← MicroPython smoke scripts
01_blink.py … 07_radio_loopback.py
firmware/
satellite/ ← MicroPython OBC for the FlatSat
config.py ← per-build knobs (frequency, security level, keys)
main.py ← scheduler + handlers
lib/ ← CC1101 + sensor drivers
obc/ ← scheduler, modes, housekeeping, ADCS, EPS
comms/ ← beacon, handlers, security wrappers
gs_frontend/ ← USB-CDC modem for both GS Picos
groundstation/
operator/
gs.py ← interactive CLI
tui.py ← textual TUI dashboard
attacker/
capture.py ← passive logger
replay.py ← replay captured frames
inject.py ← build & TX an arbitrary TC
fuzz.py ← APID/length fuzzer
jam.py ← bus-level DoS (noise / flood-TC / replay-spam)
spoof_beacon.py ← impersonate the satellite
gnuradio/ ← GNU Radio RX + TX recipes
shared/ ← link.py, decoder.py — common to operator + attacker
sim/ ← software-only simulator
virtual_satellite.py ← reuses real OBC modules over UDP "ether"
radio_bus.py ← UDP multicast radio with synthesized RSSI
sim_link.py ← drop-in Link for the host tools
fakes.py ← FakeBME280 / FakeMPU6050 / FakeINA219 / FakeDS3231
protocol/
space_packet.py ← CCSDS-lite codec, shared everywhere
tools/
generate_iq.py ← GFSK IQ synthesis (2.7 s @ 1 Msps)
demod_iq.py ← pure-Python reference demodulator
verify_iq.py ← modulator self-check
cu8_to_cfile.py ← .cu8 → GNU Radio .cfile
timing_oracle.py ← localhost oracle for L09
timing_attack.py ← byte-by-byte tag recovery
captures/
baseline.iq ← 5 MB synthetic capture
baseline.jsonl ← oracle (decoded frames)
tests/ ← pytest suite
lessons/ ← L00 – L12 curriculum
```
## 安全、合法性与道德
1. **仅限工作台操作。** 默认 433.920 MHz 以 0 dBm 功率配合 17 cm 鞭状天线,完全在欧盟/R1 ISM 限制内,约为美国 Part 15.247 EIRP 的 1/100。它不会到达轨道——但会到达拥有 SDR 的邻居。通过 `firmware/satellite/config.py` 中的 `RF_FREQ_HZ = 915_000_000` 切换到 **915 MHz** 以符合美国法规。
2. **不要使用外部功率放大器。** CC1101 + PA 模块会将 Semaeopus 变成非法的本地干扰器。不要制作。
3. **切勿瞄准业余卫星频率**(435–438 MHz UHF)。CC1101 *可以* 调谐到那里;Semaeopus 默认的 433.920 MHz 刻意设在业余频段之下。
4. **仅在您拥有或拥有明确书面许可测试的系统上练习攻击。** L09 计时预言机、L10 干扰器和 L12 毕业设计是教育工具——应像对待 Metasploit 一样对待它们。
5. **HackRF 干扰与重放实验 (L10)** 可能在大范围内饱和 ISM 频段接收机。在室内实验时,请在 HackRF 输出端接 50 Ω 假负载,或在法拉第笼内工作。
详细的法律/安全讨论在 [`specification.md`](specification.md) §9。
## 许可证
- **代码** —— MIT(见 [LICENSE](LICENSE))
- **课程、硬件文档、本 README、项目网站** —— 知识共享署名-相同方式共享 4.0 国际许可协议 (CC-BY-SA 4.0)
您可以自由地重复使用、修改、教授和商业化代码。课程和文档可以在相同的共享条款下重复使用——在 CC-BY-SA 下重新发布改进,以便他人受益。
## 状态与贡献
当前状态:**v0.2 —— 软件完成;硬件待启动。**
- 所有 13 课已编写完成并可在模拟器中运行。
- 37 个主机端测试通过。
- 硬件构建已详细记录;尚未在物理部件上端到端验证。
欢迎在 [github.com/haxorthematrix/semaeopus](https://github.com/haxorthematrix/semaeopus) 提交问题、PR 和课程贡献。
如果您构建了硬件,请分享您的启动日志以及您发现的任何 CC1101 寄存器调优说明——这是下一个最大的未解决问题。
项目网站:[semaeopus.net](https://semaeopus.net)。
标签:ISM频段, 卫星安全, 地面站模拟, 安全级别, 安全课程, 攻击演练, 无线电攻击, 无线通信安全, 树莓派Pico, 渗透测试训练, 硬件实验, 空间数据系统, 立方体卫星, 网络安全教学, 航天器黑客, 逆向工具, 遥测跟踪命令协议, 面包板搭建, 频谱分析, 黑客平台