Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Specter-FlipperZero — Specter — bug-sweep passivo per lettore/skimmer NFC a 13,56 MHz per Flipper Zero. Misuratore EMF di contro-sorveglianza che utilizza il chip NFC integrato. Nessun hardware aggiuntivo, non trasmette mai. | Kitploit
Strumenti/GitHubGitHub/at0m-b0mb/specter-flipperzero
Strumenti DifensiviSicurezza Sistemi EmbeddedSicurezza IoTStrumenti RFID/NFCPenetration TestingSicurezza HardwareRed Teaming
GitHubat0m-b0mb/specter-flipperzero

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →

Specter-FlipperZero

Specter — bug-sweep passivo per lettore/skimmer NFC a 13,56 MHz per Flipper Zero. Misuratore EMF di contro-sorveglianza che utilizza il chip NFC integrato. Nessun hardware aggiuntivo, non trasmette mai.

Vedi Repository
884875 giorni faRevisionato da Kitploit
Condividi
<!-- banner: paper by default, true black when the reader's GitHub is dark -->
<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="images/banner-dark.png">
    <img src="https://assets.kitploit.com/production/public/readmes/42070/74bc06f0a6a1b0731b4768b4256f662b34a582f5b9701a9bce44cb1b10bedd0d.png" alt="Specter — NFC reader and skimmer bug-sweep for Flipper Zero" width="100%">
  </picture>
</p>

<p align="center">
  <sub>
    La forma d'onda non è un grafico. Sono 128 colonne di portante a 13,56&nbsp;MHz che
    Specter ha registrato da un vero reader in polling a 8&nbsp;ms per colonna, rilette
    dallo screenshot accanto. Il suo duty misura 28% dove il contatore del dispositivo
    stampava 27%, ed entrambi i numeri sono sul banner.
  </sub>
</p>

<p align="center"><i>Scansiona alla ricerca dei reader che non puoi vedere.</i></p>

<p align="center">
  <a href="https://at0m-b0mb.github.io/Specter-FlipperZero/"><b>Sito del progetto</b></a>
  &nbsp;·&nbsp;
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases/latest">Download</a>
  &nbsp;·&nbsp;
  <a href="https://github.com/at0m-b0mb/specter-flipperzero/blob/main/docs/changelog.md">Changelog</a>
</p>

<!-- live badges: these track the repo, so the README never goes stale -->
<p align="center">
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases/latest"><img src="https://img.shields.io/github/v/release/at0m-b0mb/Specter-FlipperZero?style=flat-square&amp;color=8A6714&amp;labelColor=000000" alt="Latest release"></a>
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases"><img src="https://img.shields.io/github/downloads/at0m-b0mb/Specter-FlipperZero/total?style=flat-square&amp;color=8A6714&amp;labelColor=000000&amp;label=downloads" alt="Downloads"></a>
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/stargazers"><img src="https://img.shields.io/github/stars/at0m-b0mb/Specter-FlipperZero?style=flat-square&amp;color=8A6714&amp;labelColor=000000" alt="Stars"></a>
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/actions/workflows/build.yml"><img src="https://img.shields.io/github/actions/workflow/status/at0m-b0mb/Specter-FlipperZero/build.yml?branch=main&amp;style=flat-square&amp;labelColor=000000&amp;color=8A6714&amp;label=build" alt="Build"></a>
</p>

<p align="center">
  <img src="https://img.shields.io/badge/platform-Flipper%20Zero-8A6714?style=flat-square&amp;logo=flipper&amp;logoColor=FE8A2C&amp;labelColor=000000" alt="Flipper Zero">
  <img src="https://img.shields.io/badge/radio-13.56%20MHz%20NFC%20(onboard)-8A6714?style=flat-square&amp;labelColor=000000" alt="Onboard NFC">
  <img src="https://img.shields.io/badge/extra%20hardware-none-8A6714?style=flat-square&amp;labelColor=000000" alt="No extra hardware">
  <img src="https://img.shields.io/badge/transmits-never-8A6714?style=flat-square&amp;labelColor=000000" alt="Listen-only">
  <img src="https://img.shields.io/badge/license-MIT-8A6714?style=flat-square&amp;labelColor=000000" alt="MIT">
</p>

<p align="center">
  <b>Specter</b> trasforma il tuo Flipper Zero in una <b>bonifica anti-controllo</b> da tasca
  per <b>reader NFC attivi a 13,56 MHz</b>. <i>Ascolta passivamente</i> il campo RF che un
  reader acceso emette costantemente — uno skimmer nascosto infilato in un terminale di
  pagamento, un reader occulto dietro un pannello di una porta, un logger abusivo attaccato
  sotto una scrivania — poi ti dice <b>dov'è</b>, <b>che tipo di cosa è</b>, <b>se la stanza
  è pulita</b> e — lasciato in sorveglianza — <b>il momento in cui ne compare uno mentre
  sei via</b>. Non trasmette mai.
</p>

<p align="center"><sub>I reader sono invisibili. Specter li rende visibili.</sub></p>

<p align="center">
  <sub>
    <b>Segnalato su</b><br>
    <a href="https://www.helpnetsecurity.com/2026/07/29/specter-flipper-zero-skimmer-detector/">Help Net Security</a>
    &nbsp;·&nbsp;
    <a href="https://cybersecuritynews.com/specter-with-flipper-zero/">Cyber Security News</a>
  </sub>
</p>

---

## Sul Flipper

<p align="center">
  <img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/images/demo.gif" width="70%" alt="Specter in use: sweeping a quiet room, closing in on a reader, locking on at PEGGED, fingerprinting its polling cadence, then a site-survey verdict">
</p>
<p align="center">
  <sub>Una scansione, dall'inizio alla fine: stanza silenziosa → avvicinamento → aggancio → <b>cos'è</b> → il verdetto della stanza.</sub>
</p>

### Le schermate che nessuna singola modalità possiede

<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="images/screens-dark.png">
    <img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/images/screens.png" width="100%" alt="The boot intro, main menu, Sweep listening, Fingerprint with nothing there, a Site Survey walking, Watch with a contact logged, the Logbook and Settings — all captured from a real Flipper Zero">
  </picture>
</p>
<p align="center">
  <sub>
    Gli stati silenziosi e l'intro — le quattro modalità seguenti hanno ciascuna la propria
    cattura, quindi queste sono quelle che non possiedono. <b>Ogni immagine
    in questo README è una cattura da un dispositivo reale</b>, acquisita tramite la sessione
    RPC del Flipper stesso da <code>tools_screenshot.py</code>. Non esiste più alcun renderer
    di mockup in questo progetto — un disegno della UI è una seconda
    implementazione della stessa, ed era in disaccordo con il firmware pur sembrando
    perfettamente convincente (vedi <a href="https://github.com/at0m-b0mb/specter-flipperzero/blob/main/docs/changelog.md">3.0.1</a>).
  </sub>
</p>

---

## Le cinque modalità

Specter è cinque strumenti attorno a un solo sensore. Ciascuno 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 è comparso uno mentre ero via?* | Lasci il Flipper da qualche parte a fare la guardia |
| **Logbook** | *Cosa ho trovato, e quando?* | Stai redigendo un rapporto, o confrontando oggi con la settimana scorsa — filtra per tipo di ritrovamento |

---

### Sweep — *dov'è?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/sweep_reader.png" width="42%" align="right" alt="Sweep — reader found, meter pegged">

**Cosa fa.** Un misuratore live in stile EMF. Tieni il Flipper piatto e muovilo lentamente
sopra la cosa che stai controllando — un terminale per carte, un reader per porte, il lato
inferiore del bordo di un ATM, un pacco, una scrivania. L'ago segue l'intensità del campo in
tempo reale.

**Cosa vedi.**
- **Il quadrante** — l'ago = lettura live, il puntino piccolo = *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.
- **`PEAK %`** — la lettura più forte da quando hai armato, il numero dietro il
  puntino del peak-hold.
- **Il segno sul quadrante** — dove `READER` *inizia* alla tua sensibilità attuale.
  Tutto ciò che sta oltre è ciò che Specter chiamerà un riscontro, quindi il quadrante
  risponde a "cosa conta?" invece di lasciarti indovinare.
- **Striscia inferiore** — finché non hai trovato il tuo primo reader porta i due tasti
  che non puoi scoprire premendo le cose (`LEFT=cal`, `hold OK=log`); dopo, la tua
  sensibilità e una forma d'onda live. Passa a una barra d'allarme nera
  **`● ACTIVE READER`** con una parola di prossimità nel momento in cui viene
  rilevata una portante.
- **Prossimità** — `FAINT → NEAR → CLOSE → STRONG → PEGGED`. `PEGGED` significa che il
  misuratore è *pegged*: sei il più vicino che questa misura possa risolvere.

**Suono.** Click geiger opzionali che **accelerano man mano che ti avvicini**, così puoi
scansionare con il Flipper in tasca e cacciare solo a orecchio.

| Tasto | Azione |
|---|---|
| `OK` | Azzera peak-hold e conteggio dei contatti |
| `hold OK` | Salva questa lettura nel logbook |
| `LEFT` | Calibra sul rumore di fondo della stanza (3 s) |
| `UP` / `DOWN` | Regola la sensibilità senza lasciare la caccia |

<br clear="right">

### Fingerprint — *che tipo di cosa è?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/fingerprint_reader.png" width="42%" align="right" alt="Fingerprint — polling reader identified">

**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 davvero 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 è tenuta 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 reader in uso |

Sotto ci sono `PER` (periodo di polling), `BST` (larghezza della raffica), `JIT` (jitter) e
`UP` (duty-cycle reale), più un **treno di impulsi da analizzatore logico** della portante
grezza — così il verdetto non è mai qualcosa che devi prendere per fede. Un vero
reader 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 è scontata di conseguenza.

| Tasto | Azione |
|---|---|
| `OK` | Salva il ritrovamento nel logbook |
| `hold OK` | Riavvia la misurazione |

<br clear="right">

### Site Survey — *questa stanza è pulita?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/survey_active.png" width="42%" align="right" alt="Site Survey — verdict">

**Cosa fa.** Una scansione **a tempo** di un intero spazio. Avviala, cammina la 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 fondo
- **`TRACE`** — riscontri brevi o deboli; vale una seconda passata più lenta
- **`ACTIVE READER`** — qualcosa era davvero attivo ed emetteva
- **`TOO SHORT`** — l'hai fermata prima che si guadagnasse il diritto di dire `CLEAN`

…con `PEAK` / `AVG` del campo, conteggio dei contatti e `UP %` — **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.
La scheda indica la durata su cui è stata valutata, perché un `CLEAN` di 30 secondi non è
lo stesso ritrovamento di uno di due minuti — e un'esecuzione interrotta prima di 10 s
riporta `TOO SHORT` invece di `CLEAN`. L'asimmetria è deliberata: **la presenza è una
prova, l'assenza no.** Trovare qualcosa in un secondo è un ritrovamento reale, quindi
`TRACE` e `ACTIVE READER` non vengono mai negati per essere stati rapidi; non trovare
nulla in un secondo è un'affermazione sull'intera stanza che un secondo non può sostenere.

| Tasto | Azione |
|---|---|
| `OK` *(in esecuzione)* | Ferma ora e valuta ciò che ha |
| `OK` *(sulla scheda)* | Esegui un'altra survey |

<br clear="right">

### Watch Mode — *ne è comparso uno mentre ero via?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/watch_reader.png" width="42%" align="right" alt="Watch Mode — reader present">

**Cosa fa.** Monta la guardia **indefinitamente**. Armalo, posa il Flipper, allontanati.
Dove Sweep sei tu che cacci e Survey è un test a durata fissa, Watch semplicemente
aspetta — per minuti o ore.

**Cosa vedi.** Un grande orologio del tempo trascorso e `NO READER` finché non c'è nulla.
Nell'istante in cui compare un reader la banda si inverte in **`ACTIVE READER`**, una barra
di intensità mostra quanto è vicino, lo **schermo si risveglia** e suona l'allarme. La banda
è fissa anziché lampeggiante — su uno schermo a 1 bit un blocco invertito pieno è già la cosa
più rumorosa che ci sia, e le letture che cambiano davvero portano la vitalità. Dopo che è
passato, lo schermo conserva le prove: `HITS` (quanti contatti separati), `PEAK`, `LAST`
(quanto tempo fa è stato il più recente) e `UP` (tempo totale in cui una portante è stata
effettivamente attiva). L'orologio passa a `hh:mm` oltre 99:59 invece di bloccarsi, così una
sorveglianza notturna continua a sommare.

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` | Riarma — azzera l'orologio e i contatori |

<br clear="right">

### Logbook — *cosa ho trovato, e quando?*

I ritrovamenti vengono salvati **due volte, da una sola azione**, così sono leggibili sul
dispositivo *e* già pronti come foglio di calcolo — nessun passaggio di esportazione da
ricordare:

<table>
<tr><th><code>logbook.txt</code> — raggruppato, per il visualizzatore sul dispositivo</th><th><code>logbook.csv</code> — una riga piatta per voce</th></tr>
<tr><td>```
2026-07-18 14:35:11
  SURVEY 60s ACTIVE max74…
2026-07-18 14:32:07
  READER POLLING 204ms…
```
</td><td>```
timestamp,type,detail
2026-07-18 14:35:11,SURVEY,60s ACTIVE …
2026-07-18 14:32:07,READER,POLLING 204ms …
```
</td></tr>
</table>

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 livello di RF di fondo; questa si sintonizza su quella in cui ti trovi
piuttosto che su un numero predefinito in fase di build. Posizionati in un luogo tranquillo quando la esegui.

### Modalità stealth

Mantiene **schermo e LED spenti** per l'intera scansione, 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 scansionando. Uscire da una schermata stealth
riaccende il display, quindi `BACK` ti porta sempre su un menu illuminato.

### Leggere il misuratore

**Perché un lettore che stai toccando non emette il 100% delle volte.** Il rilevatore
misura una sola cosa fisica: quale frazione di tempo una portante a 13,56 MHz è attiva.
Ma i lettori **eseguono polling** — una breve raffica, una pausa, un'altra raffica. Un terminale
tipico irradia solo il **20–35% del tempo**, quindi il duty-cycle grezzo *si satura* intorno al 30%
non importa quanto ti avvicini.

Mostrare quel numero grezzo sul misuratore faceva sembrare una rilevazione perfetta un terzo
di una. Il misuratore è invece scalato su quella reale banda di polling:

| Duty della portante grezzo | Misuratore | Prossimità |
|---|---|---|
| 3% (rumore della stanza) | 10% | `FAINT` |
| 12% | 40% | `NEAR` |
| 20% | 67% | `CLOSE` |
| 28% | 93% | `STRONG` |
| ≥30% *(appoggiato su un lettore)* | **100%** | `PEGGED` |

Il **duty grezzo non viene mai perso**: il rumore di fondo, l'auto-calibrazione e il
tasto `UP` 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 scale → Duty %**.

### 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 scansione che dimentica la sua
configurazione è peggio di nessuna persistenza.

---

## Come funziona

Ogni lettore NFC acceso **esegue continuamente il ping dell'aria con una portante a 13,56 MHz**, in attesa che una carta
si risvegli. 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 lettore
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<br/>(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 smussa 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 piuttosto che scoperti sul dispositivo:```bash
make -C test     # 527 checks: classifier, verdict, meter scaling, presence,
                 #             cadence, log filtering, log wrapping
```
---

## Installazione

Nessuna devboard, nessun firmware da flashare — è un singolo `.fap`.

**Opzione A — `.fap` precompilato (il più semplice)**

1. Scarica il `.fap` corretto dalla pagina [**Releases**](https://github.com/at0m-b0mb/Specter-FlipperZero/releases):

   | Il tuo firmware | File |
   |---|---|
   | **Ufficiale / stock** | `specter.fap` |
   | **Unleashed, RogueMaster, Momentum** o qualsiasi versione più recente | `specter-fw-dev.fap` |

   > Se 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à.
2. Apri **qFlipper**, trascina il file in `SD Card / apps / NFC /`.
3. Sul Flipper: **Apps → NFC → Specter**.

**Opzione B — compilalo da solo con [`ufbt`](https://github.com/flipperdevices/flipperzero-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/` e il banner in `images/` sono generati — rigenerali con
> `python3 tools_gen_icons.py` e `python3 tools_gen_banner.py` (richiede `pillow`).
> Tutto ciò che è in `screenshots/` è catturato da un dispositivo reale con
> `python3 tools_screenshot.py` (richiede `pyserial` e un Flipper collegato via USB).

---

## 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 ciò 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? Torna indietro 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 rilevamento.
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 di cui ti fidi (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 rilevamento 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 dichiarati

- **Solo 13,56 MHz (HF).** Specter percepisce la **banda NFC** — quella usata dagli skimmer per pagamenti
  contactless, dalla maggior parte dei lettori di accesso moderni, dai lettori di trasporti e alberghi. **Non**
  riesce a vedere i lettori a **125 kHz (LF)** (vecchi pannelli HID Prox / EM4100); il percorso LF del Flipper
  non ha un bit equivalente di rilevamento del campo.
- **Percepisce 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 il lettore fa.
- **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 arriverà a fondo scala da più lontano.
- **Il misuratore arriva al massimo.** `PEGGED` significa che la portante è alta quanto questo lettore la tiene
  mai — oltre quel punto, avvicinarsi davvero non può produrre un numero più grande. Il Flipper vibra una volta
  quando accade, così sai di smettere di muoverti anche quando non vedi lo schermo. Usa il blocco `PEAK` per
  confrontare invece le posizioni.
- **La cadenza si risolve a ~2 ms.** È il periodo di campionamento. Le tempistiche vicine a quel 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'aria precisa 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 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 raggio — *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 la reportistica — *scritto in tempo reale accanto al .txt*
- [x] Modalità watch a lungo termine non presidiata con allarme wake-on-detection
- [x] Far usare al misuratore tutta la sua scala contro lettori di polling reali
- [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 sul dispositivo per tipo

---

## 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
│   ├── cadence.h                 # pure: burst/gap/period timing with liveness
│   ├── ema.h                     # pure: the strength smoother
│   ├── log_filter.h              # pure: keep only one kind of finding
│   ├── log_wrap.h                # pure: wrap an entry at words, not mid-word
│   ├── specter_settings.{c,h}    # persisted settings (saved_struct)
│   └── specter_log.{c,h}         # SD logbook, RTC-stamped .txt + live .csv
├── views/
│   ├── view_chrome.h             # the header, presence dot and error screen
│   │                             #   every measurement view shares
│   ├── 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, mark and social card (generated), plus
│                                 #   device_*.png: real captures off a Flipper
├── screenshots/                  # the six captures the Apps Catalog listing uses
├── docs/catalog/                 # the prepared catalog manifest + how to submit
├── tools_check_layout.py         # static overlap + clearance checker (CI-gated)
└── tools_gen_*.py                # regenerate icons / mockups / banner / GIF
```
---

## Branding

**BACKLIGHT.** Impostato in **Didot** per l'identità, **Futura** per la voce, **Andale Mono**
per ogni valore misurato. L'arancione è `#FE8A2C` — *campionato* da una cattura qFlipper
di questa app in esecuzione, quindi è la retroilluminazione del Flipper stesso piuttosto che un
colore scelto per assomigliarvi. Ogni cattura in `screenshots/` è esattamente di due
colori, `(254,138,44)` e `(0,0,0)`; questo è ciò che emette l'hardware.

Non è mai usato come colore del brand. **L'unica brace su qualsiasi asset è la luce che il
dispositivo ha effettivamente emesso** — pixel all'interno di una cattura reale, incollati intatti a una
scala intera. L'artwork è disegnato nella stessa tonalità quindici gradi più fredda. Una rampa,
letta dalle estremità opposte: **più inchiostro significa più segnale su carta, più luce significa
più segnale sul nero** — perché la carta è dove finisce una scansione (Specter scrive un
logbook con timestamp che puoi consegnare a qualcuno) e il nero è dove accade
(la modalità stealth forza lo spegnimento della retroilluminazione).

L'accento disegna una cosa e nient'altro: **portante misurata.** Non è mai una
riga, una cornice, un margine o una parola — non ci sono parole dorate da nessuna parte nel
sistema, e il renderer solleva un'eccezione se una viene tentata. Quindi il banner porta
esattamente un oggetto color accento, e quell'oggetto è una misurazione.

La forma d'onda è 128 colonne di portante che Specter ha registrato da un vero lettore
polling a 8 ms per colonna, estratta di nuovo dalla schermata accanto ad essa. Il tratto piatto
a sinistra è il buffer di traccia prima che si riempisse, non silenzio misurato da qualcuno. Il suo
duty legge **28%** dove il contatore del dispositivo stesso ha stampato **27%**, e entrambi i
numeri sono sul banner. Il marchio è un ciclo di polling al **30%** di duty — i 12 ms su 40 ms di quel
lettore, e anche `SPECTER_FULL_SCALE_DUTY`, il duty al quale il
misuratore legge 100%. Un numero, due ragioni indipendenti per essere quello.

`#FE8A2C` è l'unico colore qui che non abbiamo scelto.

| Asset | Dimensione | Dove va |
|---|---|---|
| `images/banner.png` | 2560×800 | Intestazione del README, sfondo carta (2× così rimane nitido su retina) |
| `images/banner-dark.png` | 2560×800 | Lo stesso disegno su nero puro, servito da `<picture>` ai lettori in modalità scura |
| `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 | Marchio quadrato: post social, slide, favicon. **Non un avatar del repo** — GitHub mostra l'immagine del profilo del *proprietario* accanto a un repo, quindi non c'è un avatar per-repo da impostare |
| `images/mark-180/64/32/16.png` | come indicato | 180 e 64 ridimensionati; **32 e 16 sono disegnati nativamente** così nulla si anti-aliasa in una poltiglia |
| `images/demo.gif` | 384×192 | Una passeggiata scriptata attraverso ogni modalità, **registrata dal dispositivo** — `tools_screenshot.py --tour-gif` |
| `images/splash.gif` | 384×192 | L'intro di avvio, registrata dalla richiesta di lancio in poi — `--splash` |
| `images/screens.png` | — | Foglio di contatto delle catture, sfondo chiaro, ricostruito da `--sheet` |
| `images/screens-dark.png` | — | Lo stesso foglio su nero puro, servito da `<picture>` ai lettori in modalità scura |
| `screenshots/*.png` | 512×256 | **Ogni schermata, catturata da un dispositivo reale** via RPC. Esattamente due colori: quelli del pannello stesso. |```bash
python3 tools_brand_data.py          # the facts the branding is allowed to state
python3 tools_gen_banner.py          # banner (light + dark), social preview, logo mark
python3 tools_gen_icons.py           # 1-bit Flipper icons

# these need a Flipper on USB (pip install pyserial)
python3 tools_screenshot.py --all      # walk every screen and capture it
python3 tools_screenshot.py --reader   # the shots that need a live reader
python3 tools_screenshot.py --splash   # the boot intro
python3 tools_screenshot.py --tour-gif # one GIF of the app being used
```
> L'anteprima social è l'unico asset che GitHub non riesce a recuperare dal repository — deve
> essere caricata una volta manualmente in **Settings → Social preview**. È ciò che viene visualizzato
> quando il repository 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 per deauth Wi-Fi / evil-twin), **[GhostTag](https://github.com/at0m-b0mb/GhostTag-FlipperZero)** (cacciatore anti-stalking BLE) 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 sul 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
Scarica lo strumento