Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
Specter-FlipperZero — Specter — barrido pasivo de bugs para lector/skimmer NFC de 13,56 MHz para Flipper Zero. Medidor EMF de contravigilancia que utiliza el chip NFC integrado. Sin hardware adicional, nunca transmite. | Kitploit
Herramientas/GitHubGitHub/at0m-b0mb/specter-flipperzero
Herramientas DefensivasSeguridad de Sistemas EmbebidosSeguridad IoTHerramientas RFID/NFCPruebas de PenetraciónSeguridad de HardwareRed Teaming
GitHubat0m-b0mb/specter-flipperzero

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →

Specter-FlipperZero

Specter — barrido pasivo de bugs para lector/skimmer NFC de 13,56 MHz para Flipper Zero. Medidor EMF de contravigilancia que utiliza el chip NFC integrado. Sin hardware adicional, nunca transmite.

Ver Repositorio
88487hace 5 díasRevisado por Kitploit
Compartir
<!-- 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 de onda no es un gráfico. Son 128 columnas de portadora de 13,56&nbsp;MHz que
    Specter registró de un lector de sondeo real a 8&nbsp;ms por columna, leídas
    de la captura de pantalla que tiene al lado. Su ciclo de trabajo mide 28% donde el propio
    contador del dispositivo imprimió 27%, y ambos números están en el banner.
  </sub>
</p>

<p align="center"><i>Barre en busca de los lectores que no puedes ver.</i></p>

<p align="center">
  <a href="https://at0m-b0mb.github.io/Specter-FlipperZero/"><b>Sitio del proyecto</b></a>
  &nbsp;·&nbsp;
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases/latest">Descargar</a>
  &nbsp;·&nbsp;
  <a href="https://github.com/at0m-b0mb/specter-flipperzero/blob/main/docs/changelog.md">Registro de cambios</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> convierte tu Flipper Zero en un <b>barrido de contravigilancia</b> de bolsillo
  para <b>lectores NFC de 13,56 MHz activos</b>. <i>Escucha pasivamente</i> el campo de RF que un
  lector encendido emite constantemente — un skimmer de tarjetas oculto introducido en un terminal de pago, un lector
  encubierto detrás de un panel de puerta, un registrador no autorizado pegado bajo un escritorio — y luego te dice <b>dónde está</b>,
  <b>qué tipo de cosa es</b>, <b>si la sala está limpia</b> y — dejado en vigilancia — <b>el
  momento en que uno aparece mientras estás fuera</b>. Nunca transmite.
</p>

<p align="center"><sub>Los lectores son invisibles. Specter los hace visibles.</sub></p>

<p align="center">
  <sub>
    <b>Destacado en</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>

---

## En el 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>Un barrido, de principio a fin: sala silenciosa → acercándose → fijado → <b>qué</b> es → el veredicto de la sala.</sub>
</p>

### Las pantallas que ningún modo en solitario posee

<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>
    Los estados silenciosos y la intro — los cuatro modos de abajo tienen cada uno su propia
    captura, así que estas son las que no tienen. <b>Cada imagen
    de este README es una captura de un dispositivo real</b>, tomada a través de la propia
    sesión RPC del Flipper mediante <code>tools_screenshot.py</code>. Ya no hay un renderizador
    de maquetas en este proyecto — un dibujo de la UI es una segunda
    implementación de la misma, y no coincidía con el firmware mientras parecía
    perfectamente convincente (ver <a href="https://github.com/at0m-b0mb/specter-flipperzero/blob/main/docs/changelog.md">3.0.1</a>).
  </sub>
</p>

---

## Los cinco modos

Specter son cinco herramientas en torno a un sensor. Cada una responde a una pregunta distinta, así que
la correcta depende de lo que realmente intentas averiguar:

| Modo | La pregunta que responde | Úsalo cuando |
|---|---|---|
| **Sweep** | *¿Dónde está?* | Sospechas de un dispositivo y quieres localizarlo moviéndote |
| **Fingerprint** | *¿Qué tipo de cosa es?* | Has encontrado un emisor y quieres saber cómo se comporta |
| **Site Survey** | *¿Está limpia esta sala?* | Quieres un único veredicto para todo un espacio, sin usar las manos |
| **Watch Mode** | *¿Apareció uno mientras estaba fuera?* | Dejas el Flipper en algún lugar para que haga guardia |
| **Logbook** | *¿Qué encontré, y cuándo?* | Estás redactando el informe, o comparando hoy con la semana pasada — filtra por tipo de hallazgo |

---

### Sweep — *¿dónde está?*

<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">

**Qué hace.** Un medidor en vivo estilo EMF. Sujeta el Flipper plano y muévelo despacio
sobre lo que estás revisando — un terminal de tarjetas, un lector de puerta, la parte inferior de
la ranura de un cajero, 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 dice si el último medio segundo puso las cosas *más calientes o más frías*. Cuando
  estás cazando, esa flecha importa más que el número.
- **`PEAK %`** — la lectura más fuerte desde que armaste, el número detrás del
  punto de retención de pico.
- **La marca en el dial** — dónde *comienza* `READER` con tu sensibilidad
  actual. Todo lo que está más allá es lo que Specter llamará un impacto, así que el dial
  responde "¿qué cuenta?" en lugar de dejarte adivinando.
- **Franja inferior** — hasta que hayas encontrado tu primer lector, muestra las dos teclas
  que no puedes descubrir pulsando cosas (`LEFT=cal`, `hold OK=log`); después de eso,
  tu sensibilidad y una forma de onda en vivo. Cambia a una barra de alarma negra
  **`● ACTIVE READER`** con una palabra de proximidad en el momento en que se
  detecta una portadora.
- **Proximidad** — `FAINT → NEAR → CLOSE → STRONG → PEGGED`. `PEGGED` significa que el medidor está
  *pegado*: estás tan cerca como esta medición puede resolver.

**Sonido.** Clics de geiger opcionales que **se aceleran a medida que te acercas**, para que puedas
barrer con el Flipper en el bolsillo y cazar solo de oído.

| Tecla | Acción |
|---|---|
| `OK` | Reinicia la retención de pico y el recuento de contactos |
| `hold OK` | Guarda esta lectura en el logbook |
| `LEFT` | Calibra al nivel de ruido de la sala (3 s) |
| `UP` / `DOWN` | Ajusta la sensibilidad sin salir de la caza |

<br clear="right">

### Fingerprint — *¿qué tipo de cosa es?*

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

**Qué hace.** Una vez que Sweep ha encontrado algo, mantén el Flipper **quieto**
contra ello. Fingerprint deja de medir la proximidad y empieza 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 |
|---|---|
| **CONTINUOUS** | La portadora se mantiene permanentemente activa |
| **POLLING** | Un ciclo de sondeo fijo, cronometrado por cristal — el periodo se muestra en ms |
| **INTERMITTENT** | A ráfagas pero irregular — a menudo un teléfono o un lector en uso |

Debajo están `PER` (periodo de sondeo), `BST` (ancho de ráfaga), `JIT` (jitter) y
`UP` (ciclo de trabajo real), además de un **tren de pulsos de analizador lógico** de la portadora
en bruto — para que el veredicto nunca sea algo que tengas que aceptar por fe. Un lector
de sondeo genuino aparece como una onda cuadrada inconfundible.

> Un `~` antes de una medición temporal significa que está cerca del límite de muestreo de 2 ms, y la
> confianza se descuenta en consecuencia.

| Tecla | Acción |
|---|---|
| `OK` | Guarda el hallazgo en el logbook |
| `hold OK` | Reinicia la medición |

<br clear="right">

### Site Survey — *¿está limpia esta sala?*

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

**Qué hace.** Un barrido **cronometrado** de todo un espacio. Inícialo, camina por la sala
con normalidad y obtén un único veredicto al final — sin mirar la aguja.

**Qué ves.** Una cuenta atrás y una barra de progreso mientras se ejecuta, luego una tarjeta de veredicto:

- **`CLEAN`** — nada cruzó el nivel de ruido
- **`TRACE`** — impactos breves o débiles; merece una segunda pasada más lenta
- **`ACTIVE READER`** — algo estaba genuinamente activo y emitiendo
- **`TOO SHORT`** — lo detuviste antes de que se hubiera ganado el derecho a decir `CLEAN`

…con `PEAK` / `AVG` de campo, recuento de contactos y `UP %` — **cuánto del estudio
estuvo una portadora 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. La tarjeta indica
la duración sobre la que se calificó, porque un `CLEAN` de 30 segundos no es el mismo
hallazgo que uno de dos minutos — y una ejecución cortada antes de 10 s informa
`TOO SHORT` en lugar de `CLEAN`. La asimetría es deliberada: **la presencia es
prueba, la ausencia no.** Encontrar algo en un segundo es un hallazgo real, así que
`TRACE` y `ACTIVE READER` nunca se retienen por ser rápidos; no encontrar nada
en un segundo es una afirmación sobre toda la sala que un segundo no puede respaldar.

| Tecla | Acción |
|---|---|
| `OK` *(en ejecución)* | Detén ahora y califica lo que tiene |
| `OK` *(en la tarjeta)* | Ejecuta otro estudio |

<br clear="right">

### Watch Mode — *¿apareció uno mientras estaba fuera?*

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

**Qué hace.** Monta guardia **indefinidamente**. Ármalo, deja el Flipper en su sitio,
aléjate. Donde Sweep eres tú cazando y Survey es una prueba de duración fija, Watch
simplemente espera — durante minutos u horas.

**Qué ves.** Un reloj grande de tiempo transcurrido y `NO READER` mientras no hay nada. En el
instante en que aparece un lector, la banda se invierte a **`ACTIVE READER`**, una barra de intensidad
muestra lo cerca que está, la **pantalla se despierta** y suena la alarma. La banda
es estable en lugar de parpadear — en una pantalla de 1 bit un bloque invertido sólido ya es
lo más llamativo que hay en ella, y las lecturas que cambian de verdad aportan
la sensación de actividad. Después de que pase, la pantalla conserva la evidencia: `HITS` (cuántos
contactos separados), `PEAK`, `LAST` (cuánto tiempo hace del más reciente) y
`UP` (tiempo total que una portadora estuvo realmente activa). El reloj pasa a `hh:mm`
después de 99:59 en lugar de congelarse, así que una vigilancia nocturna sigue sumando.

Watch **ignora deliberadamente el modo sigiloso** — un guardia oscuro y silencioso que nunca
te dice que vio algo sería peor que inútil.

| Tecla | Acción |
|---|---|
| `OK` | Rearma — borra el reloj y los contadores |

<br clear="right">

### Logbook — *¿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 paso de exportación que recordar:

<table>
<tr><th><code>logbook.txt</code> — agrupado, para el visor en el dispositivo</th><th><code>logbook.csv</code> — una fila plana por entrada</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>

Las entradas se etiquetan como `SWEEP`, `READER`, `SURVEY` o `WATCH` y se marcan con la
hora del reloj del Flipper. Ambos archivos residen en `apps_data/specter/` en la tarjeta SD. Nada
sale nunca del dispositivo. Bórralos desde **Settings → Clear logbook** (con confirmación
previa — es lo único irreversible que puede hacer la aplicación).

---

## Las partes de apoyo

### Autocalibración

Pulsa **LEFT** en la pantalla de Sweep y Specter escucha el **nivel de ruido
ambiental durante 3 segundos**, y luego fija el umbral de detección justo por encima de lo que
midió — guardado como tu sensibilidad **Custom**. Cada habitación tiene un suelo de RF
diferente; esto se ajusta al de la sala en la que estás en lugar de a un número predefinido en
el momento de la compilación. Colócate en un lugar tranquilo cuando lo ejecutes.

### Modo sigiloso

Mantiene la **pantalla y el LED apagados** durante todo el barrido, para que el Flipper no brille
mientras tú eres el que está mirando. 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.

### Interpretar el 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 **sondean** — una ráfaga corta, una pausa, otra ráfaga. Un terminal típico
solo irradia el **20–35% del tiempo**, así que el ciclo de trabajo bruto *se satura* en torno al 30%
sin importar lo 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 de sondeo real:

| Ciclo de trabajo bruto de la portadora | Medidor | Proximidad |
|---|---|---|
| 3% (ruido de la sala) | 10% | `FAINT` |
| 12% | 40% | `NEAR` |
| 20% | 67% | `CLOSE` |
| 28% | 93% | `STRONG` |
| ≥30% *(apoyado sobre un lector)* | **100%** | `PEGGED` |

El **ciclo de trabajo bruto nunca se pierde**: el nivel de ruido, la autocalibración y el
`UP` de la pantalla Fingerprint siguen funcionando en ciclo de trabajo real, porque esos
describen la *señal*, no tu distancia a ella. ¿Quieres el número literal?
**Settings → Meter scale → Duty %**.

### Todo persiste

La sensibilidad, la duración del barrido, 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 pulsos al aire con una portadora de 13,56 MHz**, esperando a 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
está hablando con él). Specter pone el chip en modo de solo detección y **muestrea ese bit de "¿hay campo?""
~500 veces por segundo** — sin encender nunca 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<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
```
**Cuánto → intensidad.** Durante una ventana corta, Specter mide *qué fracción del tiempo* está presente una portadora y la suaviza en el **FIELD %**. Un lector situado justo encima del Flipper satura el medidor; uno más débil o más lejano apenas lo mueve. Eso controla 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 despierta 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á gobernado por una máquina de estados temporizada 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 puntos 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 marcar la aguja" — son C puro sin dependencias de hardware, y quedan fijados por pruebas en el host en lugar de descubrirse en el dispositivo:```bash
make -C test     # 527 checks: classifier, verdict, meter scaling, presence,
                 #             cadence, log filtering, log wrapping
```
---

## Instalar

Sin devboard, sin firmware que flashear — es un único `.fap`.

**Opción A — `.fap` precompilado (la más fácil)**

1. Descarga el `.fap` correcto desde la página de [**Releases**](https://github.com/at0m-b0mb/Specter-FlipperZero/releases):

   | Tu firmware | Archivo |
   |---|---|
   | **Oficial / stock** | `specter.fap` |
   | **Unleashed, RogueMaster, Momentum** o cualquier más reciente | `specter-fw-dev.fap` |

   > Si el Flipper muestra **`APP:87 < FW:88 — This app might not work`**, tienes el
   > incorrecto — usa el otro archivo. La versión de API de la app es fija cuando se compila,
   > así que una sola build no puede satisfacer ambas líneas de firmware. Normalmente sigue funcionando si
   > pulsas Continue, pero la build que coincide no lo preguntará.
2. Abre **qFlipper**, arrastra el archivo a `SD Card / apps / NFC /`.
3. En el Flipper: **Apps → NFC → Specter**.

**Opción B — compílalo tú mismo 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
```
El `.fap` aterriza en `dist/specter.fap`; `ufbt launch` lo copia a `apps/NFC/` y lo inicia por ti.

> Los iconos en `icons/` y el banner en `images/` son generados — regenéralos con
> `python3 tools_gen_icons.py` y `python3 tools_gen_banner.py` (necesita `pillow`).
> Todo lo que hay en `screenshots/` se captura desde un dispositivo real con
> `python3 tools_screenshot.py` (necesita `pyserial` y un Flipper conectado por USB).

---

## Uso

**Un barrido, de principio a fin:**

1. Inicia **Specter**. En la pantalla **Sweep**, pulsa **LEFT** y mantente quieto 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 tarjetas, 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 rango.
   - **La aguja sube, los clics se aceleran** → te estás acercando a un emisor. Sigue avanzando hacia el pico.
   - **`● ACTIVE READER` + borde de alarma** → hay un lector activo justo aquí.
3. ¿Encontraste algo? Retrocede y abre **Fingerprint**. Mantén el Flipper quieto contra él y deja que la
   cadencia se estabilice — unos segundos suelen ser suficientes. Pulsa **OK** para guardar el hallazgo.
4. ¿Prefieres despejar una sala entera? 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 montará guardia, despertándose y sonando
   si aparece un lector mientras no estás.
6. Consulta el **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 sabes que es bueno (tu propio teléfono haciendo NFC, o un terminal sin contacto de confianza) para
> ver cómo se ve un campo fuerte y legítimo en el medidor — y cómo se lee su huella. Luego
> sal a cazar.

### Controles

| Pantalla | Tecla | Acción |
|---|---|---|
| **Sweep** | `OK` | Reiniciar pico / contactos |
| | `hold OK` | Registrar la lectura actual |
| | `LEFT` | Calibrar el ruido de fondo (3 s) |
| **Fingerprint** | `OK` | Guardar el hallazgo en el logbook |
| | `hold OK` | Reiniciar la medición |
| **Site Survey** | `OK` | Ejecutar el sondeo de nuevo |
| **Watch Mode** | `OK` | Rearmar (borrar conteo 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 transporte y hoteles. **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 *que hay un lector activo aquí,
  más o menos 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 caliente /
  más frío" para el barrido, 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 esporádica dará una lectura más baja a la misma distancia, y uno en modo de onda continua
  marcará el máximo desde más lejos.
- **El medidor llega a su tope.** `PEGGED` 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. El Flipper vibra una vez cuando ocurre,
  para que sepas que debes dejar de moverte incluso cuando no puedes ver la pantalla. Usa la retención de `PEAK` para comparar
  posiciones en su lugar.
- **La cadencia se resuelve a ~2 ms.** Ese es el período de muestreo. Los tiempos cercanos a él se muestran con un
  **`~`** y la confianza se descuenta en consecuencia — Specter prefiere señalar su propio límite de resolución
  que citar un número de aspecto preciso que no puede respaldar.
- **`CLEAN` significa limpio con la sensibilidad que elegiste.** Un skimmer inactivo que solo se despierta con un toque real,
  o uno que está blindado, permanece invisible con *cualquier* umbral. La ausencia de una lectura no es 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. Úsala 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 la usas. Conoce las leyes de tu localidad.

---

## Hoja de ruta

- [x] Persistir 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 rango más fino — *autocalibración + sensibilidad personalizada*
- [x] Huella de un emisor por su cadencia de sondeo
- [x] Sondeo de sitio cronometrado 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 frente a lectores de sondeo reales
- [x] Flecha de tendencia más caliente/más frío durante la caza
- [ ] Investigar una detección de lector LF (125 kHz) basada en bobina 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
│   ├── 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.** Establecido en **Didot** para la identidad, **Futura** para la voz, **Andale Mono**
para cada valor medido. El naranja es `#FE8A2C` — *muestreado* de una captura
de qFlipper de esta app en ejecución, por lo que es la propia retroiluminación del
Flipper en lugar de un color elegido para parecerse a ella. Cada captura en `screenshots/` es exactamente de dos
colores, `(254,138,44)` y `(0,0,0)`; eso es lo que emite el hardware.

Nunca se usa como color de marca. **La única brasa en cualquier recurso es luz que el
dispositivo realmente emitió** — píxeles dentro de una captura real, pegados intactos a una
escala entera. La ilustración se dibuja en el mismo tono quince grados más frío. Una rampa,
leída desde extremos opuestos: **más tinta significa más señal en papel, más luz significa
más señal sobre negro** — porque el papel es donde termina un barrido (Specter escribe un
libro de registro con marcas de tiempo que puedes entregar a alguien) y el negro es donde sucede
(el modo sigiloso fuerza el apagado de la retroiluminación).

El acento dibuja una cosa y nada más: **portadora medida.** Nunca es una
regla, un marco, un margen o una palabra — no hay palabras doradas en ningún lugar del
sistema, y el renderizador lanza un error si se intenta una. Así que el banner lleva
exactamente un objeto de color de acento, y ese objeto es una medición.

La forma de onda son 128 columnas de portadora que Specter registró de un lector de sondeo real
a 8 ms por columna, extraídas de nuevo de la captura de pantalla junto a ella. El tramo plano a
la izquierda es el búfer de traza antes de llenarse, no un silencio que alguien midiera. Su
ciclo de trabajo marca **28%** donde el propio contador del dispositivo imprimió **27%**, y ambos
números están en el banner. La marca es un ciclo de sondeo al **30%** de
ciclo de trabajo — los 12 ms de 40 ms de ese lector, y también `SPECTER_FULL_SCALE_DUTY`, el ciclo de trabajo al que
el medidor marca 100%. Un número, dos razones independientes para serlo.

`#FE8A2C` es el único color aquí que no elegimos.

| Recurso | Tamaño | Dónde va |
|---|---|---|
| `images/banner.png` | 2560×800 | Encabezado del README, fondo papel (2× para que se mantenga nítido en retina) |
| `images/banner-dark.png` | 2560×800 | El mismo dibujo sobre negro puro, servido por `<picture>` a lectores en modo oscuro |
| `images/social-preview.png` | **1280×640** | **Settings → Social preview** — el tamaño recomendado por GitHub (mín 640×320, límite de 1 MB) |
| `images/mark.png` | 512×512 | Marca cuadrada del logo: publicaciones sociales, diapositivas, favicon. **No es un avatar de repositorio** — GitHub muestra la imagen de perfil del *propietario* junto a un repositorio, así que no hay avatar por repositorio que configurar |
| `images/mark-180/64/32/16.png` | como se indica | 180 y 64 reducidos; **32 y 16 se dibujan de forma nativa** para que nada se suavice hasta volverse papilla |
| `images/demo.gif` | 384×192 | Un recorrido guionizado por cada modo, **grabado del dispositivo** — `tools_screenshot.py --tour-gif` |
| `images/splash.gif` | 384×192 | La intro de arranque, grabada desde la solicitud de lanzamiento en adelante — `--splash` |
| `images/screens.png` | — | Hoja de contactos de las capturas, fondo claro, reconstruida por `--sheet` |
| `images/screens-dark.png` | — | La misma hoja sobre negro puro, servida por `<picture>` a lectores en modo oscuro |
| `screenshots/*.png` | 512×256 | **Cada pantalla, capturada de un dispositivo real** vía RPC. Exactamente dos colores: los del propio panel. |```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
```
> La vista previa social es el único recurso que GitHub no puede obtener 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)** (vigilante de deauth Wi-Fi / evil-twin), **[GhostTag](https://github.com/at0m-b0mb/GhostTag-FlipperZero)** (cazador anti-acoso BLE) y **[Cerberus](https://github.com/at0m-b0mb/flipper-cerberus)** (vigilante de RF Sub-GHz).
- Impulsado por el [firmware de Flipper Zero](https://github.com/flipperdevices/flipperzero-firmware) NFC HAL (detección de campo `furi_hal_nfc`) + [ufbt](https://github.com/flipperdevices/flipperzero-ufbt).

## Licencia

[MIT](https://github.com/at0m-b0mb/specter-flipperzero/blob/main/LICENSE) © 2026 at0m-b0mb
Descargar herramienta