
Specter-FlipperZero v2.7
👻 Specter — barrido pasivo de lectores/skimmers NFC de 13.56 MHz para Flipper Zero. Medidor EMF de contravigilancia que utiliza el chip NFC integrado. Sin hardware adicional.
Specter 👻
Barre en busca de los lectores que no puedes ver.
Specter convierte tu Flipper Zero en un barrido de contravigilancia de bolsillo para lectores NFC activos de 13.56 MHz. Escucha pasivamente el campo de RF que un lector encendido emite constantemente — un skimmer de tarjetas oculto en un terminal de pago, un lector encubierto detrás de un panel de puerta, un registrador malicioso pegado bajo un escritorio — y luego te dice dónde está, qué tipo de dispositivo es, si la habitación está limpia y — si lo dejas en vigilancia — el momento en que uno aparece mientras estás ausente. Nunca transmite.
Los lectores son invisibles. Specter los hace visibles.
Destacado en
Help Net Security
·
Cyber Security News
📟 En el Flipper
Un barrido, de principio a fin: habitación tranquila → acercándose → fijado → qué es → el veredicto de la habitación.
Barrido (tranquilo) · Barrido (lector fijado) · Huella · Inspección (en curso) · Inspección (veredicto)
Vigilancia (despejado) · Vigilancia (¡lector!) · Registro · Calibrar · Ajustes
✨ Los cinco modos
Specter son cinco herramientas alrededor de un solo sensor. Cada una responde a una pregunta distinta, por lo que la adecuada depende de lo que realmente intentas averiguar:
| Modo | La pregunta que responde | Úsalo cuando |
|---|---|---|
| 🔍 Barrido | ¿Dónde está? | Sospechas de un dispositivo y quieres localizarlo moviéndote |
| 🔬 Huella | ¿Qué tipo de dispositivo es? | Has encontrado un emisor y quieres saber cómo se comporta |
| 🗺️ Inspección del sitio | ¿Está limpia esta habitación? | Quieres un veredicto para todo un espacio, sin usar las manos |
| 🛰️ Modo Vigilancia | ¿Apareció uno mientras estaba ausente? | Vas a dejar el Flipper en algún lugar para que haga guardia |
| 📖 Registro | ¿Qué encontré y cuándo? | Estás documentando los hallazgos o comparando hoy con la semana pasada — filtra por tipo de hallazgo |
🔍 Barrido — ¿dónde está?
Qué hace. Un medidor EMF en vivo. Sostén el Flipper en horizontal y muévelo lentamente sobre lo que estás revisando — un terminal de tarjetas, un lector de puerta, la parte inferior del borde de un cajero automático, un paquete, un escritorio. La aguja sigue la intensidad del campo en tiempo real.
Qué ves.
- El dial — la aguja = lectura en vivo, el punto pequeño = retención de pico (el punto más fuerte que has tocado, para que puedas comparar posiciones).
FIELD %— la misma lectura como número, con una flecha de tendencia ▲ / ▼ que te indica si el último medio segundo fue más cálido o más frío. Cuando estás cazando, esa flecha importa más que el número.PK/C— lectura máxima y cuántos contactos separados has tenido.- Franja inferior — la forma de onda en vivo y tu sensibilidad actual mientras está en silencio;
cambia a una barra de alarma negra
● ACTIVE READERcon una palabra de proximidad en el momento en que se detecta una portadora. - Proximidad —
FAINT → NEAR → CLOSE → STRONG → MAX.MAXsignifica que el medidor está al tope: estás tan cerca como esta medición puede resolver.
Sonido. Clics geiger opcionales que se aceleran a medida que te acercas, para que puedas barrer con el Flipper en el bolsillo y cazar solo con el oído.
| Tecla | Acción |
|---|---|
OK | Restablecer retención de pico y contador de contactos |
mantener OK | Guardar esta lectura en el registro |
IZQUIERDA | Calibrar con el ruido de fondo de la habitación (3 s) |
🔬 Huella — ¿qué tipo de dispositivo es?
Qué hace. Una vez que el Barrido ha encontrado algo, sostén el Flipper quieto contra él. La Huella deja de medir proximidad y comienza a cronometrar los flancos de encendido/apagado de la portadora, que es lo que realmente distingue un tipo de emisor de otro.
Qué ves. Un veredicto, una barra de confianza y la evidencia detrás de ambos:
| Clase | Qué significa en la práctica |
|---|---|
| CONTINUO | La portadora se mantiene permanentemente activa |
| SONDEO | Un ciclo de sondeo fijo y sincronizado por cristal — el período se muestra en ms |
| INTERMITENTE | Ráfagas irregulares — a menudo un teléfono o un lector en uso |
Debajo están PER (período de sondeo), BST (ancho de ráfaga), JIT (jitter) y
DUTY (ciclo de trabajo real), además de un tren de pulsos de analizador lógico de la
portadora cruda — para que el veredicto nunca sea algo que debas aceptar a ciegas. Un lector
de sondeo genuino aparece como una onda cuadrada inconfundible.
Un
~antes de un tiempo significa que está cerca del límite de muestreo de 2 ms, y la confianza se descuenta en consecuencia.
| Tecla | Acción |
|---|---|
OK | Guardar el hallazgo en el registro |
mantener OK | Reiniciar la medición |
🗺️ Inspección del sitio — ¿está limpia esta habitación?
Qué hace. Un barrido cronometrado de todo un espacio. Inícialo, camina por la habitación con normalidad y obtén un único veredicto al final — sin mirar la aguja.
Qué ves. Una cuenta regresiva y una barra de progreso mientras se ejecuta, luego una tarjeta de veredicto:
CLEAN— nada cruzó el ruido de fondoTRACE— golpes breves o débiles; vale la pena una segunda pasada más lentaACTIVE READER— algo estaba realmente activo y emitiendo
…con campo MAX / AVG, contador de contactos y FIELD % — cuánto del tiempo de la inspección
una portadora estuvo realmente activa, que a menudo es el número más revelador de los cuatro.
Se ejecuta durante 30 s, 60 s o 2 min, y registra el resultado automáticamente.
| Tecla | Acción |
|---|---|
OK | Ejecutar la inspección nuevamente |
🛰️ Modo Vigilancia — ¿apareció uno mientras estaba ausente?
Qué hace. Hace guardia indefinidamente. Ármalo, deja el Flipper en algún lugar, aléjate. Donde el Barrido es tú cazando y la Inspección es una prueba de duración fija, la Vigilancia solo espera — durante minutos u horas.
Qué ves. Un gran reloj de tiempo transcurrido y ALL CLEAR mientras no hay nada.
En el instante en que aparece un lector, la banda se invierte a READER PRESENT, la
pantalla se despierta y suena la alarma. La banda es estable en lugar de parpadear —
un pequeño marcador pulsa en su lugar, para que se lea como en vivo sin estroboscopiar. Después de que pasa, la pantalla conserva la
evidencia: HITS (cuántos contactos separados), PEAK, LAST (hace cuánto tiempo ocurrió el
más reciente) y SEEN (tiempo total en que una portadora estuvo realmente activa).
La Vigilancia ignora deliberadamente el modo sigiloso — un guardia oscuro y silencioso que nunca te dijera que vio algo sería peor que inútil.
| Tecla | Acción |
|---|---|
OK | Re-armar — restablece el reloj y los contadores |
📖 Registro — ¿qué encontré y cuándo?
Los hallazgos se guardan dos veces, con una sola acción, para que sean legibles en el dispositivo y ya sean una hoja de cálculo — sin pasos de exportación que recordar:
logbook.txt — agrupado, para el visor en el dispositivo | logbook.csv — una fila plana por entrada |
|---|---|
| ``` 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 … ``` |
Las entradas están etiquetadas como SWEEP, READER, SURVEY o WATCH y llevan la marca de tiempo del
reloj del Flipper. Ambos archivos viven en apps_data/specter/ de la tarjeta SD. Nada
sale jamás del dispositivo. Bórralos desde Settings → Clear logbook (con
confirmación previa — es lo único irreversible que la app puede hacer).
⚙️ Las piezas de apoyo
🎯 Auto-calibración
Pulsa LEFT en la pantalla de Sweep y Specter escucha el suelo de ruido ambiente durante 3 segundos y luego fija el umbral de detección justo por encima de lo que haya medido — guardado como tu sensibilidad Custom. Cada sala tiene un suelo de RF distinto; esto lo ajusta al de la sala en la que estás en lugar de a un número fijado en el momento de compilar. Ponte en un sitio silencioso cuando lo ejecutes.
🕶️ Modo sigiloso
Mantiene la pantalla y el LED apagados durante todo el barrido, para que el Flipper no
brille mientras eres tú quien mira. El sonido y la vibración siguen funcionando — el
objetivo no es desactivar la retroalimentación con la que estás barriendo. Salir de una pantalla
sigilosa vuelve a encender la pantalla, así que BACK siempre te lleva a un menú iluminado.
📏 Lectura del medidor
Por qué un lector que estás tocando no emite el 100% del tiempo. El detector mide una única cosa física: qué fracción del tiempo está activa una portadora de 13.56 MHz. Pero los lectores hacen polling — una ráfaga corta, una pausa, otra ráfaga. Un terminal típico solo está radiando entre el 20 y el 35% del tiempo, así que el ciclo de trabajo bruto se satura en torno al 30% por muy cerca que te pongas.
Mostrar ese número bruto en el indicador hacía que una detección perfecta pareciera un tercio de una. El medidor está escalado contra esa banda real de polling en su lugar:
| Ciclo de trabajo bruto de la portadora | Medidor | Proximidad |
|---|---|---|
| 3% (ruido de sala) | 10% | FAINT |
| 12% | 40% | NEAR |
| 20% | 67% | CLOSE |
| 28% | 93% | STRONG |
| ≥30% (apoyado sobre un lector) | 100% | MAX |
El ciclo de trabajo bruto nunca se pierde: el suelo de ruido, la auto-calibración y el
DUTY de la pantalla de Fingerprint siguen funcionando con el ciclo de trabajo real, porque esos
describen la señal, no tu distancia a ella. ¿Quieres el número literal?
Settings → Meter → Raw.
💾 Todo persiste
La sensibilidad, la duración del survey, el sonido, la vibración, el LED, el sigilo, el registro y el modo del medidor se guardan en la tarjeta SD en el momento en que los cambias. Un kit de barrido que olvida su configuración es peor que no tener persistencia alguna.
🧠 Cómo funciona
Todo lector NFC encendido emite continuamente una portadora de 13.56 MHz al aire, esperando que una tarjeta se despierte. No puedes verlo, pero el chip NFC del Flipper sí: el ST25R3916 tiene un detector de campo externo por hardware (el mismo circuito que permite al Flipper emular una tarjeta y saber cuándo un lector le está hablando). Specter deja el chip en modo solo-detección y muestrea ese bit de "¿campo presente?" unas 500 veces por segundo — sin activar jamás su propia portadora.
Ese único bit, muestreado con la suficiente rapidez, transporta dos señales independientes:```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
**Cuánto → intensidad.** En una ventana corta, Specter mide *qué fracción del tiempo* una portadora está
presente y la suaviza en el **FIELD %**. Un lector situado justo encima del Flipper fija el medidor;
uno más débil o más lejano lo mueve ligeramente. Eso impulsa la aguja, la palabra de proximidad y la tasa de clics.
**Qué ritmo → identidad.** Por separado, se cronometra cada transición de ese bit. Un lector que se activa
durante 20 ms cada 200 ms produce un patrón de ráfaga/pausa con casi nada de jitter, porque su bucle de sondeo está
impulsado por una máquina de estados sincronizada por cristal. El movimiento de la mano y el ruido de RF no son tan estables. Esa
diferencia es lo que separa **POLLING** de **INTERMITTENT**.
### Las capas de decisión se prueban en un ordenador real
Los lugares donde Specter convierte números en una *afirmación* — "esto es un lector de sondeo", "esta sala está
limpia", "esto es lo que debería leer la aguja" — son C puro sin dependencias de hardware, y están
fijados por pruebas en el host en lugar de descubiertos en el dispositivo:```bash
make -C test # 300 checks: classifier, verdict, meter scaling, presence
🚀 Instalación
Sin placa de desarrollo, sin firmware que flashear — es un único .fap.
Opción A — .fap precompilado (lo más fácil)
-
Descarga el
.fapcorrecto desde la página de Releases:Tu firmware Archivo Oficial / stock specter.fapUnleashed, RogueMaster, Momentum o cualquier versión más reciente specter-fw-dev.fapSi el Flipper dice
APP:87 < FW:88 — This app might not work, tienes el equivocado — toma el otro archivo. La versión de la API de la app se fija cuando se compila, por lo que una sola compilación no puede satisfacer ambas líneas de firmware. Normalmente sigue funcionando si pulsas Continue, pero la compilación correcta no lo preguntará. -
Abre qFlipper, arrastra el archivo a
SD Card / apps / NFC /. -
En el Flipper: Apps → NFC → Specter.
Opción B — compílalo tú mismo 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
El `.fap` termina en `dist/specter.fap`; `ufbt launch` lo copia a `apps/NFC/` y lo inicia por ti.
> Los iconos en `icons/`, las capturas de pantalla y el banner en `images/` se generan — regenera con
> `python3 tools_gen_icons.py`, `python3 tools_gen_mockups.py` y `python3 tools_gen_banner.py` (necesita `pillow`).
---
## 🎮 Cómo usarlo
**Un barrido, de principio a fin:**
1. Inicia **Specter**. En la pantalla **Sweep**, pulsa **LEFT** y mantén pulsado durante 3 segundos para
calibrar el ruido de fondo de la sala.
2. Mantén el Flipper plano y muévelo **lentamente** sobre lo que estás revisando — un terminal de tarjeta, un
lector de puerta, la parte inferior del borde de un cajero automático, un paquete, un escritorio.
- **Forma de onda plana / silenciosa** → no hay ningún lector activo en el alcance.
- **La aguja sube, los clics se aceleran** → te estás acercando a un emisor. Sigue hacia el pico.
- **`● ACTIVE READER` + borde de alarma** → hay un lector activo justo aquí.
3. ¿Has encontrado algo? Sal y abre **Fingerprint**. Mantén el Flipper quieto contra ello y deja que el
ritmo se asiente — unos segundos suelen ser suficientes. Pulsa **OK** para guardar el hallazgo.
4. ¿Estás limpiando una sala entera en su lugar? Abre **Site Survey**, recorre el espacio hasta que la barra se llene y lee
el veredicto.
5. ¿Te vas de la zona? Deja el Flipper en **Watch Mode** y hará guardia, despertándose y sonando
si aparece un lector mientras no estás.
6. Consulta **Logbook** para ver todo lo que has guardado, con marca de tiempo — o extrae `logbook.csv` de la tarjeta
a una hoja de cálculo.
> 💡 Barre primero un lector que sepas que funciona (tu propio teléfono haciendo NFC, o un terminal sin contacto en el que confíes) para
> ver cómo se ve un campo fuerte y legítimo en el medidor — y cómo se lee su huella. Luego
> ve a cazar.
### Controles
| Pantalla | Tecla | Acción |
|---|---|---|
| **Sweep** | `OK` | Restablecer pico / contactos |
| | `mantener OK` | Registrar la lectura actual |
| | `LEFT` | Calibrar el ruido de fondo (3 s) |
| **Fingerprint** | `OK` | Guardar el hallazgo en el logbook |
| | `mantener OK` | Reiniciar la medición |
| **Site Survey** | `OK` | Ejecutar el barrido de nuevo |
| **Watch Mode** | `OK` | Re-armar (borrar contador y reloj) |
| *en cualquier lugar* | `BACK` | Subir un nivel |
---
## 🔬 Limitaciones honestas
- **Solo 13.56 MHz (HF).** Specter detecta la **banda NFC** — la que usan los skimmers de pago sin contacto,
la mayoría de los lectores de acceso modernos, los lectores de tránsito y de hotel. **No** puede
ver lectores de **125 kHz (LF)** (paneles de puerta HID Prox / EM4100 más antiguos); la ruta LF del Flipper no tiene un bit equivalente de detección de campo.
- **Detecta la *portadora* de un lector, no lo que lee.** Specter te dice *hay un lector activo aquí,
aproximadamente a qué distancia, y con qué ritmo sondea* — no decodifica, identifica ni captura nada
de lo que hace el lector.
- **La intensidad es relativa, no calibrada.** `FIELD %` y las palabras de proximidad son una guía comparativa de "más cerca /
más lejos" para barrer, no una distancia medida en cm. Es una lectura *escalada* del
ciclo de trabajo de la portadora frente a una banda de sondeo típica (ver [Reading the meter](#-reading-the-meter--fixed-in-23));
un lector que sondea de forma inusualmente dispersa se leerá más bajo a la misma distancia, y uno en modo
de onda continua se fijará desde más lejos.
- **El medidor llega a su tope.** `MAX` significa que la portadora está tan alta como este lector la mantiene — más allá de
ese punto, acercarse genuinamente no puede producir un número mayor. Usa el retención de pico `PK` para comparar
posiciones en su lugar.
- **El ritmo se resuelve a ~2 ms.** Ese es el período de muestreo. Los tiempos cercanos a él se muestran con
una **`~`** y la confianza se descuenta en consecuencia — Specter prefiere marcar su propio límite de resolución
antes que citar un número de aspecto preciso que no puede respaldar.
- **`CLEAN` significa limpio a la sensibilidad que elegiste.** Un skimmer inactivo que solo se despierta con un toque real,
o uno que está blindado, permanece invisible en *cualquier* umbral. La ausencia de una lectura no es una garantía de
ausencia.
- **Una radio a la vez.** Specter toma el control del chip NFC mientras barre, así que cierra cualquier otra app NFC primero
(dirá *NFC unavailable* si algo más tiene la radio).
---
## ⚖️ Legal y ético
Specter es una herramienta **defensiva, solo de escucha** — **nunca transmite**, nunca alimenta un campo, nunca toca
el lector. Úsalo para barrer **tu propia** zona de TPV, puerta, escritorio o pertenencias, o hardware que estés **explícitamente
autorizado** a evaluar. Eres responsable de cómo lo usas. Conoce tus leyes locales.
---
## 🗺️ Hoja de ruta
- [x] Conservar sensibilidad / sonido / vibración / LED entre reinicios
- [x] "Logbook" de detecciones con marcas de tiempo en la tarjeta SD
- [x] Barrido en segundo plano con la pantalla apagada — *modo sigiloso*
- [x] Umbral ajustable para un control de alcance más fino — *auto-calibración + sensibilidad personalizada*
- [x] Huella de un emisor por su ritmo de sondeo
- [x] Inspección de sitio cronometrada con veredicto de sala
- [x] Exportar el logbook como CSV para informes — *escrito en vivo junto al .txt*
- [x] Modo de vigilancia desatendida de larga duración con alarma de activación por detección
- [x] Hacer que el medidor use todo su rango contra lectores de sondeo reales
- [x] Flecha de tendencia más cerca / más lejos mientras cazas
- [ ] Investigar un sensor de lector basado en bobina LF (125 kHz) como modo separado
- [ ] Filtrado del logbook en el dispositivo por tipo
---
## 🗂️ Estructura del proyecto```
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
🎨 Marca
Todo el arte se genera, por lo que nunca se desvía de la aplicación:
| Recurso | Tamaño | Dónde va |
|---|---|---|
images/banner.png | 2560×800 | Cabecera del README (2× para que se mantenga nítido en retina) |
images/social-preview.png | 1280×640 | Configuración → Vista previa social — el tamaño recomendado por GitHub (mín. 640×320, límite de 1 MB) |
images/mark.png | 512×512 | Marca de logotipo cuadrada: avatares, favicons, diapositivas |
images/demo.gif | 768×384 | La animación anterior, ~9 s, creada a partir de las constantes reales de la 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 |
> La vista previa social es el único recurso que GitHub no puede extraer del repositorio: debe
> subirse una vez manualmente en **Settings → Social preview**. Es lo que se muestra
> cuando el repositorio se comparte en Slack, X, LinkedIn o Discord.
---
## 🙏 Créditos
- Creado por **[at0m-b0mb](https://github.com/at0m-b0mb)**.
- Parte de una familia de herramientas de seguridad para Flipper: **[Argus](https://github.com/at0m-b0mb/Argus-FlipperZero)** (watchdog de deauth Wi-Fi / evil-twin), **[GhostTag](https://github.com/at0m-b0mb/GhostTag-FlipperZero)** (cazador anti-acecho BLE) y **[Cerberus](https://github.com/at0m-b0mb/flipper-cerberus)** (watchdog de RF Sub-GHz).
- Impulsado por el firmware del [Flipper Zero](https://github.com/flipperdevices/flipperzero-firmware) NFC HAL (`furi_hal_nfc` detección de campo) + [ufbt](https://github.com/flipperdevices/flipperzero-ufbt).
## 📄 Licencia
[MIT](https://github.com/at0m-b0mb/specter-flipperzero/blob/main/LICENSE) © 2026 at0m-b0mb