Prerequisites
Complete FND-102 (Python automation), NET-101 (Networks), and SEC-101 (Security Fundamentals) before enrolling. You need Python 3.11+, basic Linux CLI fluency, and comfort with packet analysis (Wireshark from NET-101).
Hardware Kit
Per-Student (required)
| Item | Purpose | Approx. Cost |
|---|---|---|
| RTL-SDR v4 dongle + dipole antenna | Passive receive; spectrum observation; FM/ADS-B/sub-GHz | ~$35 |
| Alfa AWUS036ACM 802.11ac USB NIC | Monitor mode + packet injection (Wi-Fi labs) | ~$35 |
| MicroSD card 32 GB+ | Kali Linux or lab VM storage | ~$10 |
| USB-A to USB-C adapter | Optional; host compatibility | ~$5 |
Minimum per-student outlay: ~$85. The public page lists ~$140 for students who do not already own any of these; the Alfa NIC is the largest line item.
Program-Supplied (shared; one per lab cohort)
| Item | Purpose |
|---|---|
| ANTSDR E200 (AD9361 + Zynq-7020) | Full TX/RX platform for PSK/rolling-code capstone |
| LimeSDR Mini 2.0 | Alternate TX/RX; BLE sniffing at scale |
| Instructor rolling-code demo device | Lab 9 authorized target (instructor-built toy device; NOT a real garage door) |
| Faraday cage enclosure (50x30x30 cm) | Contain live transmissions during PSK + rolling-code labs |
Remote students use the virtual/recorded-capture path for all transmit-side work. See the Virtual Path section below.
Software Environment
Option A — Kali Linux (recommended for in-lab students)
Kali Linux 2025.x contains most tools pre-packaged. Run a full apt upgrade after first boot.
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y \
aircrack-ng \
hcxdumptool hcxtools \
hashcat \
kismet \
wireshark tshark \
gqrx-sdr \
inspectrum \
urh \
gnuradio gnuradio-dev gr-osmosdr \
rtl-sdr librtlsdr-dev \
libiio-utils libiio-dev \
python3-numpy python3-scipy python3-matplotlib \
bluetooth bluez btscanner \
nmap masscan
Option B — Ubuntu 24.04 LTS base install
Same apt commands above. Install pysdr additionally via pip:
pip install pysdr scipy numpy matplotlib
Option C — Windows 11 + WSL2
WSL2 Ubuntu 24.04 works for Python/hashcat analysis. USB passthrough (usbipd) required for SDR dongles and Alfa NIC. Less reliable for monitor-mode work; fallback to provided PCAP captures for Wi-Fi labs if USB passthrough fails.
SDR Driver Setup
RTL-SDR v4
The RTL-SDR v4 uses the rtl-sdr-blog driver branch, not the legacy rtl-sdr package:
# Remove old rtl-sdr if present
sudo apt remove rtl-sdr librtlsdr-dev
# Install rtl-sdr-blog driver
sudo apt install -y libusb-1.0-0-dev cmake git
git clone https://github.com/rtlsdrblog/rtl-sdr-blog
cd rtl-sdr-blog && mkdir build && cd build
cmake .. -DDETACH_KERNEL_DRIVER=ON
make && sudo make install && sudo ldconfig
# Blacklist DVB kernel module
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee /etc/modprobe.d/blacklist-rtlsdr.conf
sudo modprobe -r dvb_usb_rtl28xxu 2>/dev/null; true
# Verify
rtl_test -t
ANTSDR E200 (libiio + UHD)
# libiio context discovery
iio_info -s
# UHD path (E200 supports both)
sudo apt install uhd-host libuhd-dev
uhd_find_devices
Consult the ANTSDR E200 quickstart guide shipped with the unit for first-time firmware flash.
802.11 Monitor Mode — Alfa AWUS036ACM
# Identify interface name
ip link show | grep wlan
# Kill processes that fight monitor mode
sudo airmon-ng check kill
# Enable monitor mode
sudo airmon-ng start wlan0
# Verify (interface name becomes wlan0mon or similar)
iwconfig wlan0mon
Important: Return the interface to managed mode when done with Wi-Fi labs to restore normal internet connectivity.
sudo airmon-ng stop wlan0mon
sudo systemctl restart NetworkManager
Legal Authorization Checklist
Read and sign the Lab Authorization Form before any active RF transmission or packet capture.
- I will only capture traffic on networks I own or have written authorization to test.
- I will only transmit RF energy within the Faraday cage provided by the instructor OR using the instructor-provided lab network (isolated, air-gapped from production).
- I understand that unauthorized interception of electronic communications violates the Electronic Communications Privacy Act (18 U.S.C. §§ 2510-2522).
- I understand that unauthorized computer access violates the Computer Fraud and Abuse Act (18 U.S.C. § 1030).
- I understand that unlicensed intentional transmissions outside FCC Part 15 limits require an FCC license (Part 97 amateur, Part 90 land mobile, etc.).
- I will not use techniques learned in this course against production systems, third-party infrastructure, or real consumer devices (garage doors, vehicle key fobs, etc.) without explicit written authorization.
- I acknowledge that the rolling-code lab uses only an instructor-built educational demo device.
Virtual / Recorded-Capture Path
Remote students and students without shared hardware can complete all labs through the virtual path.
IQ File Format
Software-defined radios record raw in-phase/quadrature (IQ) samples as interleaved 32-bit floats (or 16-bit integers for RTL-SDR). The SigMF standard (*.sigmf-data + *.sigmf-meta) encodes sample rate, center frequency, and capture metadata alongside the raw samples.
Loading Captures in Python
import numpy as np
# Raw float32 IQ (HackRF / GNU Radio default)
samples = np.fromfile("capture.iq", dtype=np.complex64)
# RTL-SDR uint8 interleaved (I0,Q0,I1,Q1,...)
raw = np.fromfile("capture.bin", dtype=np.uint8)
samples = (raw.astype(np.float32) - 127.5) / 127.5
iq = samples[0::2] + 1j * samples[1::2]
Loading in GNU Radio
Use the File Source block:
- File: path to
.iqfile - Output Type:
complex - Repeat: unchecked (single playback) or checked (loop for testing)
- Sample rate: match the metadata of your capture file
Lab Capture Files
Each lab that uses physical RF provides:
- A pre-captured
.sigmfbundle for virtual-path students - Python analysis starters that work identically on live and recorded captures
- Expected output checksums so you can verify your analysis completed correctly
Capture files are distributed via the course portal downloads section.
GNU Radio Companion Quick Reference
Launch: gnuradio-companion from terminal.
Key blocks for this course:
| Block | Purpose |
|---|---|
osmocom Source |
RTL-SDR / HackRF / LimeSDR receive |
osmocom Sink |
HackRF / LimeSDR transmit |
File Source |
Load .iq capture file |
File Sink |
Save IQ to disk |
Throttle |
Rate-limit file-based flows (prevents CPU runaway) |
QT GUI Frequency Sink |
Live spectrum display (FFT waterfall) |
QT GUI Time Sink |
Time-domain waveform |
QT GUI Constellation Sink |
I/Q constellation diagram (phase-amplitude) |
Low Pass Filter |
Isolate signal band before demodulation |
WBFM Receive |
Wide-band FM audio decode |
PSK Mod / PSK Demod |
BPSK/QPSK modulation chain |
First-Day Smoke Test
Run this checklist before Week 1 labs:
# 1. RTL-SDR receives FM broadcast
rtl_fm -f 88.5M -M wbfm -s 200000 -r 44100 - | aplay -r 44100 -f S16_LE
# 2. Alfa NIC enters monitor mode without errors
sudo airmon-ng start wlan0 && iwconfig wlan0mon
# 3. GNU Radio GFSK flowgraph loads without import errors
gnuradio-companion --version
# 4. Python IQ pipeline works
python3 -c "import numpy as np; s=np.fromfile('/dev/zero',dtype=np.complex64,count=1024); print('numpy IQ OK, shape:', s.shape)"
# 5. hashcat recognizes GPU
hashcat -I
Flag any failures to the instructor before proceeding to Week 1.