Passive RF emission fingerprinting across 8 wireless protocols. Every transmitter leaves a physical-layer signature that cannot be spoofed.
Each protocol module captures raw IQ samples and extracts both identity markers and hardware-intrinsic RF signatures.
Enrichment, persistence, and presence detection built on top of the raw fingerprinting engine.
170+ OUI manufacturer lookups, 47 BLE company IDs, 31 GATT service UUIDs, LTE carrier identification from EARFCN, 5G NR carrier mapping, ANT+ device type resolution. MAC randomization detection flags privacy-rotated addresses. All offline, no network calls.
Save a baseline scan as JSON. Compare future scans against it to see which devices are still PRESENT, which are ABSENT, and which are NEW. Each match includes an RF similarity score computed from CFO, clock drift, and RSSI deltas.
Associate scans with people. Enroll a subject, repeat scans to strengthen their profile
(devices seen in >50% of scans become "stable"), then check if their personal devices
are present in any future scan. Stored locally at ~/.spectral_dna/subjects/.
2.4 GHz congestion scoring (Wi-Fi + BLE + ANT device density), MAC randomization ratio across all detected devices, active LTE/5G carrier diversity, and per-protocol device counts.
CFO from oscillator crystal offset, IQ imbalance from mixer/DAC manufacturing variance, clock drift from BLE/ANT timer crystals, PA rise/fall profile from analog circuitry. These signatures are hardware-intrinsic and cannot be spoofed without replacing components.
Rich dark-themed terminal display, machine-readable JSON export, styled self-contained HTML reports, and a SHA-256 composite hash over all collected values that changes if any transmitter in the environment changes.
From antenna to composite hash in four stages.
hackrf_transfer across each protocol's frequency bands.Single command. All protocols. Full fingerprint.
Modular design. Each protocol is an independent module with a shared capture engine.
| Module | Purpose |
|---|---|
| capture.py | HackRF capture engine — dual backend (hackrf_transfer CLI + SoapySDR fallback), IQ to complex64 conversion, CFO/IQ utilities |
| wifi_print.py | 802.11 OFDM preamble detection, CFO clustering, scapy passive capture for protocol fields |
| ble_print.py | GFSK demodulation, BLE access address correlation, PDU parsing, advertising interval analysis |
| lte_print.py | PSS/SSS Zadoff-Chu correlation, cell search across 5 bands, IQ imbalance + PA IMD3 |
| fiveg_print.py | NR PSS m-sequence detection, SSB timing drift, per-beam RSRP measurement |
| tpms_print.py | OOK envelope detection, Manchester decoding, multi-vendor TPMS frame parsing |
| rke_print.py | ASK burst detection, PA ramp profile analysis, KeeLoq-style code extraction |
| ant_print.py | ANT sync byte correlation, checksum validation, ANT+ profile parsing |
| gnss_print.py | Passive L1/L5 band power measurement, C/A code PRN detection |
| lookups.py | Offline lookup tables — OUI, BLE company IDs, GATT services, LTE/5G carriers, ANT types |
| environment.py | Snapshot save/load, device extraction, scan comparison, RF environment summary |
| subjects.py | Subject profiles — enroll, update, presence check, stored at ~/.spectral_dna/ |
| renderer.py | Rich terminal output, JSON export, styled HTML reports, comparison rendering |
Connect a HackRF One Pro, install dependencies, and run your first scan.