
Specter-FlipperZero v2.9
👻 Specter — spazzata passiva anti-microspie per lettori/skimmer NFC a 13,56 MHz per Flipper Zero. Misuratore EMF di contro-sorveglianza che utilizza il chip NFC integrato. Nessun hardware aggiuntivo.
Specter 👻
Scansiona i lettori che non puoi vedere.
Specter trasforma il tuo Flipper Zero in un bug-sweep tascabile di controsorveglianza per lettori NFC attivi a 13,56 MHz. Ascolta passivamente il campo RF che un lettore acceso emette costantemente — uno skimmer nascosto inserito in un terminale di pagamento, un lettore occulto dietro un pannello di una porta, un logger abusivo attaccato sotto una scrivania — poi ti dice dov'è, che tipo di cosa è, se la stanza è pulita e — lasciato in sorveglianza — il momento in cui ne appare uno mentre sei via. Non trasmette mai.
I lettori sono invisibili. Specter li rende visibili.
Segnalato su
Help Net Security
·
Cyber Security News
📟 Sul Flipper
Una scansione, dall'inizio alla fine: stanza silenziosa → avvicinamento → aggancio → cos'è → il verdetto della stanza.
Sweep (silenzioso) · Sweep (lettore agganciato) · Fingerprint · Survey (in esecuzione) · Survey (verdetto)
Watch (pulito) · Watch (lettore!) · Logbook · Calibrate · Settings
✨ Le cinque modalità
Specter è cinque strumenti attorno a un unico sensore. Ognuno risponde a una domanda diversa, quindi quello giusto dipende da cosa stai effettivamente cercando di scoprire:
| Modalità | La domanda a cui risponde | Usala quando |
|---|---|---|
| 🔍 Sweep | Dov'è? | Sospetti un dispositivo e vuoi individuarlo spostandoti |
| 🔬 Fingerprint | Che tipo di cosa è? | Hai trovato un emettitore e vuoi sapere come si comporta |
| 🗺️ Site Survey | Questa stanza è pulita? | Vuoi un unico verdetto per un intero spazio, a mani libere |
| 🛰️ Watch Mode | Ne è apparso uno mentre ero via? | Lasci il Flipper da qualche parte a fare la guardia |
| 📖 Logbook | Cosa ho trovato, e quando? | Stai scrivendo un resoconto, o confrontando oggi con la settimana scorsa — filtra per tipo di rilevamento |
🔍 Sweep — dov'è?
Cosa fa. Un misuratore in stile EMF dal vivo. Tieni il Flipper piatto e muovilo lentamente sopra la cosa che stai controllando — un terminale per carte, un lettore per porte, il lato inferiore della fessura di un ATM, un pacco, una scrivania. L'ago segue l'intensità del campo in tempo reale.
Cosa vedi.
- Il quadrante — l'ago = lettura dal vivo, il puntino = peak-hold (il punto più forte che hai toccato, così puoi confrontare le posizioni).
FIELD %— la stessa lettura come numero, con una freccia di tendenza ▲ / ▼ che ti dice se l'ultimo mezzo secondo ha reso le cose più calde o più fredde. Quando stai cacciando, quella freccia conta più del numero.PK/C— lettura di picco e quanti contatti separati hai avuto.- Barra inferiore — la forma d'onda dal vivo e la tua sensibilità attuale quando è silenzioso;
passa a una barra d'allarme nera
● ACTIVE READERcon una parola di prossimità nel momento in cui viene rilevata una portante. - Prossimità —
FAINT → NEAR → CLOSE → STRONG → MAX.MAXsignifica che il misuratore è al massimo: sei il più vicino che questa misurazione possa risolvere.
Suono. Click geiger opzionali che accelerano man mano che ti avvicini, così puoi scansionare con il Flipper in tasca e cacciare solo con l'udito.
| Tasto | Azione |
|---|---|
OK | Azzera peak-hold e conteggio contatti |
hold OK | Salva questa lettura nel logbook |
LEFT | Calibra sul rumore di fondo della stanza (3 s) |
🔬 Fingerprint — che tipo di cosa è?
Cosa fa. Una volta che Sweep ha trovato qualcosa, tieni il Flipper fermo contro di esso. Fingerprint smette di misurare la prossimità e inizia a cronometrare i fronti on/off della portante, che è ciò che distingue realmente un tipo di emettitore da un altro.
Cosa vedi. Un verdetto, una barra di confidenza e le prove dietro entrambi:
| Classe | Cosa significa in pratica |
|---|---|
| CONTINUOUS | La portante è mantenuta permanentemente attiva |
| POLLING | Un ciclo di polling fisso, temporizzato al cristallo — il periodo è mostrato in ms |
| INTERMITTENT | A raffiche ma irregolare — spesso un telefono o un lettore in uso |
Sotto ci sono PER (periodo di polling), BST (larghezza della raffica), JIT (jitter) e
DUTY (duty-cycle reale), più un treno di impulsi da logic analyser della portante
grezza — così il verdetto non è mai qualcosa che devi prendere per fede. Un vero
lettore in polling si presenta come un'onda quadra inconfondibile.
Un
~prima di una temporizzazione significa che è vicina al limite di campionamento di 2 ms, e la confidenza è ridotta di conseguenza.
| Tasto | Azione |
|---|---|
OK | Salva il rilevamento nel logbook |
hold OK | Riavvia la misurazione |
🗺️ Site Survey — questa stanza è pulita?
Cosa fa. Una scansione a tempo di un intero spazio. Avviala, cammina nella stanza normalmente e ottieni un unico verdetto alla fine — senza guardare l'ago.
Cosa vedi. Un conto alla rovescia e una barra di avanzamento mentre è in esecuzione, poi una scheda di verdetto:
CLEAN— nulla ha superato il rumore di fondoTRACE— rilevamenti brevi o deboli; vale la pena una seconda passata più lentaACTIVE READER— qualcosa era davvero attivo ed emetteva
…con campo MAX / AVG, conteggio contatti e FIELD % — per quanto tempo della survey
una portante è stata effettivamente attiva, che spesso è il numero più rivelatore dei quattro.
Dura 30 s, 60 s o 2 min, e registra il risultato automaticamente.
| Tasto | Azione |
|---|---|
OK | Esegui di nuovo la survey |
🛰️ Watch Mode — ne è apparso uno mentre ero via?
Cosa fa. Fa la guardia indefinitamente. Attivalo, posa il Flipper, allontanati. Dove Sweep sei tu che cacci e Survey è un test a durata fissa, Watch si limita ad aspettare — per minuti o ore.
Cosa vedi. Un grande orologio del tempo trascorso e ALL CLEAR finché non c'è nulla. Nell'istante
in cui appare un lettore la banda si inverte in READER PRESENT, lo
schermo si risveglia e l'allarme suona. La banda è fissa anziché lampeggiante —
invece pulsa un piccolo indicatore, così appare viva senza lampeggiarti addosso. Dopo che è passato, lo schermo conserva le
prove: HITS (quanti contatti separati), PEAK, LAST (quanto tempo fa è stato
il più recente) e SEEN (tempo totale in cui una portante è stata effettivamente attiva).
Watch ignora deliberatamente la modalità stealth — una guardia buia e silenziosa che non ti dice mai di aver visto qualcosa sarebbe peggio che inutile.
| Tasto | Azione |
|---|---|
OK | Riattiva — azzera l'orologio e i contatori |
📖 Logbook — cosa ho trovato, e quando?
I rilevamenti vengono salvati due volte, da una sola azione, così sono leggibili sul dispositivo e già un foglio di calcolo — nessun passaggio di esportazione da ricordare:
logbook.txt — raggruppato, per il visualizzatore sul dispositivo | logbook.csv — una riga piatta per voce |
|---|---|
| ``` 2026-07-18 14:35:11 SURVEY 60s ACTIVE max74… 2026-07-18 14:32:07 READER POLLING 204ms… ``` | ``` timestamp,type,detail 2026-07-18 14:35:11,SURVEY,60s ACTIVE … 2026-07-18 14:32:07,READER,POLLING 204ms … ``` |
Le voci sono contrassegnate con SWEEP, READER, SURVEY o WATCH e timbrate
dall'orologio del Flipper. Entrambi i file risiedono in apps_data/specter/ sulla scheda
SD. Nulla lascia mai il dispositivo. Cancellali da Settings → Clear logbook (confermato
prima — è l'unica cosa irreversibile che l'app può fare).
⚙️ I componenti di supporto
🎯 Auto-calibrazione
Premi LEFT sulla schermata Sweep e Specter ascolta il rumore di fondo ambientale per 3 secondi, poi imposta la soglia di rilevamento appena sopra qualunque cosa abbia misurato — salvata come la tua sensibilità Custom. Ogni stanza ha un diverso fondo RF; questa si sintonizza su quella in cui ti trovi invece di un numero predefinito in fase di build. Posizionati in un luogo silenzioso quando la esegui.
🕶️ Modalità stealth
Mantiene schermo e LED spenti per tutta la sweep, così il Flipper non brilla
mentre sei tu quello che sta osservando. Suono e vibrazione continuano a funzionare — il
punto non è disabilitare il feedback con cui stai facendo la sweep. Uscire da una schermata stealth
riaccende il display, così BACK ti porta sempre su un menu illuminato.
📏 Leggere il misuratore
Perché un reader che stai toccando non emette il 100% del tempo. Il rilevatore misura una sola cosa fisica: quale frazione del tempo una portante a 13,56 MHz è attiva. Ma i reader interrogano — un breve burst, una pausa, un altro burst. Un terminale tipico irradia solo per il 20–35% del tempo, quindi il duty-cycle grezzo satura intorno al 30% non importa quanto ti avvicini.
Mostrare quel numero grezzo sul misuratore faceva sembrare un rilevamento perfetto come un terzo di uno. Il misuratore è invece scalato rispetto a quella reale banda di polling:
| Duty portante grezzo | Misuratore | Prossimità |
|---|---|---|
| 3% (rumore della stanza) | 10% | FAINT |
| 12% | 40% | NEAR |
| 20% | 67% | CLOSE |
| 28% | 93% | STRONG |
| ≥30% (appoggiato su un reader) | 100% | MAX |
Il duty grezzo non viene mai perso: il rumore di fondo, l'auto-calibrazione e il
DUTY della schermata Fingerprint funzionano ancora in vero duty-cycle, perché quelli
descrivono il segnale, non la tua distanza da esso. Vuoi il numero letterale?
Settings → Meter → Raw.
💾 Tutto persiste
Sensibilità, durata della survey, suono, vibrazione, LED, stealth, logging e modalità del misuratore sono salvati sulla scheda SD nel momento in cui li modifichi. Un kit di sweep che dimentica la sua configurazione è peggio di nessuna persistenza.
🧠 Come funziona
Ogni reader NFC acceso interroga continuamente l'aria con una portante a 13,56 MHz, in attesa che una carta si svegli. Non puoi vederla, ma il chip NFC del Flipper sì: l'ST25R3916 ha un rilevatore di campo esterno hardware (lo stesso circuito che permette al Flipper di emulare una carta e sapere quando un reader sta comunicando con essa). Specter mette il chip in modalità solo-rilevamento e campiona quel bit "campo presente?" ~500 volte al secondo — senza mai attivare la propria portante.
Quel singolo bit, campionato abbastanza velocemente, porta due segnali indipendenti:```mermaid
flowchart LR
R["🔍 Hidden 13.56 MHz reader / skimmer
(constantly polling its field)"] -- "RF carrier" --> A
subgraph FLIP["Flipper Zero — Specter.fap"]
A["ST25R3916 NFC chip<br/>external-field detector"] --> S["Sampler thread<br/>~500 samples/s"]
S --> M["<b>How much?</b><br/>carrier duty-cycle<br/>peak · average · contacts"]
S --> C["<b>What rhythm?</b><br/>burst / gap edge timing<br/>period · jitter"]
M --> G["EMF gauge · waveform<br/>geiger clicks · LED · vibe"]
M --> V["Survey verdict<br/>CLEAN / TRACE / ACTIVE"]
C --> K["Emitter class<br/>CONTINUOUS / POLLING /<br/>INTERMITTENT + pulse train"]
V --> L["📖 SD logbook"]
K --> L
end
**Quanto → intensità.** Su una finestra breve Specter misura *in quale frazione di tempo* un carrier è
presente e la leviga nel **FIELD %**. Un lettore posizionato proprio sopra il Flipper fa schizzare il misuratore;
uno più debole o più lontano lo sposta appena. Questo guida l'ago, la parola di prossimità e la frequenza dei click.
**Quale ritmo → identità.** Separatamente, ogni transizione di quel bit viene cronometrata. Un lettore che si risveglia per
20 ms ogni 200 ms produce un pattern burst/gap con quasi nessun jitter, perché il suo ciclo di polling è
guidato da una macchina a stati temporizzata a cristallo. Il movimento della mano e il rumore RF non sono così stabili. Quella
differenza è ciò che separa **POLLING** da **INTERMITTENT**.
### I livelli decisionali sono testati su un computer reale
I punti in cui Specter trasforma i numeri in una *affermazione* — "questo è un lettore in polling", "questa stanza è
pulita", "questo è ciò che l'ago dovrebbe leggere" — sono puro C senza dipendenze hardware, e sono
fissati da test host anziché scoperti sul dispositivo:```bash
make -C test # 300 checks: classifier, verdict, meter scaling, presence
🚀 Installazione
Nessuna devboard, nessun firmware da flashare — è un singolo .fap.
Opzione A — .fap precompilato (la più semplice)
-
Scarica il
.fapcorretto dalla pagina Releases:Il tuo firmware File Ufficiale / stock specter.fapUnleashed, RogueMaster, Momentum o qualsiasi versione più recente specter-fw-dev.fapSe il Flipper mostra
APP:87 < FW:88 — This app might not work, hai preso quello sbagliato — usa l'altro file. La versione API dell'app è fissa al momento della compilazione, quindi una singola build non può soddisfare entrambe le linee di firmware. Di solito funziona comunque se premi Continue, ma la build corrispondente non lo chiederà. -
Apri qFlipper, trascina il file in
SD Card / apps / NFC /. -
Sul Flipper: Apps → NFC → Specter.
Opzione B — compilalo da solo con ufbt```bash
one-time
python3 -m pip install --upgrade ufbt
from the repo root, with your Flipper plugged in over USB:
ufbt # build specter.fap into ./dist ufbt launch # build, upload to the Flipper and open it make -C test # run the host tests for the pure logic
Il file `.fap` finisce in `dist/specter.fap`; `ufbt launch` lo copia in `apps/NFC/` e lo avvia per te.
> Le icone in `icons/`, gli screenshot e il banner in `images/` sono generati — rigenerali con
> `python3 tools_gen_icons.py`, `python3 tools_gen_mockups.py` e `python3 tools_gen_banner.py` (richiede `pillow`).
---
## 🎮 Come si usa
**Una scansione, dall'inizio alla fine:**
1. Avvia **Specter**. Nella schermata **Sweep**, premi **LEFT** e resta fermo per 3 secondi per
calibrare sul rumore di fondo della stanza.
2. Tieni il Flipper piatto e muovilo **lentamente** sopra la cosa che stai controllando — un terminale
per carte, un lettore di porte, la parte inferiore della fessura di un ATM, un pacco, una scrivania.
- **Forma d'onda piatta / silenziosa** → nessun lettore attivo nel raggio d'azione.
- **L'ago sale, i click accelerano** → ti stai avvicinando a un emettitore. Continua verso il picco.
- **`● ACTIVE READER` + bordo d'allarme** → un lettore attivo è proprio qui.
3. Trovato qualcosa? Esci e apri **Fingerprint**. Tieni il Flipper fermo contro di esso e lascia che la
cadenza si stabilizzi — qualche secondo di solito basta. Premi **OK** per salvare il risultato.
4. Vuoi invece bonificare un'intera stanza? Apri **Site Survey**, percorri lo spazio finché la barra non
si riempie e leggi il verdetto.
5. Stai lasciando l'area? Metti il Flipper in **Watch Mode** e resterà di guardia, svegliandosi e
suonando se compare un lettore mentre sei via.
6. Controlla il **Logbook** per tutto ciò che hai salvato, con timestamp — oppure estrai `logbook.csv`
dalla scheda e importalo in un foglio di calcolo.
> 💡 Scansiona prima un lettore sicuro (il tuo telefono che fa NFC, o un terminale contactless di cui ti
> fidi) per vedere come appare un campo forte e legittimo sul misuratore — e cosa legge la sua impronta.
> Poi vai a caccia.
### Comandi
| Schermata | Tasto | Azione |
|---|---|---|
| **Sweep** | `OK` | Azzera picco / contatti |
| | `hold OK` | Registra la lettura corrente |
| | `LEFT` | Calibra il rumore di fondo (3 s) |
| **Fingerprint** | `OK` | Salva il risultato nel logbook |
| | `hold OK` | Riavvia la misurazione |
| **Site Survey** | `OK` | Esegui di nuovo la survey |
| **Watch Mode** | `OK` | Riarma (azzera conteggio e orologio) |
| *ovunque* | `BACK` | Torna su di un livello |
---
## 🔬 Limiti onesti
- **Solo 13,56 MHz (HF).** Specter rileva la **banda NFC** — quella usata dagli skimmer per pagamenti
contactless, dalla maggior parte dei lettori di accesso moderni, dai lettori per trasporti e hotel.
**Non** riesce a vedere i lettori a **125 kHz (LF)** (i vecchi pannelli per porte HID Prox / EM4100);
il percorso LF del Flipper non ha un bit equivalente di rilevamento del campo.
- **Rileva la *portante* di un lettore, non ciò che legge.** Specter ti dice *che un lettore attivo è
qui, all'incirca quanto è vicino e con che ritmo interroga* — non decodifica, identifica o cattura
nulla di ciò che fa il lettore.
- **L'intensità è relativa, non calibrata.** `FIELD %` e le parole di prossimità sono una guida
comparativa "più caldo / più freddo" per la scansione, non una distanza misurata in cm. È una lettura
*riscalata* del duty-cycle della portante rispetto a una banda di polling tipica (vedi [Leggere il
misuratore](#-reading-the-meter--fixed-in-23)); un lettore che interroga in modo insolitamente rado
leggerà più basso alla stessa distanza, e uno in modalità onda continua andrà a fondo scala da più
lontano.
- **Il misuratore arriva al massimo.** `MAX` significa che la portante è attiva tanto quanto questo
lettore la tiene mai attiva — oltre quel punto, avvicinarsi davvero non può produrre un numero più
grande. Usa il peak-hold `PK` per confrontare invece le posizioni.
- **La cadenza si risolve a ~2 ms.** Questo è il periodo di campionamento. Le tempistiche vicine a
questo valore sono mostrate con un **`~`** e la confidenza viene ridotta di conseguenza — Specter
preferisce segnalare il proprio limite di risoluzione piuttosto che citare un numero dall'aspetto
preciso su cui non può garantire.
- **`CLEAN` significa pulito alla sensibilità che hai scelto.** Uno skimmer dormiente che si sveglia
solo a un tap reale, o uno schermato, resta invisibile a *qualsiasi* soglia. L'assenza di una lettura
non è garanzia di assenza.
- **Una radio alla volta.** Specter prende il controllo del chip NFC durante la scansione, quindi chiudi
prima qualsiasi altra app NFC (dirà *NFC unavailable* se qualcos'altro tiene occupata la radio).
---
## ⚖️ Legale ed etico
Specter è uno strumento **difensivo, in sola ascolto** — **non trasmette** mai, non alimenta mai un
campo, non tocca mai il lettore. Usalo per scansionare la **tua** area POS, porta, scrivania o oggetti
personali, o hardware che sei **esplicitamente autorizzato** a valutare. Sei responsabile di come lo usi.
Conosci le leggi locali.
---
## 🗺️ Roadmap
- [x] Persistere sensibilità / suono / vibrazione / LED tra i riavvii
- [x] "Logbook" dei rilevamenti con timestamp sulla scheda SD
- [x] Scansione in background con lo schermo spento — *modalità stealth*
- [x] Soglia regolabile per un controllo più fine del range — *auto-calibrazione + sensibilità personalizzata*
- [x] Impronta di un emettitore tramite la sua cadenza di polling
- [x] Site survey a tempo con verdetto sulla stanza
- [x] Esportare il logbook come CSV per il reporting — *scritto in tempo reale insieme al .txt*
- [x] Modalità watch a lungo termine non presidiata con allarme wake-on-detection
- [x] Far usare al misuratore tutto il suo range contro lettori reali in polling
- [x] Freccia di tendenza più caldo/più freddo durante la caccia
- [ ] Studiare un rilevamento di lettori LF (125 kHz) basato su bobina come modalità separata
- [ ] Filtro del logbook per tipo sul dispositivo
---
## 🗂️ Struttura del progetto```
Specter-FlipperZero/
├── application.fam # Flipper app manifest (category: NFC)
├── specter.c / specter_i.h # app entry, wiring, alert feedback, stealth
├── helpers/
│ ├── field_detector.{c,h} # worker thread: samples the field-present bit,
│ │ # duty-cycle + edge timing + calibration
│ ├── emitter_classify.{c,h} # pure: cadence -> CONTINUOUS/POLLING/INTERMITTENT
│ ├── survey_verdict.{c,h} # pure: survey stats -> CLEAN/TRACE/ACTIVE
│ ├── field_scale.{c,h} # pure: raw carrier duty -> full-scale meter
│ ├── present_hold.h # pure: debounce presence across poll gaps
│ ├── specter_settings.{c,h} # persisted settings (saved_struct)
│ └── specter_log.{c,h} # SD logbook, RTC-stamped .txt + live .csv
├── views/
│ ├── sweep_view.{c,h} # the EMF gauge / waveform / alarm screen
│ ├── fingerprint_view.{c,h} # classification card + pulse-train trace
│ ├── survey_view.{c,h} # progress + verdict card
│ └── watch_view.{c,h} # unattended guard: clock + count + alarm
├── scenes/ # scene-manager navigation
├── test/ # host tests for the pure decision layers
├── icons/ # 1-bit Flipper icons (generated)
├── images/ # banner + screen mockups (generated)
└── tools_gen_*.py # regenerate icons / mockups / banner
🎨 Branding
Tutte le grafiche sono generate, quindi non si discostano mai dall'app:
| Asset | Dimensione | Dove va |
|---|---|---|
images/banner.png | 2560×800 | Intestazione del README (2× per rimanere nitida su retina) |
images/social-preview.png | 1280×640 | Settings → Social preview — la dimensione consigliata da GitHub (min 640×320, limite 1 MB) |
images/mark.png | 512×512 | Logo quadrato: avatar, favicon, slide |
images/demo.gif | 768×384 | L'animazione sopra, ~9 s, costruita dalle costanti reali della vista |
| python3 tools_gen_banner.py # banner, social preview, logo mark | ||
| python3 tools_gen_gif.py # the demo animation | ||
| python3 tools_gen_mockups.py # screen stills | ||
| python3 tools_gen_icons.py # 1-bit Flipper icons |
> L'anteprima social è l'unico asset che GitHub non riesce a recuperare dal repo — deve
> essere caricata una volta manualmente in **Settings → Social preview**. È ciò che viene renderizzato
> quando il repo viene condiviso su Slack, X, LinkedIn o Discord.
---
## 🙏 Crediti
- Creato da **[at0m-b0mb](https://github.com/at0m-b0mb)**.
- Parte di una famiglia di strumenti di sicurezza per Flipper: **[Argus](https://github.com/at0m-b0mb/Argus-FlipperZero)** (watchdog Wi-Fi deauth / evil-twin), **[GhostTag](https://github.com/at0m-b0mb/GhostTag-FlipperZero)** (hunter BLE anti-stalking) e **[Cerberus](https://github.com/at0m-b0mb/flipper-cerberus)** (watchdog RF Sub-GHz).
- Basato sul [firmware Flipper Zero](https://github.com/flipperdevices/flipperzero-firmware) NFC HAL (rilevamento campo `furi_hal_nfc`) + [ufbt](https://github.com/flipperdevices/flipperzero-ufbt).
## 📄 Licenza
[MIT](https://github.com/at0m-b0mb/specter-flipperzero/blob/main/LICENSE) © 2026 at0m-b0mb