u/c0d3r-SubGHz

Image 1 — Field Testing the Single-Chip RollJam: Overcoming Near-Field Desensitization (Hardware vs Software solutions) 📡
Image 2 — Field Testing the Single-Chip RollJam: Overcoming Near-Field Desensitization (Hardware vs Software solutions) 📡
Image 3 — Field Testing the Single-Chip RollJam: Overcoming Near-Field Desensitization (Hardware vs Software solutions) 📡

Field Testing the Single-Chip RollJam: Overcoming Near-Field Desensitization (Hardware vs Software solutions) 📡

Hey everyone, c0d3r_SubGHz here with a development update on the Single-Chip RollJam PoC.

Thanks to some incredible field testing from early adopters in the community, we ran into a fascinating physical limitation and found two ways to bypass it.

The Problem: Near-Field Desensitization Since the v1.0 uses a custom bare-metal SPI driver to blast Continuous Wave (CW) Jamming (a literal wall of RF fire) instead of the old TDM switching, the external module is extremely loud. Because the internal RX antenna and the external TX antenna are just an inch apart, the jammer effectively "blinds" the Flipper's internal receiver. It can't hear the target's keyfob over its own noise.

Here is how we are beating physics:

Solution 1: The Hardware Approach (See Picture 📸) As figured out by us, using an SMA extension cable to physically distance the jamming antenna from the Flipper's body prevents desensitization. The external module screams, the target car's AGC gets blinded, but the Flipper's internal radio stays clean enough to capture the rolling code.

Solution 2: The Software Approach (Jam Offset) If you don't want to carry cables around, I coded a dynamic 'Jam Offset' feature in the app's UI. By pushing the jamming frequency further away (e.g., +/- 120kHz to 900kHz from the center freq), you give the Flipper's internal receiver enough "breathing room" to catch the preamble, while still being close enough to corrupt the signal reaching the car's ECU.

Side note: I decided to keep the transition between Signal A and Signal B manual (requiring a button click) rather than auto-switching. This acts as a safety buffer so residual RF noise or bounced signals don't instantly trigger a garbage Signal B capture.

Massive thanks to the community for the data. Pushing the CC1101 hardware to its absolute limit is a fun ride.

(As always, due to subreddit rules, I don't post binaries here. Full documentation and project access are in my Bio/Profile).

u/c0d3r-SubGHz — 2 days ago

Managed to achieve stable Single-Chip RollJam. Wrote a custom Bit-Banging SPI driver, DWT Cycle-Accurate Replay, and Continuous Jamming. (PoC Video)

Ciao a tutti, sono c0d3r_SubGHz.

Tutti dicevano che RollJam stabile sul Flipper era troppo inaffidabile a causa della latenza del sistema operativo e dei punti ciechi di commutazione RX/TX. Ho passato gli ultimi mesi a riscrivere l'approccio da zero. Ecco come ho risolto il problema in questa PoC:

  1. SPI software personalizzato (Bit-Banging): furi_hal blocca il bus SPI hardware, mandando in crash il sistema operativo se si tenta di sostituire i moduli a caldo. Ho scritto un driver SPI software bare-metal per il CC1101 per bypassare completamente il sistema operativo del Flipper.

  2. Jamming asincrono continuo e offset dinamico: Ho abbandonato il vecchio metodo TDM (switching). Il modulo esterno ora emette un "muro di fuoco" continuo (CW sul pin GD0) utilizzando un offset di frequenza selezionabile dinamicamente (da -900 kHz a +900 kHz). Il Flipper ascolta simultaneamente, completamente insensibile al jammer ma captando perfettamente il telecomando bersaglio.

  3. Filtraggio intelligente di squelch e tono pilota: L'app filtra dinamicamente il rumore. Attende un preambolo di oltre 1000 µs e si aggancia a 16 impulsi validi prima di registrare, eliminando dinamicamente i frame corrotti.

  4. Eccesso di interferenza post-cattura: Una volta catturato il segnale, emette istantaneamente un muro di interferenza di 1,5 secondi per coprire il tempo di reazione del dito umano e prevenire sblocchi accidentali.

  5. Riproduzione DWT bare-metal: La riproduzione viene eseguita all'interno di un blocco FURI_CRITICAL_ENTER() utilizzando il contatore di cicli DWT ARM (DWT->CYCCNT) per l'aggancio di fase assoluto e la trasmissione a jitter zero sul pin GD0.

A causa delle regole del subreddit relative ai binari compilati e agli exploit, non posso ospitare il .fap su repository pubblici.

La documentazione completa su GitHub e il link di accesso al Project Hub sono disponibili nella mia biografia/profilo Reddit.

reddit.com
u/c0d3r-SubGHz — 5 days ago