Назад к обновлениям
New releaseSep 3, 2026

Specter-FlipperZero v2.8

👻 Specter — пассивный поиск NFC-ридеров/скиммеров на 13,56 МГц для Flipper Zero. Контрразведывательный измеритель электромагнитного поля (ЭМП) на базе встроенного NFC-чипа. Не требует дополнительного оборудования.

Поделиться

Specter — NFC reader & skimmer bug-sweep for Flipper Zero

Specter 👻

Sweep for the readers you can't see.

Latest release Downloads Stars Build

Flipper Zero Onboard NFC No extra hardware Listen-only MIT

Specter превращает ваш Flipper Zero в карманный поисковик жучков для противодействия слежке для активных NFC-считывателей на 13.56 МГц. Он пассивно прослушивает радиочастотное поле, которое постоянно излучает включённый считыватель — скрытый скиммер для карт, подсунутый в платёжный терминал, тайный считыватель за дверной панелью, нелегальный логгер, приклеенный под столом — а затем сообщает вам где он находится, что это за устройство, чисто ли в помещении, и — если оставить его на страже — в тот момент, когда он появится, пока вас нет. Он никогда не передаёт сигнал.

Считыватели невидимы. Specter делает их видимыми.

Упоминается в
Help Net Security  ·  Cyber Security News


📟 На Flipper

Specter in use: sweeping a quiet room, closing in on a reader, locking on at MAX, fingerprinting its polling cadence, then a site-survey verdict

Полное сканирование, от начала до конца: тихая комната → приближение → захват → что это → вердикт по помещению.

Specter screens

Sweep (тихо)  ·  Sweep (считыватель захвачен)  ·  Fingerprint  ·  Survey (выполняется)  ·  Survey (вердикт)
Watch (чисто)  ·  Watch (считыватель!)  ·  Logbook  ·  Calibrate  ·  Settings


✨ Пять режимов

Specter — это пять инструментов вокруг одного сенсора. Каждый отвечает на свой вопрос, поэтому правильный выбор зависит от того, что вы на самом деле пытаетесь выяснить:

РежимНа какой вопрос отвечаетКогда использовать
🔍 SweepГде он?Вы подозреваете устройство и хотите найти его, перемещаясь по помещению
🔬 FingerprintЧто это за устройство?Вы нашли излучатель и хотите узнать, как он себя ведёт
🗺️ Site SurveyЧисто ли в этом помещении?Вам нужен один вердикт для всего пространства, без ручного контроля
🛰️ Watch ModeПоявился ли он, пока меня не было?Вы оставляете Flipper где-то, чтобы он стоял на страже
📖 LogbookЧто я нашёл и когда?Вы пишете отчёт или сравниваете сегодня с прошлой неделей — фильтр по типу находки

🔍 Sweep — где он?

Sweep — reader found, meter pegged

Что делает. Живой измеритель в стиле ЭМП. Держите Flipper плашмя и медленно перемещайте его над тем, что проверяете — платёжный терминал, дверной считыватель, нижняя сторона ATM-панели, посылка, стол. Стрелка отражает напряжённость поля в реальном времени.

Что вы видите.

  • Шкала — стрелка = текущее показание, маленькая точка = удержание пика (самое сильное место, которого вы касались, чтобы можно было сравнивать позиции).
  • FIELD % — то же показание в виде числа, со стрелкой тренда ▲ / ▼, которая говорит, стало ли за последние полсекунды теплее или холоднее. Во время поиска эта стрелка важнее числа.
  • PEAK % — самое сильное показание с момента включения, число за точкой удержания пика.
  • Отметка на шкале — где READER начинается при вашей текущей чувствительности. Всё за ней — это то, что Specter назовёт попаданием, так что шкала отвечает на вопрос «что считается?», вместо того чтобы оставлять вас гадать.
  • Нижняя полоса — пока вы не нашли первый считыватель, она несёт две клавиши, которые нельзя обнаружить, нажимая что попало (LEFT=cal, hold OK=log); после этого — ваша чувствительность и живая осциллограмма. Она переключается на чёрную панель тревоги ● ACTIVE READER со словом близости в момент обнаружения несущей.
  • БлизостьFAINT → NEAR → CLOSE → STRONG → MAX. MAX означает, что измеритель уперся в предел: вы настолько близко, насколько позволяет это измерение.

Звук. Опциональные гейгеровские щелчки, которые ускоряются по мере приближения, так что можно сканировать с Flipper в кармане и искать на слух.

КлавишаДействие
OKСбросить удержание пика и счётчик контактов
hold OKСохранить это показание в журнал
LEFTКалибровка по уровню шума помещения (3 с)
UP / DOWNИзменить чувствительность, не выходя из поиска

🔬 Fingerprint — что это за устройство?

Fingerprint — polling reader identified

Что делает. Как только Sweep что-то нашёл, держите Flipper неподвижно рядом с ним. Fingerprint перестаёт измерять близость и начинает замерять фронты включения/выключения несущей, что и отличает один тип излучателя от другого.

Что вы видите. Вердикт, полосу уверенности и доказательства за обоими:

КлассЧто это значит на практике
CONTINUOUSНесущая удерживается постоянно
POLLINGФиксированный, кварц-стабилизированный цикл опроса — период показан в мс
INTERMITTENTИмпульсный, но нерегулярный — часто телефон или используемый считыватель

Ниже — PER (период опроса), BST (ширина импульса), JIT (джиттер) и UP (истинный коэффициент заполнения), плюс импульсная последовательность логического анализатора сырой несущей — так что вердикт никогда не приходится принимать на веру. Настоящий опрашивающий считыватель проявляется как безошибочно узнаваемая прямоугольная волна.

~ перед значением тайминга означает, что оно близко к 2-мс порогу дискретизации, и уверенность соответственно снижается.

КлавишаДействие
OKСохранить находку в журнал
hold OKПерезапустить измерение

🗺️ Site Survey — чисто ли в этом помещении?

Site Survey — verdict

Что делает. Ограниченное по времени сканирование всего пространства. Запустите его, обойдите помещение обычным шагом и получите единый вердикт в конце — без слежения за стрелкой.

Что вы видите. Обратный отсчёт и полосу прогресса во время работы, затем карточку вердикта:

  • CLEAN — ничего не пересекло уровень шума
  • TRACE — краткие или слабые попадания; стоит пройти медленнее второй раз
  • ACTIVE READER — что-то действительно было включено и излучало

…с полем PEAK / AVG, счётчиком контактов и UP %какую долю времени сканирования несущая действительно была включена, что часто самое показательное из четырёх чисел. Длится 30 с, 60 с или 2 мин и автоматически записывает результат в журнал. Карточка указывает длительность, за которую выставлялась оценка, потому что 30-секундный CLEAN — не та же находка, что двухминутный.

КлавишаДействие
OK (во время работы)Остановить сейчас и оценить то, что есть
OK (на карточке)Запустить ещё одно сканирование

🛰️ Watch Mode — появился ли он, пока меня не было?

Watch Mode — reader present

Что делает. Стоит на страже бесконечно. Включите его, положите Flipper, уходите. Если Sweep — это вы в поиске, а Survey — тест фиксированной длины, то Watch просто ждёт — минуты или часы.

Что вы видите. Большие часы прошедшего времени и NO READER, пока ничего нет. В тот момент, когда появляется считыватель, полоса инвертируется в ACTIVE READER, полоса силы показывает, насколько он близко, экран просыпается, и звучит сигнал. Полоса постоянная, а не мигающая — на 1-битном экране сплошной инвертированный блок и так самое громкое, что на нём есть, а показания, которые действительно меняются, несут признак жизни. После того как он пройдёт, экран сохраняет доказательства: HITS (сколько отдельных контактов), PEAK, LAST (как давно был последний) и UP (общее время, когда несущая действительно была включена). Часы переходят в hh:mm после 99:59, а не замирают, так что ночное наблюдение всё равно суммируется.

Watch намеренно игнорирует режим скрытности — тёмный, беззвучный страж, который никогда не сообщит, что что-то увидел, был бы хуже, чем бесполезен.

КлавишаДействие
OKПеревзвести — сбрасывает часы и счётчики

📖 Logbook — что я нашёл и когда?

Находки сохраняются дважды, одним действием, так что они читаемы на устройстве и уже являются таблицей — не нужно помнить об экспорте:

logbook.txt — сгруппированный, для просмотрщика на устройствеlogbook.csv — одна плоская строка на запись
``` 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 … ```

Записи помечаются тегами SWEEP, READER, SURVEY или WATCH и снабжаются меткой времени с часов Flipper. Оба файла находятся в apps_data/specter/ на SD-карте. Ничто никогда не покидает устройство. Очистить их можно в Settings → Clear logbook (сначала запрашивается подтверждение — это единственное необратимое действие, которое может выполнить приложение).


⚙️ Вспомогательные компоненты

🎯 Автокалибровка

Нажмите LEFT на экране Sweep, и Specter будет слушать фоновый шум в течение 3 секунд, после чего установит порог обнаружения чуть выше измеренного значения — это сохранится как ваша Custom чувствительность. В каждой комнате свой уровень радиочастотного фона; эта функция настраивается на ту комнату, в которой вы находитесь, а не на число, зашитое при сборке. При запуске стойте в тихом месте.

🕶️ Режим невидимости

Держит экран и светодиод выключенными на протяжении всего сканирования, чтобы Flipper не светился, пока вы сами ведёте наблюдение. Звук и вибрация продолжают работать — смысл не в том, чтобы отключить обратную связь, по которой вы ведёте сканирование. Выход из экрана невидимости снова включает дисплей, так что BACK всегда приводит вас на освещённое меню.

📏 Чтение индикатора

Почему считыватель, к которому вы прикасаетесь, не излучает 100% времени. Детектор измеряет одну физическую величину: какую долю времени активна несущая 13.56 МГц. Но считыватели опрашивают — короткий импульс, пауза, ещё импульс. Типичный терминал излучает только 20–35% времени, поэтому сырой коэффициент заполнения насыщается около 30%, как бы близко вы ни подошли.

Отображение этого сырого числа на индикаторе заставляло идеальное обнаружение выглядеть как треть от него. Вместо этого индикатор масштабирован относительно реального диапазона опроса:

Сырой коэффициент заполнения несущейИндикаторБлизость
3% (шум в комнате)10%FAINT
12%40%NEAR
20%67%CLOSE
28%93%STRONG
≥30% (лежит на считывателе)100%PEGGED

Сырой коэффициент заполнения никогда не теряется: уровень шума, автокалибровка и UP на экране Fingerprint по-прежнему работают в истинном коэффициенте заполнения, потому что они описывают сигнал, а не ваше расстояние до него. Нужно буквальное число? Settings → Meter scale → Duty %.

💾 Всё сохраняется

Чувствительность, длительность survey, звук, вибрация, светодиод, невидимость, логирование и режим индикатора сохраняются на SD-карту в момент изменения. Набор для сканирования, забывающий свои настройки, хуже, чем полное отсутствие сохранения.


🧠 Как это работает

Каждый включённый NFC-считыватель непрерывно посылает в эфир несущую 13.56 МГц, ожидая, когда карта проснётся. Вы этого не видите, но NFC-чип Flipper может: у ST25R3916 есть аппаратный детектор внешнего поля (та же схема, которая позволяет Flipper эмулировать карту и знать, когда считыватель обращается к ней). Specter переводит чип в режим только обнаружения и выбирает этот бит «поле присутствует?» ~500 раз в секунду — никогда не включая собственную несущую.

Этот единственный бит, выбираемый достаточно быстро, несёт два независимых сигнала:```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
**Насколько сильно → сила сигнала.** За короткое окно Specter измеряет, *какую долю времени* присутствует несущая, и сглаживает это значение в **FIELD %**. Считыватель, находящийся прямо над Flipper, загоняет индикатор в максимум; более слабый или удалённый лишь слегка его сдвигает. Это управляет стрелкой, словом близости и частотой щелчков.

**Какой ритм → идентификация.** Отдельно замеряется каждое переключение этого бита. Считыватель, который просыпается на 20 мс каждые 200 мс, создаёт паттерн «всплеск/пауза» почти без джиттера, потому что его цикл опроса управляется конечным автоматом с кварцевой синхронизацией. Движение руки и радиочастотные помехи не обладают такой стабильностью. Именно это различие отделяет **POLLING** от **INTERMITTENT**.

### Уровни принятия решений тестируются на реальном компьютере

Места, где Specter превращает числа в *утверждение* — «это опрашивающий считыватель», «эта комната чиста», «вот что должна показывать стрелка», — это чистый C без аппаратных зависимостей, и они проверяются хостовыми тестами, а не выявляются на устройстве:```bash
make -C test     # 300 checks: classifier, verdict, meter scaling, presence

🚀 Установка

Никакой devboard, никакой прошивки для прошивки — это один .fap.

Вариант A — готовый .fap (самый простой)

  1. Возьмите нужный .fap со страницы Releases:

    Ваша прошивкаФайл
    Официальная / стоковаяspecter.fap
    Unleashed, RogueMaster, Momentum или любая новееspecter-fw-dev.fap

    Если Flipper показывает APP:87 < FW:88 — This app might not work, у вас не тот файл — возьмите другой. Версия API приложения фиксируется при компиляции, поэтому одна сборка не может подойти для обеих линеек прошивок. Обычно оно всё равно запускается, если нажать Continue, но подходящая сборка не будет спрашивать.

  2. Откройте qFlipper, перетащите файл в SD Card / apps / NFC /.

  3. На Flipper: Apps → NFC → Specter.

Вариант B — соберите сами с помощью 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

`.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`).

---

## 🎮 Использование

**Полный цикл сканирования:**

1. Запустите **Specter**. На экране **Sweep** нажмите **LEFT** и держите неподвижно 3 секунды, чтобы
   откалиброваться по уровню шума в помещении.
2. Держите Flipper плашмя и **медленно** перемещайте его по объекту проверки — платёжный терминал,
   считыватель у двери, нижняя часть банкомата, посылка, стол.
   - **Тихая / ровная осциллограмма** → активного считывателя в зоне нет.
   - **Стрелка ползёт вверх, щелчки ускоряются** → вы приближаетесь к излучателю. Продолжайте движение к пику.
   - **`● ACTIVE READER` + рамка тревоги** → активный считыватель прямо здесь.
3. Что-то нашли? Выйдите назад и откройте **Fingerprint**. Держите Flipper неподвижно рядом с ним и дайте
   ритму стабилизироваться — обычно достаточно нескольких секунд. Нажмите **OK**, чтобы сохранить находку.
4. Вместо этого проверяете всё помещение? Откройте **Site Survey**, обойдите пространство, пока шкала не заполнится, и прочитайте
   вердикт.
5. Уходите с территории? Оставьте Flipper в **Watch Mode**, и он будет нести вахту, просыпаясь и подавая сигнал,
   если считыватель появится, пока вас нет.
6. Проверьте **Logbook** — там всё сохранённое с отметками времени — или выгрузите `logbook.csv` с карты
   в электронную таблицу.

> 💡 Сначала просканируйте заведомо исправный считыватель (свой телефон с NFC или бесконтактный терминал, которому доверяете), чтобы
> увидеть, как выглядит сильное легитимное поле на индикаторе — и как читается его отпечаток. Затем
> отправляйтесь на охоту.

### Управление

| Экран | Клавиша | Действие |
|---|---|---|
| **Sweep** | `OK` | Сбросить пик / контакты |
| | `hold OK` | Записать текущее показание |
| | `LEFT` | Калибровать уровень шума (3 с) |
| **Fingerprint** | `OK` | Сохранить находку в журнал |
| | `hold OK` | Перезапустить измерение |
| **Site Survey** | `OK` | Запустить обследование заново |
| **Watch Mode** | `OK` | Перевести в режим готовности (сбросить счётчик и таймер) |
| *в любом месте* | `BACK` | На уровень выше |

---

## 🔬 Честные ограничения

- **Только 13,56 МГц (HF).** Specter чувствует **диапазон NFC** — тот, что используется в бесконтактных платёжных скиммерах,
  большинстве современных считывателей доступа, считывателях транспорта и отелей. Он **не может** видеть считыватели **125 кГц (LF)**
  (старые дверные панели HID Prox / EM4100); у LF-тракта Flipper нет эквивалентного бита обнаружения поля.
- **Он чувствует *несущую* считывателя, а не то, что тот считывает.** Specter сообщает вам, что *активный считыватель здесь,
  примерно насколько близко, и в каком ритме он опрашивает* — он не декодирует, не идентифицирует и не захватывает ничего,
  что делает считыватель.
- **Сила относительна, а не откалибрована.** `FIELD %` и слова близости — это сравнительный ориентир «теплее /
  холоднее» для сканирования, а не измеренное расстояние в см. Это *масштабированное* показание рабочего цикла несущей
  относительно типичной полосы опроса (см. [Чтение индикатора](#-reading-the-meter--fixed-in-23));
  считыватель, который опрашивает необычно редко, покажет меньше на том же расстоянии, а работающий в режиме непрерывной волны
  упрётся в максимум с большего расстояния.
- **Индикатор упирается в потолок.** `PEGGED` означает, что несущая поднята настолько, насколько этот считыватель её вообще поднимает — за
  этой точкой приближение действительно не может дать большего числа. Flipper один раз жужжит, когда это происходит,
  чтобы вы знали, что нужно прекратить движение, даже если не видите экран. Используйте удержание `PEAK`, чтобы сравнивать
  позиции вместо этого.
- **Ритм разрешается до ~2 мс.** Это период дискретизации. Значения времени вблизи него показываются с
  **`~`**, и уверенность соответственно снижается — Specter предпочтёт обозначить свой собственный предел разрешения,
  чем назвать точное на вид число, за которое не может поручиться.
- **`CLEAN` означает чисто при выбранной вами чувствительности.** Дремлющий скиммер, который просыпается только при реальном касании,
  или экранированный, остаётся невидимым при *любом* пороге. Отсутствие показания не является гарантией
  отсутствия.
- **Одно радио за раз.** Specter захватывает чип NFC во время сканирования, поэтому сначала закройте любое другое приложение NFC
  (оно скажет *NFC unavailable*, если радио занято чем-то другим).

---

## ⚖️ Правовые и этические аспекты

Specter — **защитный инструмент, работающий только на приём** — он **никогда не передаёт**, никогда не создаёт поле, никогда не касается
считывателя. Используйте его для сканирования **своей собственной** зоны POS, двери, стола или вещей, либо оборудования, которое вы **явно
уполномочены** проверять. Вы несёте ответственность за то, как вы его используете. Знайте свои местные законы.

---

## 🗺️ План развития

- [x] Сохранение чувствительности / звука / вибрации / LED между перезагрузками
- [x] «Журнал» обнаружений с отметками времени на SD-карту
- [x] Фоновое сканирование с выключенным экраном — *stealth mode*
- [x] Настраиваемый порог для более тонкого контроля диапазона — *автокалибровка + Custom sensitivity*
- [x] Отпечаток излучателя по его ритму опроса
- [x] Обследование территории по таймеру с вердиктом по помещению
- [x] Экспорт журнала в CSV для отчётности — *записывается в реальном времени рядом с .txt*
- [x] Длительный автономный режим наблюдения с сигналом пробуждения при обнаружении
- [x] Заставить индикатор использовать весь свой диапазон против реальных опрашивающих считывателей
- [x] Стрелка тренда «теплее/холоднее» во время охоты
- [ ] Исследовать чувствительность к считывателям 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
│   ├── 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

🎨 Брендинг

Все графические материалы генерируются, поэтому они никогда не расходятся с приложением:

РесурсРазмерКуда идёт
images/banner.png2560×800Заголовок README (2×, чтобы оставался чётким на retina)
images/social-preview.png1280×640Settings → Social preview — рекомендуемый GitHub размер (мин. 640×320, лимит 1 МБ)
images/mark.png512×512Квадратный логотип: аватары, favicon, слайды
images/demo.gif768×384Анимация выше, ~9 с, собрана из реальных констант представления
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
> Социальное превью — это единственный ресурс, который GitHub не может подхватить из репозитория — его
> нужно один раз загрузить вручную в **Settings → Social preview**. Именно оно отображается,
> когда репозиторий публикуется в Slack, X, LinkedIn или Discord.

---

## 🙏 Благодарности

- Создано **[at0m-b0mb](https://github.com/at0m-b0mb)**.
- Часть семейства инструментов безопасности для Flipper: **[Argus](https://github.com/at0m-b0mb/Argus-FlipperZero)** (сторож Wi-Fi деаутентификации / evil-twin), **[GhostTag](https://github.com/at0m-b0mb/GhostTag-FlipperZero)** (охотник за BLE-слежкой) и **[Cerberus](https://github.com/at0m-b0mb/flipper-cerberus)** (сторож Sub-GHz RF).
- Работает на базе [прошивки Flipper Zero](https://github.com/flipperdevices/flipperzero-firmware) NFC HAL (`furi_hal_nfc` field detection) + [ufbt](https://github.com/flipperdevices/flipperzero-ufbt).

## 📄 Лицензия

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

Категории