
Specter-FlipperZero v2.9
👻 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 os leitores que você não consegue ver.
O Specter transforma 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 está constantemente emitindo — um skimmer de cartão escondido em um terminal de pagamento, um leitor clandestino atrás de um painel de porta, um registrador não autorizado colado sob uma mesa — e então informa onde ele está, que tipo de coisa é, se o ambiente está limpo e — deixado em vigilância — o momento em que um aparece enquanto você está fora. Ele nunca transmite.
Os leitores são invisíveis. O Specter os torna visíveis.
Destacado em
Help Net Security
·
Cyber Security News
📟 No Flipper
Uma varredura, do início ao fim: ambiente silencioso → aproximando-se → travado → o que é → o veredito do ambiente.
Sweep (silencioso) · Sweep (leitor travado) · Fingerprint · Survey (em execução) · Survey (veredito)
Watch (limpo) · Watch (leitor!) · Logbook · Calibrate · Settings
✨ Os cinco modos
O Specter é cinco ferramentas em torno de um sensor. Cada uma responde a uma pergunta diferente, então a correta depende do que você realmente está tentando descobrir:
| Modo | A pergunta que ele responde | Use quando |
|---|---|---|
| 🔍 Sweep | Onde ele está? | Você suspeita de um dispositivo e quer localizá-lo movendo-se ao redor |
| 🔬 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 veredito para um espaço inteiro, sem usar as mãos |
| 🛰️ Watch Mode | Apareceu algum enquanto eu estava fora? | Você vai deixar o Flipper em algum lugar para montar guarda |
| 📖 Logbook | O que eu encontrei, e quando? | Você está documentando, ou comparando hoje com a semana passada — filtre por tipo de achado |
🔍 Sweep — onde ele está?
O que faz. Um medidor ao vivo no estilo EMF. Segure o Flipper na horizontal e mova-o lentamente sobre o objeto que está verificando — um terminal de cartão, um leitor de porta, a parte inferior de uma fenda de caixa eletrônico, um pacote, uma mesa. O ponteiro acompanha a força do campo em tempo real.
O que você vê.
- O mostrador — o ponteiro = leitura ao vivo, o pequeno ponto = retenção de pico (o ponto mais forte que você tocou, para que possa comparar posições).
FIELD %— a mesma leitura como número, com uma seta de tendência ▲ / ▼ informando se o último meio segundo deixou as coisas mais quentes ou mais frias. 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 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á o mais próximo que esta medição consegue resolver.
Som. Cliques de geiger opcionais que aceleram conforme você se aproxima, para que você possa varrer com o Flipper no bolso e caçar apenas pelo ouvido.
| Tecla | Ação |
|---|---|
OK | Redefine a retenção de pico e a contagem de contatos |
hold OK | Salva esta leitura no logbook |
LEFT | Calibra para o ruído de fundo do ambiente (3 s) |
🔬 Fingerprint — que tipo de coisa é?
O que faz. Depois que o Sweep encontrou algo, segure o Flipper parado contra ele. O Fingerprint para de medir proximidade e começa a cronometrar as bordas de ligar/desligar 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 — frequentemente 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 — para que o veredito nunca seja algo que você tenha que aceitar por fé. Um leitor de
polling genuíno aparece como uma onda quadrada inconfundível.
Um
~antes de uma medição de tempo significa que ela está próxima do piso de amostragem de 2 ms, e a confiança é descontada de acordo.
| Tecla | Ação |
|---|---|
OK | Salva o achado no logbook |
hold OK | Reinicia a medição |
🗺️ Site Survey — este ambiente está limpo?
O que faz. Uma varredura cronometrada de um espaço inteiro. Inicie-a, percorra o ambiente normalmente e receba um único veredito no final — sem ficar observando o ponteiro.
O que você vê. Uma contagem regressiva e uma barra de progresso enquanto ela roda, depois um cartão de veredito:
CLEAN— nada cruzou o ruído de fundoTRACE— acertos 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 do levantamento
uma portadora esteve realmente ativa, que muitas vezes é o número mais revelador dos quatro.
Roda por 30 s, 60 s ou 2 min, e registra o resultado automaticamente.
| Tecla | Ação |
|---|---|
OK | Executa o levantamento novamente |
🛰️ Watch Mode — apareceu algum enquanto eu estava fora?
O que faz. Monta guarda indefinidamente. Ative-o, coloque o Flipper no lugar, vá embora. 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 grande relógio de tempo decorrido e ALL CLEAR enquanto não há nada. No
instante em que um leitor aparece, a faixa se inverte para READER PRESENT, a
tela acorda e o alarme soa. A faixa é estável em vez de piscar —
um pequeno marcador pulsa em vez disso, para que pareça ao vivo sem piscar na sua cara. Depois que passa, a tela mantém as
evidências: HITS (quantos contatos separados), PEAK, LAST (há quanto tempo foi o
mais recente) 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 avisa que viu algo seria pior que inútil.
| Tecla | Ação |
|---|---|
OK | Rearma — limpa o relógio e os contadores |
📖 Logbook — o que eu encontrei, e quando?
Os achados são salvos duas vezes, a partir de 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 datadas pelo
relógio do Flipper. Ambos os ficheiros residem em apps_data/specter/ no cartão SD. Nada
sai alguma vez do dispositivo. Limpe-os em Settings → Clear logbook (confirmado
primeiro — é a única coisa irreversível que a aplicação pode fazer).
⚙️ Os componentes de apoio
🎯 Auto-calibração
Prima LEFT no ecrã Sweep e o Specter escuta o ruído de fundo ambiente durante 3 segundos, depois define o limiar de deteção logo acima do que mediu — guardado como a sua sensibilidade Custom. Cada sala tem um piso de RF diferente; isto sintoniza-se ao da sala onde está, em vez de um número fixado em tempo de compilação. Fique num local sossegado quando o executar.
🕶️ Modo stealth
Mantém o ecrã e o LED apagados durante toda a varredura, para que o Flipper não brilhe
enquanto é você quem está a observar. O som e a vibração continuam a funcionar — o
objetivo não é desativar o feedback pelo qual está a fazer a varredura. Sair de um ecrã stealth
volta a acender o ecrã, para que BACK o deixe sempre num menu iluminado.
📏 Ler o medidor
Porque é que um leitor que está a tocar não emite 100% do tempo. O detetor mede uma única coisa física: que fração do tempo uma portadora de 13,56 MHz está ativa. Mas os leitores fazem polling — uma rajada curta, uma pausa, outra rajada. Um terminal típico só está a irradiar 20–35% do tempo, pelo que o duty-cycle em bruto satura por volta dos 30% independentemente da proximidade.
Mostrar esse número em bruto no medidor fazia uma deteção perfeita parecer um terço de uma. O medidor é escalado contra essa banda de polling real:
| Duty da portadora em bruto | Medidor | Proximidade |
|---|---|---|
| 3% (ruído da sala) | 10% | FAINT |
| 12% | 40% | NEAR |
| 20% | 67% | CLOSE |
| 28% | 93% | STRONG |
| ≥30% (em repouso sobre um leitor) | 100% | MAX |
O duty em bruto nunca se perde: o piso de ruído, a auto-calibração e o DUTY do
ecrã Fingerprint continuam todos a funcionar em duty-cycle verdadeiro, porque esses
descrevem o sinal, não a sua distância a ele. Quer o número literal?
Settings → Meter → Raw.
💾 Tudo persiste
Sensibilidade, duração da varredura, som, vibração, LED, stealth, registo e modo do medidor são guardados no cartão SD no momento em que os altera. Um kit de varredura que esquece a sua configuração é pior do que nenhuma persistência.
🧠 Como funciona
Todos os leitores NFC ligados pingam continuamente o ar com uma portadora de 13,56 MHz, à espera que um cartão desperte. Não a consegue ver, mas o chip NFC do Flipper consegue: o ST25R3916 tem um detetor de campo externo por hardware (o mesmo circuito que permite ao Flipper emular um cartão e saber quando um leitor está a comunicar com ele). O Specter coloca o chip em modo apenas-deteção e amostra esse bit "campo presente?" ~500 vezes por segundo — sem nunca ligar a sua própria portadora.
Esse único bit, amostrado com rapidez suficiente, transporta 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 *que fração do tempo* um carrier está
presente e suaviza isso no **FIELD %**. Um leitor posicionado bem em cima do Flipper satura o medidor;
um mais fraco ou mais distante apenas o desloca. Isso comanda a agulha, a palavra de proximidade e a taxa de cliques.
**Que ritmo → identidade.** Separadamente, cada transição desse bit é cronometrada. Um leitor que desperta por
20 ms a cada 200 ms produz um padrão de burst/gap com quase nenhum jitter, porque seu loop de polling é
controlado por uma máquina de estados temporizada por cristal. Movimento de 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 polling", "esta sala está
limpa", "isto é o que a agulha deveria marcar" — são C puro sem dependências de hardware, e são
fixados por testes no host em vez de descobertos no dispositivo:```bash
make -C test # 300 checks: classifier, verdict, meter scaling, presence
🚀 Instalação
Sem devboard, sem firmware para gravar — é um único .fap.
Opção A — .fap pré-compilado (mais fácil)
-
Baixe o
.fapcorreto na página de Releases:Seu firmware Arquivo Oficial / stock specter.fapUnleashed, RogueMaster, Momentum ou qualquer mais recente specter-fw-dev.fapSe o Flipper exibir
APP:87 < FW:88 — This app might not work, você está com o arquivo errado — use o outro. A versão da API do app é fixada no momento da compilação, então uma única build não consegue atender as duas linhas de firmware. Geralmente ainda funciona se você pressionar Continue, mas a 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 para `dist/specter.fap`; `ufbt launch` copia-o para `apps/NFC/` e inicia-o por ti.
> Os ícones em `icons/`, as capturas de ecrã e o banner em `images/` são gerados — regenera com
> `python3 tools_gen_icons.py`, `python3 tools_gen_mockups.py` e `python3 tools_gen_banner.py` (requer `pillow`).
---
## 🎮 Como usar
**Uma varredura, de início ao fim:**
1. Inicia o **Specter**. No ecrã **Sweep**, prime **LEFT** e mantém-te imóvel durante 3 segundos para
calibrar ao 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ões, um
leitor de porta, a parte inferior de uma ranhura de ATM, uma encomenda, uma secretária.
- **Forma de onda calma / plana** → nenhum leitor ativo ao alcance.
- **Ponteiro 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 **Fingerprint**. Mantém o Flipper imóvel junto ao leitor e deixa a
cadência estabilizar — alguns segundos costumam ser suficientes. Prime **OK** para guardar a descoberta.
4. Vais limpar uma sala inteira? Abre **Site Survey**, percorre o espaço até a barra encher e lê
o veredicto.
5. Vais sair da área? Deixa o Flipper em **Watch Mode** e ele fica de guarda, acordando e soando
se um leitor aparecer enquanto estás fora.
6. Consulta o **Logbook** para tudo o que guardaste, com data e hora — ou extrai o `logbook.csv` do cartão
para uma folha de cálculo.
> 💡 Varre primeiro um leitor que sabes ser bom (o teu próprio telemóvel a fazer NFC, ou um terminal contactless em que confias) para
> ver como é um campo forte e legítimo no medidor — e como se lê a sua impressão digital. Depois
> vai à caça.
### Controlos
| Ecrã | Tecla | Ação |
|---|---|---|
| **Sweep** | `OK` | Reiniciar pico / contactos |
| | `hold OK` | Registar a leitura atual |
| | `LEFT` | Calibrar o ruído de fundo (3 s) |
| **Fingerprint** | `OK` | Guardar a descoberta no logbook |
| | `hold OK` | Reiniciar a medição |
| **Site Survey** | `OK` | Executar a varredura novamente |
| **Watch Mode** | `OK` | Rearmar (limpar contagem e relógio) |
| *em qualquer lugar* | `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, leitores de transportes e de hotéis. **Não consegue** ver leitores de **125 kHz (LF)**
(painéis de porta HID Prox / EM4100 mais antigos); o caminho LF do Flipper não tem um bit equivalente de deteção de campo.
- **Deteta a *portadora* de um leitor, não o que ele lê.** O Specter diz-te *que 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 varredura, não uma distância medida em cm. É uma leitura *escalada* do duty-cycle da portadora
em relação a uma banda de polling típica (ver [Ler o medidor](#-reading-the-meter--fixed-in-23));
um leitor que faz polling invulgarmente esparso lerá mais baixo à mesma distância, e um em modo de onda contínua
ficará no máximo 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 — a partir
desse ponto, aproximar-te genuinamente não pode produzir um número maior. Usa o peak-hold `PK` para comparar
posições em vez disso.
- **A cadência resolve até ~2 ms.** Esse é o período de amostragem. Temporizações próximas disso são mostradas com um
**`~`** e a confiança é descontada em conformidade — o Specter prefere sinalizar o seu próprio limite de resolução
do que citar um número de aparência precisa que não pode sustentar.
- **`CLEAN` significa limpo à sensibilidade que escolheste.** Um skimmer dormente que só acorda com um toque real,
ou um que esteja blindado, permanece invisível a *qualquer* limiar. A ausência de leitura não é garantia de
ausência.
- **Um rádio de cada vez.** O Specter assume o controlo do chip NFC enquanto faz varredura, por isso fecha primeiro qualquer outra app NFC
(dirá *NFC unavailable* se algo mais estiver a usar o 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 própria** área de POS, porta, secretária ou pertences, ou hardware que estejas **explicitamente
autorizado** a avaliar. És responsável pela forma como o usas. Conhece as leis locais.
---
## 🗺️ Roadmap
- [x] Persistir sensibilidade / som / vibração / LED entre reinícios
- [x] "Logbook" de deteções com data e hora 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] Impressão digital de um emissor pela sua cadência de polling
- [x] Varredura de local temporizada com veredicto da sala
- [x] Exportar o logbook como CSV para relatórios — *escrito em tempo real ao lado do .txt*
- [x] Modo de vigilância prolongada sem supervisão com alarme de despertar por deteção
- [x] Fazer o medidor usar todo o seu alcance contra leitores de polling reais
- [x] Seta de tendência mais quente/mais frio durante a caça
- [ ] Investigar uma deteção de leitor baseada 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
🎨 Branding
Todo o material gráfico é gerado, por isso nunca se desvia da aplicação:
| Recurso | Tamanho | Onde é usado |
|---|---|---|
images/banner.png | 2560×800 | Cabeçalho do README (2× para se manter nítido em ecrãs retina) |
images/social-preview.png | 1280×640 | Settings → Social preview — o tamanho recomendado pelo GitHub (mín. 640×320, limite de 1 MB) |
images/mark.png | 512×512 | Logótipo quadrado: avatares, favicons, apresentações |
images/demo.gif | 768×384 | A animação acima, ~9 s, construída a partir das constantes reais da 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 |
> A pré-visualização social é o único recurso que o GitHub não consegue extrair do repositório — ela
> precisa ser enviada manualmente uma vez em **Settings → Social preview**. É o que é renderizado
> quando o repositório é compartilhado no Slack, X, LinkedIn ou Discord.
---
## 🙏 Créditos
- Criado por **[at0m-b0mb](https://github.com/at0m-b0mb)**.
- Parte de uma família de ferramentas de segurança 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)** (caçador anti-stalking BLE) e **[Cerberus](https://github.com/at0m-b0mb/flipper-cerberus)** (watchdog de RF Sub-GHz).
- Desenvolvido com o [firmware do Flipper Zero](https://github.com/flipperdevices/flipperzero-firmware) NFC HAL (`furi_hal_nfc` field detection) + [ufbt](https://github.com/flipperdevices/flipperzero-ufbt).
## 📄 Licença
[MIT](https://github.com/at0m-b0mb/specter-flipperzero/blob/main/LICENSE) © 2026 at0m-b0mb