
Specter-FlipperZero v2.3
👻 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 pode ver.
O Specter transforma seu Flipper Zero em uma varredura antiespionagem de bolso para leitores NFC ativos de 13,56 MHz. Ele escuta passivamente o campo de RF que um leitor ligado está emitindo constantemente — um skimmer de cartão escondido em um terminal de pagamento, um leitor encoberto atrás de um painel de porta, um logger malicioso preso com fita embaixo de uma mesa — e então diz onde está, que tipo de coisa é, se o ambiente está limpo e — deixado de guarda — o momento em que um aparecer enquanto você estiver fora. 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
✨ O que ele faz
O Specter responde a quatro perguntas diferentes — onde está, o que é, o ambiente está limpo e apareceu algum enquanto eu estava fora — e cada uma tem sua própria tela.
🔍 Sweep — onde está?
A peça central: um medidor EMF estilo analógico. A agulha acompanha o FIELD % em tempo real, um marcador de pico retido registra o ponto mais forte, e o topo do mostrador é uma zona quente. Uma forma de onda ao vivo traça o piso de ruído enquanto está quieto.
No instante em que a portadora de um leitor é sentida, a tela se emoldura com uma borda de alarme, um
anel pulsante gira ao redor do mostrador, e a faixa muda para ● ACTIVE READER com uma leitura de
proximidade (FAINT → NEAR → CLOSE → STRONG). Os opcionais cliques Geiger aceleram conforme o campo fica
mais forte, então você pode varrer uma superfície com o Flipper no bolso e ouvir que está chegando mais
perto.
OK redefine pico/contatos · segurar OK registra a leitura · LEFT calibra para o ambiente em que você está.
🔬 Fingerprint — o que é? NOVO na 2.0
Encontrou algo? Fique imóvel sobre ele. O Specter para de perseguir proximidade e começa a cronometrar as bordas de liga/desliga da portadora, e então diz que tipo de emissor você está vendo:
| Classe | O que significa |
|---|---|
| CONTINUOUS | Portadora mantida permanentemente ativa |
| POLLING | Ciclo de polling fixo — o período é exibido em ms |
| INTERMITTENT | Em rajadas, porém irregular |
Você recebe o período de polling, a largura da rajada, o jitter, o duty-cycle e uma barra de confiança — além de um trem de pulsos de analisador lógico da portadora bruta na parte inferior, para que o veredito nunca precise ser aceito por si só. O loop de polling de um leitor é sincronizado por cristal, então um polling genuíno aparece como uma onda quadrada inconfundível.
OK salva a descoberta no logbook · segurar OK reinicia a medição.
🗺️ Site Survey — este ambiente está limpo? NOVO na 2.0
Uma varredura cronometrada de todo um espaço. Inicie, ande pelo ambiente e receba um veredito no final, em vez de ter que observar um ponteiro o tempo todo:
CLEAN— nada cruzou o piso de ruídoTRACE— toques breves ou fracos, valem uma segunda passadaACTIVE READER— algo esteve ativo e emitindo de verdade
…com campo máximo/médio, contagem de contatos e por quanto tempo da pesquisa uma portadora esteve realmente ativa. Dura 30 s, 60 s ou 2 min, e registra o resultado automaticamente.
🛰️ Watch Mode — avise se algum aparecer NOVO na 2.1
Enquanto o Sweep é você caçando e o Survey é um veredito limitado, o Watch fica de guarda indefinidamente. Arme-o, deixe o Flipper apoiado e vá embora. Ele mantém um relógio em execução e uma contagem de detecções, lembra quando foi o último contato e — o objetivo principal — acende a tela e toca um alarme no instante em que um leitor aparece. Cada novo contato é registrado automaticamente com sua data/hora.
Ele ignora o modo furtivo deliberadamente: um guarda silencioso e escuro que nunca diz que viu algo seria
pior do que inútil. OK o rearma (limpa a contagem e o relógio).
📖 Logbook + CSV ao vivo CSV NOVO na 2.1
Cada descoberta é gravada duas vezes, a partir de uma única ação — legível no dispositivo e já em formato de planilha, sem nenhuma etapa de exportação para lembrar:
logbook.txt — agrupado, para o visualizador no dispositivo | logbook.csv — uma linha plana por entrada |
|---|---|
|
|
Ambos ficam em apps_data/specter/ no cartão SD. Nada sai do dispositivo.
🎯 Auto-calibração NOVO na 2.0
Pressione LEFT na tela Sweep e o Specter escuta o piso de ruído ambiente por 3 segundos, então define o limite de detecção logo acima do que mediu — salvo como sua sensibilidade Custom. Cada ambiente tem um piso de RF diferente; isso ajusta para o ambiente em que você está, em vez de um número fixado na compilação.
🕶️ Modo furtivo NOVO na 2.0
Mantém a tela e o LED apagados durante toda a varredura, para o Flipper não brilhar enquanto é você quem
está procurando. Som e vibração continuam funcionando — o objetivo não é desativar o feedback que guia sua
varredura. Sair de uma tela furtiva reacende o display, então BACK sempre cai em um menu aceso
(corrigido na 2.2 — antes deixava a tela escura, o que fazia BACK parecer morto).
📏 Lendo o medidor CORRIGIDO na 2.3
Por que um leitor que você está tocando 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á realmente ativa. Mas leitores fazem polling — uma rajada curta, um sono, outra rajada. Um terminal ou leitor de acesso típico só está irradiando 20–35% do tempo, então o duty-cycle bruto satura em torno de 30%, não importa o quão perto você chegue.
O Specter costumava imprimir esse número bruto no medidor, o que fazia uma detecção perfeita parecer um terço
de uma — e deixava CLOSE/STRONG e o teste de pico da pesquisa permanentemente fora de alcance. O medidor
agora é escalado em relação a essa faixa real de polling:
| Duty bruto da portadora | Medidor | Proximidade |
|---|---|---|
| 3% (ruído do ambiente) | 9% | FAINT |
| 12% | 34% | NEAR |
| 20% | 57% | CLOSE |
| 31% (em cima de um leitor) | 89% | STRONG |
| ≥35% / onda contínua | 100% | MAX |
MAX significa no limite máximo — você está tão perto quanto esta medição consegue resolver, e
aproximar-se mais não vai mudar. Isso é informado em vez de escondido, para que um ponteiro travado nunca
pareça quebrado.
O duty bruto nunca é perdido: o piso de ruído, a auto-calibração e o DUTY da tela Fingerprint continuam
funcionando em duty-cycle verdadeiro, porque descrevem o sinal, não a sua distância dele. Prefere o número
literal? Settings → Meter → Raw.
💾 Tudo persiste NOVO na 2.0
Sensibilidade, duração da pesquisa, som, vibração, LED, modo furtivo, registro e modo do medidor são salvos no cartão SD no momento em que você os altera. Um kit de varredura que esquece sua configuração é pior do que nenhuma persistência.
🧠 Como funciona
Todo leitor NFC ligado envia continuamente uma portadora de 13,56 MHz pelo ar, esperando um cartão acordar. Você não consegue ver, mas o chip NFC do Flipper consegue: o ST25R3916 tem um detector de hardware de campo externo (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 o bit "campo presente?" cerca de 500 vezes por segundo — sem nunca ligar a própria portadora.
Esse único bit, amostrado rápido o suficiente, carrega dois sinais independentes:
flowchart LR
R["🔍 Hidden 13.56 MHz reader / skimmer<br/>(constantly polling its field)"] -- "RF carrier" --> A
subgraph FLIP["Flipper Zero — Specter.fap"]
A["ST25R3916 NFC chip<br/>external-field detector"] --> S["Sampler thread<br/>~500 samples/s"]
S --> M["<b>How much?</b><br/>carrier duty-cycle<br/>peak · average · contacts"]
S --> C["<b>What rhythm?</b><br/>burst / gap edge timing<br/>period · jitter"]
M --> G["EMF gauge · waveform<br/>geiger clicks · LED · vibe"]
M --> V["Survey verdict<br/>CLEAN / TRACE / ACTIVE"]
C --> K["Emitter class<br/>CONTINUOUS / POLLING /<br/>INTERMITTENT + pulse train"]
V --> L["📖 SD logbook"]
K --> L
end
Quanto → força. Em uma janela curta, o Specter mede qual fração do tempo uma portadora está presente e a suaviza no FIELD %. Um leitor bem em cima do Flipper leva o medidor ao máximo; um mais fraco ou distante o move levemente. Isso dirige 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 é dirigido 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 — "isto é um leitor com polling", "este ambiente está limpo", "é isto que o ponteiro deveria ler" — são C puro, sem dependências de hardware, e são fixados por testes de host em vez de descobertos no dispositivo:
make -C test # 284 checks: classifier, survey verdict, meter scaling
🚀 Instalação
Sem devboard, sem firmware para gravar — é um único .fap.
Opção A — .fap pré-compilado (mais fácil)
- Pegue o
specter.fapna página de Releases. - Abra o qFlipper, arraste o arquivo para
SD Card / apps / NFC /. - No Flipper: Apps → NFC → Specter.
Opção B — compile você mesmo com ufbt
# 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 fica em dist/specter.fap; ufbt launch o copia para apps/NFC/ e o abre para você.
Ícones em
icons/, capturas de tela e o banner emimages/são gerados — regenere compython3 tools_gen_icons.py,python3 tools_gen_mockups.pyepython3 tools_gen_banner.py(precisa depillow).
🎮 Como usar
Uma varredura, do início ao fim:
- Inicie o Specter. Na tela Sweep, pressione LEFT e fique parado por 3 segundos para calibrar o piso de ruído do ambiente.
- Segure o Flipper plano 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.
- Onda silenciosa / plana → nenhum leitor ativo no alcance.
- Ponteiro subindo, cliques acelerando → você está se aproximando de um emissor. Continue em direção ao pico.
● ACTIVE READER+ borda de alarme → um leitor ativo está bem aqui.
- Encontrou algo? Volte e abra o Fingerprint. Segure o Flipper imóvel contra ele e deixe a cadência estabilizar — alguns segundos geralmente bastam. Pressione OK para salvar a descoberta.
- Preferindo varrer um ambiente inteiro? Abra o Site Survey, percorra o espaço até a barra encher e leia o veredito.
- Vai sair da área? Deixe o Flipper no Watch Mode e ele ficará de guarda, acordando e alarmando se um leitor aparecer enquanto você estiver fora.
- Confira o Logbook para tudo o que você salvou, com data/hora — ou extraia o
logbook.csvdo cartão para uma planilha.
💡 Varra primeiro um leitor que você sabe que é bom (seu próprio celular usando NFC, ou um terminal contactless em que confia) para ver como um campo forte e legítimo aparece no medidor — e como a fingerprint dele é lida. Depois vá caçar.
Controles
| Tela | Tecla | Ação |
|---|---|---|
| Sweep | OK | Redefinir pico / contatos |
segurar OK | Registrar a leitura atual | |
LEFT | Calibrar o piso de ruído (3 s) | |
| Fingerprint | OK | Salvar a descoberta no logbook |
segurar OK | Reiniciar a medição | |
| Site Survey | OK | Executar a pesquisa novamente |
| Watch Mode | OK | Re-armar (limpar contagem e relógio) |
| em qualquer lugar | BACK | Subir um nível |
🔬 Limitações honestas
- Apenas 13,56 MHz (HF). O Specter detecta a faixa NFC — a usada por skimmers de pagamento contactless, pela maioria dos leitores de acesso modernos, leitores de transporte e de hotel. Ele não consegue ver leitores de 125 kHz (LF) (painéis de porta HID Prox / EM4100 antigos); o caminho LF do Flipper não tem um bit equivalente de detecção de campo.
- Ele sente a portadora de um leitor, não o que ele lê. O Specter diz um leitor ativo está aqui, aproximadamente a que distância e com qual ritmo ele faz polling — ele não decodifica, identifica nem captura nada do que o leitor faz.
- A força é relativa, não calibrada.
FIELD %e as palavras de proximidade são um guia comparativo de "mais perto / mais longe" para varredura, não uma distância medida em cm. É uma leitura escalada do duty-cycle da portadora em relação a uma faixa típica de polling (veja Lendo o medidor); um leitor que faz polling de forma incomumente esparsa marcará menos na mesma distância, e um em modo de onda contínua atingirá o máximo de mais longe. - O medidor tem um teto.
MAXsignifica que a portadora está ativa tanto quanto este leitor consegue mantê-la ativa — além desse ponto, aproximar-se genuinamente não produz um número maior. Use o peak-holdPKpara comparar posições. - A cadência resolve até ~2 ms. Esse é o período de amostragem. Tempos próximos disso são exibidos com um
~e a confiança é descontada de acordo — o Specter prefere sinalizar seu próprio piso de resolução a citar um número de aparência precisa pelo qual não pode responder. CLEANsignifica limpo na sensibilidade que você escolheu. Um skimmer adormecido que só acorda com um toque real, ou um que esteja blindado, permanece invisível em qualquer limite. A ausência de leitura não é garantia de ausência.- Um rádio por vez. O Specter assume o chip NFC durante a varredura, então feche qualquer outro app NFC antes (ele dirá NFC unavailable se outra coisa estiver com o rádio).
⚖️ Legal e ética
O Specter é uma ferramenta defensiva, somente de escuta — ele nunca transmite, nunca alimenta um campo, nunca toca o leitor. Use-o para varrer sua própria área POS, porta, mesa ou pertences, ou hardware que você está explicitamente autorizado a avaliar. Você é responsável por como o usa. Conheça as leis locais.
🗺️ Roadmap
- Persistir sensibilidade / som / vibração / LED entre reinicializações
- "Logbook" de detecções com data/hora no cartão SD
- Varredura em segundo plano com a tela desligada — modo furtivo
- Limiar ajustável para controle de alcance mais fino — auto-calibração + sensibilidade Custom
- Identificar um emissor pela cadência de polling
- Pesquisa de site cronometrada com veredito do ambiente
- Exportar o logbook como CSV para relatórios — gravado ao vivo junto com o .txt
- Modo de vigília de longa duração sem supervisão com alarme ao detectar
- Fazer o medidor usar toda a faixa com leitores reais de polling
- Investigar um sensor de leitor LF (125 kHz) baseado em bobina como um modo separado
- Filtragem do logbook por tipo no dispositivo
🗂️ 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
│ ├── 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 Wi-Fi deauth / evil-twin), GhostTag (caçador anti-stalking BLE) e Cerberus (watchdog de RF Sub-GHz).
- Alimentado pelo HAL NFC do firmware do Flipper Zero (detecção de campo
furi_hal_nfc) + ufbt.
📄 Licença
MIT © 2026 at0m-b0mb