
Specter-FlipperZero v2.3
👻 Specter — пассивный поиск NFC-ридеров/скиммеров на 13,56 МГц для Flipper Zero. Контрразведывательный измеритель электромагнитного поля (ЭМП) на базе встроенного NFC-чипа. Не требует дополнительного оборудования.
Specter 👻
Ищите ридеры, которые нельзя увидеть.
Specter превращает ваш Flipper Zero в карманный контрразведывательный поисковик скрытых устройств для активных NFC-ридеров 13.56 МГц. Он пассивно слушает радиочастотное поле, которое постоянно излучает включённый ридер, — скрытый скиммер карт, вставленный в платёжный терминал, скрытый ридер за дверной панелью, нежелательный логгер, приклеенный под столом, — а затем сообщает вам, где он находится, что это за устройство, чиста ли комната и, если оставить его на страже, — момент, когда ридер появится, пока вас нет. Он никогда не передаёт.
Ридеры невидимы. Specter делает их видимыми.
📟 На Flipper
Сканирование (тихо) · Сканирование (ридер захвачен) · Отпечаток · Обход (выполняется) · Обход (вердикт)
Наблюдение (чисто) · Наблюдение (ридер!) · Журнал · Калибровка · Настройки
✨ Что он делает
Specter отвечает на четыре разных вопроса — где он, что это, чиста ли комната и не появился ли ридер, пока меня не было — и у каждого есть свой экран.
🔍 Сканирование — где он?
Гвоздь программы: аналоговый EMF-индикатор. Стрелка в реальном времени следует за FIELD %, маркер удержания пика запоминает самый сильный сигнал, а верх шкалы — горячая зона. Живая форма волны показывает уровень шума, пока тихо.
Как только датчик улавливает несущую ридера, экран обрамляется тревожной рамкой, вокруг шкалы пульсирует
кольцо, а полоса переключается на ● ACTIVE READER с индикацией близости
(FAINT → NEAR → CLOSE → STRONG). Опционально щелчки гейгера ускоряются по мере усиления поля, так
что вы можете сканировать поверхность с Flipper в кармане и слышать, как приближаетесь.
OK сбрасывает пик/контакты · hold OK записывает показание · LEFT калибрует под текущее помещение.
🔬 Отпечаток — что это? NEW in 2.0
Что-то нашли? Замрите на нём. Specter перестаёт следить за близостью и начинает замерять фронты включения/выключения несущей, а затем сообщает, с каким типом излучателя вы имеете дело:
| Класс | Значение |
|---|---|
| CONTINUOUS | Несущая удерживается постоянно |
| POLLING | Фиксированный цикл опроса — период указан в мс |
| INTERMITTENT | Порывный, но нерегулярный |
Вы получаете период опроса, ширину пакета, джиттер, скважность и индикатор уверенности — плюс импульсную последовательность логического анализатора по нижнему краю, так что вердикт не приходится принимать на веру. Цикл опроса ридера тактируется кварцем, поэтому настоящий опрос выглядит как безусловная прямоугольная волна.
OK сохраняет находку в журнал · hold OK перезапускает измерение.
🗺️ Обход помещения — чиста ли эта комната? NEW in 2.0
Сканирование по таймеру целого пространства. Запустите его, пройдите по комнате и получите один вердикт в конце, вместо того чтобы всё время следить за стрелкой:
CLEAN— ничто не пересекло уровень шумаTRACE— короткие или слабые сигналы, стоит пройтись ещё разACTIVE READER— что-то действительно работало и излучало
…вместе с максимальным/средним полем, количеством контактов и долей времени обхода, в течение которого несущая действительно была активна. Длится 30 с, 60 с или 2 мин и автоматически записывает результат.
🛰️ Режим наблюдения — сообщи, если появится NEW in 2.1
Если Сканирование — это когда охотитесь вы, а Обход — ограниченный по времени вердикт, то Режим наблюдения охраняет бессрочно. Включите его, положите Flipper и уходите. Он ведёт текущее время и счётчик обнаружений, запоминает, когда был последний контакт, и — в этом вся суть — будит экран и подаёт сигнал в тот момент, когда появляется ридер. Каждый новый контакт автоматически заносится в журнал с отметкой времени.
Он намеренно игнорирует скрытность: молчаливый тёмный сторож, который никогда не сообщает, что что-то увидел,
был бы хуже бесполезного. OK переводит его в режим ожидания заново (сбрасывает счётчик и время).
📖 Журнал + CSV в реальном времени CSV NEW in 2.1
Каждая находка записывается дважды, одним действием — так что она читается на устройстве и уже готова как электронная таблица, без необходимости помнить об экспорте:
logbook.txt — сгруппировано, для просмотра на устройстве | logbook.csv — по одной плоской строке на запись |
|---|---|
|
|
Оба находятся в apps_data/specter/ на SD-карте. Ничего не покидает устройство.
🎯 Автокалибровка NEW in 2.0
Нажмите LEFT на экране сканирования, и Specter в течение 3 секунд слушает фоновый уровень шума, а затем устанавливает порог обнаружения чуть выше измеренного — он сохраняется как ваша Custom чувствительность. В каждом помещении свой радиочастотный фон; эта настройка подстраивается под то место, где вы находитесь, а не под число, зашитое при сборке.
🕶️ Скрытный режим NEW in 2.0
Держит экран и светодиод тёмными на протяжении всего сканирования, чтобы Flipper не светился, пока смотрите
вы. Звук и вибрация продолжают работать — дело не в том, чтобы отключить обратную связь, по которой вы
ориентируетесь при сканировании. При выходе из скрытного экрана подсветка дисплея возвращается, так что BACK
всегда приводит к освещённому меню (исправлено в 2.2 — раньше экран оставался тёмным, из-за чего BACK выглядел неработающим).
📏 Показания индикатора FIXED in 2.3
Почему ридер, к которому вы прикасаетесь, излучает не 100% времени. Детектор измеряет одну физическую величину: какую долю времени несущая 13.56 МГц действительно активна. Но ридеры работают по опросу — короткий пакет, пауза, ещё один пакет. Типичный терминал или ридер контроля доступа излучает лишь 20–35% времени, поэтому сырая скважность насыщается около 30%, как бы близко вы ни находились.
Раньше Specter выводил на индикатор это сырое число, из-за чего идеальное обнаружение выглядело лишь на треть —
а CLOSE/STRONG и пиковый тест обхода оставались недостижимыми. Теперь шкала откалибрована под реальный
диапазон опроса:
| Сырая скважность несущей | Индикатор | Близость |
|---|---|---|
| 3% (шум помещения) | 9% | FAINT |
| 12% | 34% | NEAR |
| 20% | 57% | CLOSE |
| 31% (вплотную к ридеру) | 89% | STRONG |
| ≥35% / непрерывная волна | 100% | MAX |
MAX означает максимум — вы настолько близко, насколько позволяет данное измерение, и приближение уже ничего
не изменит. Это показано явно, а не скрыто, поэтому застывшая стрелка никогда не выглядит сломанной.
Сырая скважность никуда не девается: уровень шума, автокалибровка и DUTY на экране «Отпечаток»
по-прежнему работают в истинной скважности, потому что они описывают сигнал, а не расстояние до него.
Предпочитаете буквальное число? Настройки → Индикатор → Raw.
💾 Всё сохраняется NEW in 2.0
Чувствительность, длительность обхода, звук, вибрация, светодиод, скрытность, журналирование и режим индикатора сохраняются на SD-карту в момент изменения. Набор для сканирования, забывающий свои настройки, хуже, чем отсутствие сохранения.
🧠 Как это работает
Каждый включённый NFC-ридер непрерывно излучает в воздух несущую 13.56 МГц, ожидая, когда карта проснётся. Вы её не видите, а NFC-чип Flipper — видит: ST25R3916 имеет аппаратный детектор внешнего поля (та же схема, которая позволяет Flipper эмулировать карту и понимать, когда с ним говорит ридер). Specter переводит чип в режим только детектирования и считывает бит «поле присутствует?» около 500 раз в секунду — ни разу не включая собственную несущую.
Этот единственный бит, сэмплируемый достаточно быстро, несёт два независимых сигнала:
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
Сколько → сила. За короткое окно Specter измеряет, какую долю времени присутствует несущая, и сглаживает это значение в FIELD %. Ридер, лежащий прямо на Flipper, зашкаливает индикатор; более слабый или дальний — слегка его двигает. Это управляет стрелкой, словом о близости и частотой щелчков.
Какой ритм → идентичность. Отдельно замеряется каждое переключение этого бита. Ридер, который просыпается на 20 мс каждые 200 мс, создаёт паттерн «пакет/пауза» почти без джиттера, потому что его цикл опроса управляется тактируемой кварцем конечной машиной. Движение руки и радиошум не настолько стабильны. Именно это различие отделяет POLLING от INTERMITTENT.
Слои решений протестированы на реальном компьютере
Места, где Specter превращает числа в утверждение — «это опрашивающий ридер», «эта комната чиста», «вот что должна показывать стрелка» — написаны на чистом C без аппаратных зависимостей, и они зафиксированы хост-тестами, а не подбираются на устройстве:
make -C test # 284 checks: classifier, survey verdict, meter scaling
🚀 Установка
Никакой платы разработки и прошивки — это один .fap.
Вариант A — готовый .fap (самый простой)
- Загрузите
specter.fapсо страницы Releases. - Откройте qFlipper и перетащите файл в
SD Card / apps / NFC /. - На Flipper: Apps → NFC → Specter.
Вариант B — соберите сами с помощью 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
.fap появится в dist/specter.fap; ufbt launch скопирует его в apps/NFC/ и запустит для вас.
Иконки в
icons/, скриншоты и баннер вimages/генерируются — пересоздайте их с помощьюpython3 tools_gen_icons.py,python3 tools_gen_mockups.pyиpython3 tools_gen_banner.py(требуетсяpillow).
🎮 Использование
Сканирование от начала до конца:
- Запустите Specter. На экране Сканирование нажмите LEFT и держите неподвижно 3 секунды, чтобы откалиброваться под фоновый шум помещения.
- Держите Flipper плоско и медленно ведите им по проверяемому объекту — карточному терминалу,
считывателю у двери, нижней кромке банкомата, посылке, столу.
- Тихая / ровная форма волны → рядом нет активного ридера.
- Стрелка растёт, щелчки ускоряются → вы приближаетесь к излучателю. Продолжайте двигаться к пику.
● ACTIVE READER+ тревожная рамка → активный ридер прямо здесь.
- Что-то нашли? Вернитесь и откройте Отпечаток. Прижмите Flipper неподвижно к устройству и дайте ритму устояться — обычно достаточно нескольких секунд. Нажмите OK, чтобы сохранить находку.
- Нужно проверить целую комнату? Откройте Обход помещения, пройдите по пространству, пока полоса не заполнится, и прочитайте вердикт.
- Покидаете зону? Переведите Flipper в Режим наблюдения, и он будет стоять на страже, просыпаясь и подавая сигнал, если ридер появится, пока вас нет.
- Проверьте Журнал — там всё сохранённое с отметками времени; либо вытащите
logbook.csvс карты в электронную таблицу.
💡 Сначала просканируйте заведомо исправный ридер (свой телефон в режиме NFC или доверенный бесконтактный терминал), чтобы увидеть, как на индикаторе выглядит сильное легальное поле — и что показывает его отпечаток. Затем отправляйтесь на охоту.
Управление
| Экран | Клавиша | Действие |
|---|---|---|
| Сканирование | OK | Сбросить пик / контакты |
hold OK | Записать текущее показание | |
LEFT | Калибровка фонового шума (3 с) | |
| Отпечаток | OK | Сохранить находку в журнал |
hold OK | Перезапустить измерение | |
| Обход помещения | OK | Запустить обход заново |
| Режим наблюдения | OK | Перевзвести (сбросить счётчик и время) |
| в любом месте | BACK | На уровень выше |
🔬 Честные ограничения
- Только 13.56 МГц (HF). Specter чувствует диапазон NFC — тот, что используют скиммеры бесконтактных платежей, большинство современных считывателей доступа, транспортные и гостиничные ридеры. Он не может видеть ридеры 125 кГц (LF) (старые дверные панели HID Prox / EM4100); в LF-тракте Flipper нет аналогичного бита детектирования поля.
- Он чувствует несущую ридера, а не то, что тот считывает. Specter сообщает вам, что здесь активный ридер, примерно насколько близко и с каким ритмом он опрашивает, — но не декодирует, не распознаёт и не перехватывает ничего из того, что делает ридер.
- Сила относительна, а не откалибрована.
FIELD %и слова о близости — это сравнительный ориентир «теплее / холоднее» для сканирования, а не измеренное расстояние в сантиметрах. Это масштабированное значение скважности несущей относительно типичного диапазона опроса (см. Показания индикатора); ридер с необычно редким опросом будет показывать меньше на той же дистанции, а ридер в режиме непрерывной волны зашкалит издалека. - Индикатор упирается в максимум.
MAXозначает, что несущая активна настолько, насколько этот ридер вообще её держит, — после этой точки приближение физически не даст большего числа. Вместо этого используйте пик-фиксаторPKдля сравнения позиций. - Ритм разрешается до ~2 мс. Это период дискретизации. Времена, близкие к нему, показываются с
~, а уверенность пропорционально снижается — Specter предпочитает указать на собственный предел разрешения, чем назвать число, которое выглядит точным, но за которое он не может поручиться. CLEANозначает чисто при выбранной вами чувствительности. Спящий скиммер, который просыпается только при реальном касании, или экранированный скиммер останется невидимым при любом пороге. Отсутствие показания не является гарантией отсутствия.- Одно радио за раз. Во время сканирования Specter занимает NFC-чип, поэтому сначала закройте любое другое NFC-приложение (если радио занято чем-то ещё, появится сообщение NFC недоступен).
⚖️ Правовые и этические аспекты
Specter — оборонительный инструмент, работающий только на приём — он никогда не передаёт, не создаёт поле и не взаимодействует с ридером. Используйте его для проверки своей платёжной зоны, двери, стола или вещей, либо оборудования, которое вам явно разрешено оценивать. Ответственность за использование лежит на вас. Знайте местные законы.
🗺️ Дорожная карта
- Сохранять чувствительность / звук / вибрацию / светодиод между перезагрузками
- «Журнал» обнаружений с отметками времени на SD-карте
- Фоновое сканирование с выключенным экраном — скрытный режим
- Регулируемый порог для более точного контроля диапазона — автокалибровка + пользовательская чувствительность
- Идентификация излучателя по ритму его опроса
- Обход помещения по таймеру с вердиктом
- Экспорт журнала в CSV для отчётов — записывается в реальном времени вместе с .txt
- Длительный автономный режим наблюдения с будильником при обнаружении
- Заставить индикатор использовать весь свой диапазон с реальными опрашивающими ридерами
- Исследовать возможность отдельного режима обнаружения LF-ридеров (125 кГц) на основе катушки
- Фильтрация журнала по типу прямо на устройстве
🗂️ Структура проекта
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
🙏 Благодарности
- Создано at0m-b0mb.
- Часть семейства security-инструментов для Flipper: Argus (Wi-Fi deauth / сторожевой режим evil-twin), GhostTag (BLE-охотник против сталкинга) и Cerberus (Sub-GHz RF-сторож).
- Работает на NFC HAL прошивки Flipper Zero (детектирование поля
furi_hal_nfc) + ufbt.
📄 Лицензия
MIT © 2026 at0m-b0mb