
Specter-FlipperZero v2.7
👻 Specter — varredura passiva de leitores/skimmers NFC de 13.56 MHz para Flipper Zero. Medidor de EMF de contra-vigilância usando o chip NFC integrado. Sem hardware extra.
Specter 👻
Varra à procura dos leitores que você não consegue ver.
O Specter transforma o seu Flipper Zero em uma varredura de contra-vigilância de bolso para leitores NFC ativos de 13,56 MHz. Ele escuta passivamente o campo de RF que um leitor ligado emite constantemente — um skimmer de cartão escondido em um terminal de pagamento, um leitor oculto atrás de um painel de porta, um logger malicioso preso embaixo de uma mesa — e então informa onde ele está, que tipo de coisa é, se o ambiente está limpo e — se deixado de vigia — o momento em que um aparece enquanto você está ausente. Ele nunca transmite.
Os leitores são invisíveis. O Specter os torna visíveis.
📟 No Flipper
Sweep (silencioso) · Sweep (leitor travado) · Fingerprint · Survey (em execução) · Survey (veredito)
Watch (limpo) · Watch (leitor!) · Logbook · Calibrate · Settings
✨ Os cinco modos
O Specter são cinco ferramentas em torno de um único sensor. Cada uma responde a uma pergunta diferente, então a certa depende do que você realmente está tentando descobrir:
| Modo | A pergunta que ele responde | Use quando |
|---|---|---|
| 🔍 Sweep | Onde está? | Você suspeita de um dispositivo e quer localizá-lo movendo-se pelo ambiente |
| 🔬 Fingerprint | Que tipo de coisa é? | Você encontrou um emissor e quer saber como ele se comporta |
| 🗺️ Site Survey | Este ambiente está limpo? | Você quer um único veredito para um espaço inteiro, sem usar as mãos |
| 🛰️ Watch Mode | Algum apareceu enquanto eu estava ausente? | Você vai deixar o Flipper em algum lugar para ficar de guarda |
| 📖 Logbook | O que encontrei e quando? | Você está registrando os resultados, ou comparando hoje com a semana passada |
🔍 Sweep — onde está?
O que faz. Um medidor ao vivo no estilo EMF. Segure o Flipper na horizontal e mova-o lentamente sobre o que você está verificando — um terminal de cartão, um leitor de porta, a parte inferior de um caixa eletrônico, um pacote, uma mesa. A agulha acompanha a intensidade do campo em tempo real.
O que você vê.
- O mostrador — agulha = leitura ao vivo, o pontinho = peak-hold (o ponto mais forte que você tocou, para comparar posições).
FIELD %— a mesma leitura como número, com uma seta de tendência ▲ / ▼ indicando se o último meio segundo ficou mais quente ou mais frio. Quando você está caçando, essa seta importa mais do que o número.PK/C— leitura de pico e quantos contatos separados você teve.- Faixa inferior — a forma de onda ao vivo e sua sensibilidade atual enquanto está silencioso;
ela muda para uma barra de alarme preta
● ACTIVE READERcom uma palavra de proximidade no momento em que uma portadora é detectada. - Proximidade —
FAINT → NEAR → CLOSE → STRONG → MAX.MAXsignifica que o medidor está no máximo: você está tão perto quanto esta medição consegue resolver.
Som. Cliques geiger opcionais que aceleram conforme você se aproxima, para que você possa fazer a varredura com o Flipper no bolso e caçar apenas pelo ouvido.
| Tecla | Ação |
|---|---|
OK | Redefinir peak-hold e contagem de contatos |
segurar OK | Salvar esta leitura no logbook |
LEFT | Calibrar para o ruído de fundo do ambiente (3 s) |
🔬 Fingerprint — que tipo de coisa é?
O que faz. Depois que o Sweep encontrar algo, segure o Flipper parado contra ele. O Fingerprint para de medir proximidade e começa a cronometrar as bordas de liga/desliga da portadora, que é o que realmente distingue um tipo de emissor de outro.
O que você vê. Um veredito, uma barra de confiança e as evidências por trás de ambos:
| Classe | O que significa na prática |
|---|---|
| CONTINUOUS | A portadora é mantida permanentemente ativa |
| POLLING | Um ciclo de polling fixo, cronometrado por cristal — o período é mostrado em ms |
| INTERMITTENT | Em rajadas, mas irregular — geralmente um telefone ou um leitor em uso |
Abaixo estão PER (período de polling), BST (largura da rajada), JIT (jitter) e
DUTY (ciclo de trabalho real), além de um trem de pulsos de analisador lógico da portadora
bruta — então o veredito nunca é algo que você precisa aceitar por fé. Um leitor
genuíno em polling aparece como uma onda quadrada inconfundível.
Um
~antes de um tempo significa que está próximo do piso de amostragem de 2 ms, e a confiança é descontada para corresponder.
| Tecla | Ação |
|---|---|
OK | Salvar a descoberta no logbook |
segurar OK | Reiniciar a medição |
🗺️ Site Survey — este ambiente está limpo?
O que faz. Uma varredura cronometrada de um espaço inteiro. Inicie-a, caminhe pelo ambiente normalmente e obtenha um único veredito no final — sem ficar observando a agulha.
O que você vê. Uma contagem regressiva e uma barra de progresso enquanto executa, depois um cartão de veredito:
CLEAN— nada cruzou o ruído de fundoTRACE— toques breves ou fracos; vale uma segunda passada mais lentaACTIVE READER— algo estava genuinamente ativo e emitindo
…com campo MAX / AVG, contagem de contatos e FIELD % — quanto da varredura
uma portadora esteve realmente ativa, que geralmente é o número mais revelador dos quatro.
Executa por 30 s, 60 s ou 2 min, e registra o resultado automaticamente.
| Tecla | Ação |
|---|---|
OK | Executar a varredura novamente |
🛰️ Watch Mode — algum apareceu enquanto eu estava ausente?
O que faz. Fica de guarda indefinidamente. Arme-o, coloque o Flipper em algum lugar, afaste-se. Enquanto o Sweep é você caçando e o Survey é um teste de duração fixa, o Watch apenas espera — por minutos ou horas.
O que você vê. Um relógio de tempo decorrido grande e ALL CLEAR enquanto não há nada lá.
No instante em que um leitor aparece, a faixa inverte para READER PRESENT, a
tela acende e o alarme soa. A faixa é estável em vez de piscar —
um pequeno marcador pulsa, para que seja lida como ao vivo sem estroboscopiar para você. Depois que passa, a tela mantém a
evidência: HITS (quantos contatos separados), PEAK, LAST (há quanto tempo o
mais recente foi) e SEEN (tempo total em que uma portadora esteve realmente ativa).
O Watch ignora deliberadamente o modo stealth — um guarda escuro e silencioso que nunca informa que viu algo seria pior do que inútil.
| Tecla | Ação |
|---|---|
OK | Re-armar — limpa o relógio e os contadores |
📖 Logbook — o que encontrei e quando?
As descobertas são salvas duas vezes, com uma única ação, para que sejam legíveis no dispositivo e já sejam uma planilha — sem etapa de exportação para lembrar:
logbook.txt — agrupado, para o visualizador no dispositivo | logbook.csv — uma linha 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 … ``` |
As entradas são marcadas como SWEEP, READER, SURVEY ou WATCH e carimbadas com o
relógio do Flipper. Ambos os arquivos ficam em apps_data/specter/ no cartão SD. Nada
sai jamais do dispositivo. Limpe-os em Configurações → Limpar registro (com
confirmação primeiro — é a única coisa irreversível que o app pode fazer).
⚙️ As partes de apoio
🎯 Calibração automática
Pressione ESQUERDA na tela de Sweep e o Specter escuta o piso de ruído ambiente por 3 segundos, então define o limiar de detecção logo acima do que mediu — salvo como sua sensibilidade Personalizada. Cada ambiente tem um piso de RF diferente; isso ajusta ao que você está, em vez de um número fixado na compilação. Fique em algum lugar silencioso ao executar.
🕶️ Modo furtivo
Mantém a tela e o LED apagados durante todo o sweep, para o Flipper não brilhar
enquanto você é quem está olhando. Som e vibração continuam funcionando — o
objetivo não é desativar o feedback que você está varrendo. Sair de uma tela furtiva
reacende o display, então BACK sempre leva você a um menu iluminado.
📏 Lendo o medidor
Por que um leitor que você toca não emite 100% do tempo. O detector mede uma coisa física: a fração do tempo em que uma portadora de 13,56 MHz está ativa. Mas leitores fazem polling — uma rajada curta, um sono, outra rajada. Um terminal típico só está irradiando 20–35% do tempo, então o ciclo de trabalho bruto satura em torno de 30%, não importa o quão perto você chegue.
Mostrar esse número bruto no medidor fazia uma detecção perfeita parecer um terço de uma. O medidor é escalado contra essa faixa real de polling:
| Ciclo de trabalho bruto da portadora | Medidor | Proximidade |
|---|---|---|
| 3% (ruído do ambiente) | 10% | FAINT |
| 12% | 40% | NEAR |
| 20% | 67% | CLOSE |
| 28% | 93% | STRONG |
| ≥30% (apoiado em um leitor) | 100% | MAX |
O ciclo de trabalho bruto nunca é perdido: o piso de ruído, a calibração automática e o
DUTY da tela de Fingerprint ainda funcionam em ciclo de trabalho real, porque esses
descrevem o sinal, não sua distância dele. Quer o número literal?
Configurações → Medidor → Bruto.
💾 Tudo persiste
Sensibilidade, duração do survey, som, vibração, LED, furtividade, registro e modo do medidor são salvos no cartão SD no momento em que você os altera. Um kit de sweep que esquece sua configuração é pior do que nenhuma persistência.
🧠 Como funciona
Todo leitor NFC ligado emite continuamente uma portadora de 13,56 MHz no ar, esperando um cartão acordar. Você não pode vê-lo, mas o chip NFC do Flipper pode: o ST25R3916 tem um detector de campo externo por hardware (o mesmo circuito que permite ao Flipper emular um cartão e saber quando um leitor está falando com ele). O Specter coloca o chip em modo somente detecção e amostra esse bit "campo presente?" cerca de 500 vezes por segundo — sem nunca ligar sua própria portadora.
Esse único bit, amostrado rápido o suficiente, carrega dois sinais independentes:```mermaid
flowchart LR
R["🔍 Hidden 13.56 MHz reader / skimmer
(constantly polling its field)"] -- "RF carrier" --> A
subgraph FLIP["Flipper Zero — Specter.fap"]
A["ST25R3916 NFC chip<br/>external-field detector"] --> S["Sampler thread<br/>~500 samples/s"]
S --> M["<b>How much?</b><br/>carrier duty-cycle<br/>peak · average · contacts"]
S --> C["<b>What rhythm?</b><br/>burst / gap edge timing<br/>period · jitter"]
M --> G["EMF gauge · waveform<br/>geiger clicks · LED · vibe"]
M --> V["Survey verdict<br/>CLEAN / TRACE / ACTIVE"]
C --> K["Emitter class<br/>CONTINUOUS / POLLING /<br/>INTERMITTENT + pulse train"]
V --> L["📖 SD logbook"]
K --> L
end
**Quanto → intensidade.** Em uma janela curta, o Specter mede *qual fração do tempo* uma portadora está
presente e a suaviza no **FIELD %**. Um leitor posicionado diretamente sobre o Flipper trava o medidor;
um mais fraco ou mais distante o move levemente. Isso conduz o ponteiro, a palavra de proximidade e a taxa de cliques.
**Qual ritmo → identidade.** Separadamente, cada transição desse bit é cronometrada. Um leitor que acorda por
20 ms a cada 200 ms produz um padrão de rajada/pausa com quase nenhum jitter, porque seu loop de polling é
conduzido por uma máquina de estados sincronizada por cristal. Movimento da mão e ruído de RF não são tão estáveis. Essa
diferença é o que separa **POLLING** de **INTERMITTENT**.
### As camadas de decisão são testadas em um computador real
Os pontos onde o Specter transforma números em uma *afirmação* — "este é um leitor de polling", "esta sala está
limpa", "é isso que o ponteiro deve indicar" — são C puro, sem dependências de hardware, e são
fixados por testes de host em vez de descobertos no dispositivo:```bash
make -C test # 300 checks: classifier, verdict, meter scaling, presence
🚀 Instalação
Sem placa de desenvolvimento, sem firmware para gravar — é um único .fap.
Opção A — .fap pré-compilado (mais fácil)
-
Pegue o
.fapcorreto na página de Releases:Seu firmware Arquivo Oficial / padrão specter.fapUnleashed, RogueMaster, Momentum ou qualquer coisa mais recente specter-fw-dev.fapSe o Flipper disser
APP:87 < FW:88 — This app might not work, você pegou o errado — use o outro arquivo. A versão da API do app é fixada na compilação, então um único build não pode atender às duas linhas de firmware. Normalmente ainda funciona se você pressionar Continue, mas o build correspondente não vai perguntar. -
Abra o qFlipper, arraste o arquivo para
SD Card / apps / NFC /. -
No Flipper: Apps → NFC → Specter.
Opção B — compile você mesmo com 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
O `.fap` vai parar em `dist/specter.fap`; o `ufbt launch` copia-o para `apps/NFC/` e inicia-o por ti.
> Os ícones em `icons/`, capturas de ecrã e o banner em `images/` são gerados — regenera-os com
> `python3 tools_gen_icons.py`, `python3 tools_gen_mockups.py` e `python3 tools_gen_banner.py` (precisa de `pillow`).
---
## 🎮 Como usar
**Uma varredura, de ponta a ponta:**
1. Inicia o **Specter**. No ecrã **Sweep**, prime **LEFT** e mantém premido durante 3 segundos para
calibrar o ruído de fundo da sala.
2. Mantém o Flipper plano e move-o **lentamente** sobre o que estás a verificar — um terminal de cartão, um
leitor de porta, a parte inferior de um ATM, uma encomenda, uma secretária.
- **Onda silenciosa / plana** → sem leitor ativo ao alcance.
- **Agulha a subir, cliques a acelerar** → estás a aproximar-te de um emissor. Continua em direção ao pico.
- **`● ACTIVE READER` + borda de alarme** → há um leitor ativo mesmo aqui.
3. Encontraste algo? Sai e abre o **Fingerprint**. Mantém o Flipper imóvel contra ele e deixa o
ritmo estabilizar — alguns segundos costumam bastar. Prime **OK** para guardar a descoberta.
4. Preferes limpar uma sala inteira? Abre o **Site Survey**, percorre o espaço até a barra encher e lê
o veredito.
5. Vais sair da área? Deixa o Flipper em **Watch Mode** e ele ficará de guarda, acordando e dando
sinal se um leitor aparecer enquanto estás fora.
6. Consulta o **Logbook** para tudo o que guardaste, com carimbo de tempo — ou tira o `logbook.csv` do cartão
para uma folha de cálculo.
> 💡 Faz primeiro uma varredura a um leitor que sabes ser bom (o teu próprio telemóvel em NFC, ou um terminal
> contactless em que confies) para ver como é um campo forte e legítimo no medidor — e como o respetivo
> fingerprint se lê. Depois, vai à caça.
### Controlos
| Ecrã | Tecla | Ação |
|---|---|---|
| **Sweep** | `OK` | Repor pico / contactos |
| | `manter OK` | Registar a leitura atual |
| | `LEFT` | Calibrar o ruído de fundo (3 s) |
| **Fingerprint** | `OK` | Guardar a descoberta no logbook |
| | `manter OK` | Recomeçar a medição |
| **Site Survey** | `OK` | Executar a varredura novamente |
| **Watch Mode** | `OK` | Re-armar (limpar contagem e relógio) |
| *em qualquer lado* | `BACK` | Subir um nível |
---
## 🔬 Limitações honestas
- **Apenas 13.56 MHz (HF).** O Specter deteta a **banda NFC** — a usada por skimmers de pagamento contactless,
pela maioria dos leitores de acesso modernos, e por leitores de transportes e hotéis. **Não** consegue ver
leitores **125 kHz (LF)** (painéis de porta HID Prox / EM4100 mais antigos); o caminho LF do Flipper não tem
bit equivalente de deteção de campo.
- **Deteta a *portadora* de um leitor, não o que ele lê.** O Specter diz-te *há um leitor ativo aqui,
aproximadamente a que distância, e com que ritmo faz polling* — não descodifica, identifica nem captura nada
do que o leitor faz.
- **A intensidade é relativa, não calibrada.** `FIELD %` e as palavras de proximidade são um guia comparativo
de "mais quente / mais frio" para varrer, não uma distância medida em cm. É uma leitura *escalada* do
duty-cycle da portadora contra uma banda típica de polling (ver [Reading the meter](#-reading-the-meter--fixed-in-23));
um leitor que faça polling de forma invulgarmente esparsa lerá mais baixo à mesma distância, e um em modo
de onda contínua saturará a partir de mais longe.
- **O medidor satura.** `MAX` significa que a portadora está tão alta quanto este leitor alguma vez a mantém —
para além desse ponto, aproximar-te genuinamente não consegue produzir um número maior. Usa o peak-hold `PK`
para comparar posições.
- **O ritmo resolve até ~2 ms.** Esse é o período de amostragem. Tempos perto disso são mostrados com um
**`~`** e a confiança é descontada em conformidade — o Specter prefere assinalar o seu próprio limite de
resolução do que citar um número de aparência precisa que não consegue sustentar.
- **`CLEAN` significa limpo na sensibilidade que escolheste.** Um skimmer adormecido que só acorda com um toque
real, ou um que esteja blindado, permanece invisível em *qualquer* limiar. A ausência de leitura não é
garantia de ausência.
- **Uma rádio de cada vez.** O Specter assume o controlo do chip NFC durante a varredura, por isso fecha
primeiro qualquer outra app NFC (dirá *NFC unavailable* se outra coisa estiver com a rádio).
---
## ⚖️ Legal e ético
O Specter é uma ferramenta **defensiva, apenas de escuta** — **nunca transmite**, nunca alimenta um campo, nunca
toca no leitor. Usa-o para varrer a **tua** área de POS, porta, secretária ou pertences, ou hardware que te foi
**explicitamente autorizado** avaliar. És responsável pela forma como o usas. Conhece as tuas leis locais.
---
## 🗺️ Roadmap
- [x] Persistir sensibilidade / som / vibração / LED entre reinícios
- [x] "Logbook" de deteções com carimbos de tempo para o cartão SD
- [x] Varredura em segundo plano com o ecrã desligado — *modo furtivo*
- [x] Limiar ajustável para controlo de alcance mais fino — *auto-calibração + sensibilidade personalizada*
- [x] Fingerprint de um emissor pelo seu ritmo de polling
- [x] Site survey cronometrado com veredito de sala
- [x] Exportar o logbook como CSV para relatórios — *escrito em tempo real juntamente com o .txt*
- [x] Modo de vigilância de longa duração sem supervisão com alarme de wake-on-detection
- [x] Fazer o medidor usar toda a sua gama contra leitores reais de polling
- [x] Seta de tendência mais quente/mais frio durante a caça
- [ ] Investigar deteção de leitor baseado em bobina LF (125 kHz) como modo separado
- [ ] Filtragem do logbook no dispositivo por tipo
---
## 🗂️ Estrutura do projeto```
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
🙏 Créditos
- Criado por at0m-b0mb.
- Parte de uma família de ferramentas de segurança para Flipper: Argus (watchdog de deauth Wi-Fi / evil-twin), GhostTag (caçador anti-stalking BLE) e Cerberus (watchdog RF Sub-GHz).
- Alimentado pelo firmware do Flipper Zero HAL NFC (
furi_hal_nfcdetecção de campo) + ufbt.
📄 Licença
MIT © 2026 at0m-b0mb