返回更新列表
新发布Sep 3, 2026

Specter-FlipperZero v2.8

👻 Specter — 用于 Flipper Zero 的被动式 13.56 MHz NFC 读取器/嗅探器窃听器扫描工具。利用板载 NFC 芯片的反监控 EMF 探测器。无需额外硬件。

分享

Specter — 用于 Flipper Zero 的 NFC 读卡器与盗刷器扫描工具

Specter 👻

扫除你看不见的读卡器。

最新版本 下载量 星标 构建

Flipper Zero 板载 NFC 无需额外硬件 仅监听 MIT

Specter 将你的 Flipper Zero 变成一台口袋大小的反监控扫描仪,用于检测 活跃的 13.56 MHz NFC 读卡器。它会被动监听通电读卡器持续发射的射频场——无论是被塞进支付终端里的隐藏卡片盗刷器、藏在门板后面的隐蔽读卡器,还是被胶带粘在桌下的恶意记录器——然后告诉你它在哪里是什么类型的设备房间是否干净,并且——如果让它值守——还能告诉你你离开期间它出现的时刻。它从不发射信号。

读卡器是隐形的。Specter 让它们现形。

媒体报道
Help Net Security  ·  Cyber Security News


📟 在 Flipper 上

Specter 使用中:扫描安静的房间、逼近读卡器、在 MAX 处锁定、识别其轮询节奏,然后给出现场勘察结论

一次完整的扫描:安静的房间 → 逼近 → 锁定 → 识别类型 → 房间结论。

Specter 界面截图

扫描(安静)  ·  扫描(锁定读卡器)  ·  指纹识别  ·  现场勘察(进行中)  ·  现场勘察(结论)
值守(无异常)  ·  值守(发现读卡器!)  ·  日志簿  ·  校准  ·  设置


✨ 五种模式

Specter 是围绕同一传感器打造的五个工具。每个工具回答不同的问题,因此 选择哪个取决于你实际想查明的内容:

模式它回答的问题何时使用
🔍 扫描它在哪里?你怀疑有设备,想通过移动来精确定位
🔬 指纹识别它是什么类型的设备?你已发现发射源,想了解它的行为特征
🗺️ 现场勘察这个房间干净吗?你想免手持地获得整个空间的单一结论
🛰️ 值守模式我离开期间有设备出现吗?你要把 Flipper 留在某处站岗
📖 日志簿我发现了什么,什么时候?你在记录结果,或对比今天与上周——可按发现类型筛选

🔍 扫描 — 它在哪里?

扫描 — 发现读卡器,指针打满

功能说明。 一个实时 EMF 式仪表。将 Flipper 平放并缓慢移动 掠过你要检查的对象——刷卡终端、门禁读卡器、ATM 唇边下方、 包裹、桌面。指针实时跟随场强变化。

你会看到什么。

  • 表盘 — 指针 = 实时读数,小圆点 = 峰值保持(你扫过的最强 位置,方便对比不同位置)。
  • FIELD % — 同一读数的数字形式,带 ▲ / ▼ 趋势箭头 提示你最近半秒是变强还是变弱。在搜寻时, 这个箭头比数字更重要。
  • PK / C — 峰值读数以及你接触到的独立信号次数。
  • 底部条带 — 安静时的实时波形和当前灵敏度; 一旦检测到载波,它会切换为黑色 ● 活跃读卡器 警报条并显示接近程度词。
  • 接近程度微弱 → 接近 → 靠近 → 强 → 最大最大 表示仪表已 打满:你已经到达该测量能分辨的最近距离。

声音。 可选的盖革计数器式咔嗒声,越靠近越快,因此你可以 把 Flipper 放进口袋,仅凭听觉进行扫描。

按键操作
OK重置峰值保持和接触计数
长按 OK将此读数保存到日志簿
LEFT校准到房间的噪声底(3 秒)

🔬 指纹识别 — 它是什么类型的设备?

指纹识别 — 识别出轮询型读卡器

功能说明。 一旦扫描模式发现了目标,将 Flipper 静止地 贴住它。指纹识别不再测量接近程度,而是开始对载波的 开/关边沿计时,这才是真正区分不同类型发射源的关键。

你会看到什么。 一个结论、一个置信度条,以及支撑两者的证据:

类别实际含义
连续型载波被持续保持开启
轮询型固定的、晶振定时的轮询周期——周期以毫秒显示
间歇型突发但不规律——通常是手机或正在使用的读卡器

下方是 PER(轮询周期)、BST(突发宽度)、JIT(抖动)和 DUTY(真实占空比),以及原始载波的逻辑分析仪脉冲序列—— 因此结论绝不是需要你盲目相信的东西。真正的轮询型读卡器 会呈现为无可辩驳的方波。

时间值前的 ~ 表示它接近 2 ms 采样下限, 置信度也会相应打折。

按键操作
OK将发现保存到日志簿
长按 OK重新开始测量

🗺️ 现场勘察 — 这个房间干净吗?

现场勘察 — 结论

功能说明。 对整个空间进行定时扫描。启动后正常走动 房间,最后获得一个单一结论——无需盯着指针看。

你会看到什么。 运行时有倒计时和进度条,然后显示结论卡片:

  • 干净 — 没有任何信号越过噪声底
  • 微量 — 短暂或微弱的信号;值得放慢速度再扫一遍
  • 活跃读卡器 — 确实有设备在持续发射

……并附带 MAX / AVG 场强、接触次数和 FIELD %——载波在整个勘察期间 实际开启的时间占比,这往往是四项中最有说服力的数字。 运行时长可选 30 秒、60 秒或 2 分钟,结果会自动记录。

按键操作
OK再次运行勘察

🛰️ 值守模式 — 我离开期间有设备出现吗?

值守模式 — 检测到读卡器

功能说明。 无限期站岗。启动后放下 Flipper, 离开即可。扫描模式是你主动搜寻,勘察模式是固定时长的测试, 而值守模式只是等待——几分钟或几小时。

你会看到什么。 无异常时显示大号计时时钟和 一切正常。 读卡器一出现,条带立即反转为 检测到读卡器屏幕唤醒, 警报响起。条带是稳定显示而非闪烁——由一个小标记脉冲代替, 因此既能传达实时状态又不会闪得刺眼。信号消失后,屏幕保留 证据:HITS(独立接触次数)、PEAK(峰值)、LAST(最近一次 出现距今多久)和 SEEN(载波实际开启的总时长)。

值守模式有意忽略静默模式——一个黑暗无声、从不告诉你 它发现了什么的守卫,比毫无用处更糟。

按键操作
OK重新启动——清零时钟和计数器

📖 日志簿 — 我发现了什么,什么时候?

发现结果通过一次操作保存两次,因此在设备上可读 并且已经是一份电子表格——无需记住导出步骤:

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 … ```

条目带有 SWEEPREADERSURVEYWATCH 标签,并加盖 Flipper 时钟的时间戳。两个文件都存放在 SD 卡上的 apps_data/specter/ 中。任何数据都不会离开设备。可通过 设置 → 清除日志 将其清空(需先确认——这是该应用唯一不可逆的操作)。


⚙️ 辅助功能

🎯 自动校准

在扫描界面上按 LEFT,Specter 会监听环境噪声底 3 秒,然后将检测阈值设定在略高于所测值的位置——并保存为你的 自定义 灵敏度。每个房间的射频底噪都不同;此功能会针对你当前所处的环境进行调校,而不是使用编译时预设的固定数值。运行时请站在安静的地方。

🕶️ 隐身模式

在整个扫描过程中保持屏幕和 LED 熄灭,这样当你在暗中观察时,Flipper 不会发光。声音和振动仍会正常工作——其目的并非禁用你在扫描时所依赖的反馈。退出隐身屏幕会重新点亮显示屏,因此 BACK 总能让你回到有照明的菜单。

📏 读取仪表读数

为什么你触碰的读卡器并非 100% 时间都在发射信号。 探测器测量的是一个物理量:13.56 MHz 载波处于开启状态的时间占比。但读卡器采用轮询方式——短促脉冲、休眠、再短促脉冲。典型终端仅在 20–35% 的时间内辐射信号,因此无论你靠得多近,原始占空比都会在约 30% 处饱和

如果直接在仪表上显示这个原始数值,一次完美的检测看起来只相当于三分之一。因此仪表针对这一真实轮询区间进行了缩放:

原始载波占空比仪表读数接近程度
3%(环境噪声)10%FAINT
12%40%NEAR
20%67%CLOSE
28%93%STRONG
≥30% (紧贴读卡器)100%MAX

原始占空比绝不会丢失:噪声底、自动校准以及指纹识别屏幕上的 DUTY 仍以真实占空比工作,因为这些描述的是信号本身,而非你与它的距离。想要字面数值?设置 → 仪表 → 原始

💾 所有设置都会持久保存

灵敏度、扫描时长、声音、振动、LED、隐身、日志记录和仪表模式都会在更改的瞬间保存到 SD 卡。一个会忘记自身配置的扫描套件,比完全没有持久化更糟糕。


🧠 工作原理

每台通电的 NFC 读卡器都会持续以 13.56 MHz 载波向空气中发送信号,等待卡片被唤醒。你看不到它,但 Flipper 的 NFC 芯片可以: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 上方的读取器会使仪表满格;较弱或较远的读取器则只会轻微拨动它。这驱动着指针、接近度词语和点击频率。

**什么节奏 → 身份。** 另外,该比特的每一次跳变都会被计时。一个每 200 ms 唤醒 20 ms 的读取器会产生几乎无抖动的突发/间隙模式,因为其轮询循环由晶振定时的状态机驱动。手部移动和射频噪声则没有这么稳定。这种差异正是区分 **POLLING** 与 **INTERMITTENT** 的关键。

### 决策层在真实计算机上进行测试

Specter 将数字转化为*判断*的地方——例如“这是一个轮询读取器”、“这个房间是干净的”、“指针应该指向这里”——都是纯 C 代码,不依赖任何硬件,并且通过主机测试来固定验证,而不是在设备上摸索发现:```bash
make -C test     # 300 checks: classifier, verdict, meter scaling, presence

🚀 安装

无需开发板,无需刷写固件——它只是一个 .fap 文件。

方案 A — 使用预编译的 .fap(最简单)

  1. Releases 页面获取对应的 .fap 文件:

    你的固件文件
    官方 / 原版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 平放,并**缓慢**地将其移过你要检查的物体——如刷卡终端、门禁读卡器、ATM 下沿、包裹或桌面。
   - **波形安静 / 平坦** → 范围内没有活跃的读卡器。
   - **指针攀升、滴答声加快** → 你正在接近发射源。继续朝峰值方向移动。
   - **`● ACTIVE READER` + 警报边框** → 活跃读卡器就在此处。
3. 发现了什么?退出并打开 **Fingerprint**。将 Flipper 紧贴其上保持不动,让节奏稳定下来——通常几秒钟就足够了。按 **OK** 保存发现结果。
4. 而是要排查整个房间?打开 **Site Survey**,在空间内走动直到进度条填满,然后读取判定结果。
5. 要离开该区域?将 Flipper 置于 **Watch Mode**,它会站岗放哨,若你离开期间有读卡器出现,它会唤醒并发出警报。
6. 查看 **Logbook** 获取你保存的所有内容,均带时间戳——或将卡上的 `logbook.csv` 导出到电子表格中。

> 💡 先扫描一个已知正常的读卡器(例如你自己的手机 NFC,或你信任的非接触式终端),看看强且合法的场在仪表上是什么样子——以及它的指纹读数如何。然后再去搜寻。

### 按键控制

| 屏幕 | 按键 | 操作 |
|---|---|---|
| **Sweep** | `OK` | 重置峰值 / 触点 |
| | `长按 OK` | 记录当前读数 |
| | `LEFT` | 校准噪声底(3 秒) |
| **Fingerprint** | `OK` | 将发现结果保存到日志 |
| | `长按 OK` | 重新开始测量 |
| **Site Survey** | `OK` | 再次运行排查 |
| **Watch Mode** | `OK` | 重新布防(清除计数和时钟) |
| *任意位置* | `BACK` | 返回上一级 |

---

## 🔬 诚实的局限性

- **仅支持 13.56 MHz(HF)。** Specter 感知的是 **NFC 频段**——即非接触式支付盗刷器、大多数现代门禁读卡器、交通和酒店读卡器所使用的频段。它**无法**看到 **125 kHz(LF)** 读卡器(较旧的 HID Prox / EM4100 门禁面板);Flipper 的 LF 路径没有等效的场检测位。
- **它感知的是读卡器的*载波*,而非其读取的内容。** Specter 会告诉你*此处有活跃读卡器、大致距离多远、以及它以何种节奏轮询*——它不会解码、识别或捕获读卡器所做的任何操作。
- **强度是相对的,而非校准的。** `FIELD %` 和接近程度描述词是用于扫描的对比式“越近越热 / 越远越冷”指南,而非以厘米为单位的实测距离。它是载波占空比相对于典型轮询频带的*缩放*读数(参见 [Reading the meter](#-reading-the-meter--fixed-in-23));轮询异常稀疏的读卡器在相同距离下读数会较低,而连续波模式的读卡器则会在更远处就达到满格。
- **仪表有上限。** `MAX` 表示载波已达到该读卡器所能维持的最大强度——超过该点后,继续靠近确实无法产生更大的数值。请改用 `PK` 峰值保持来比较位置。
- **节奏分辨率约为 2 毫秒。** 这是采样周期。接近该值的时间会以 **`~`** 显示,置信度也会相应降低——Specter 宁愿标出自身的分辨率下限,也不愿引用一个看似精确却无法支撑的数字。
- **`CLEAN` 意味着在你选择的灵敏度下是干净的。** 仅在真实刷卡时唤醒的休眠盗刷器,或被屏蔽的盗刷器,在*任何*阈值下都保持不可见。没有读数并不保证不存在。
- **同一时间只能使用一个无线电。** Specter 在扫描期间会接管 NFC 芯片,因此请先关闭其他 NFC 应用(若有其他程序占用无线电,它会提示 *NFC unavailable*)。

---

## ⚖️ 法律与道德

Specter 是一款**防御性、仅监听**的工具——它**从不发射**,从不驱动场,从不接触读卡器。请仅用于扫描**你自己的** POS 区域、门禁、桌面或随身物品,或你**明确获授权**评估的硬件。你需对自己的使用方式负责。请了解当地法律。

---

## 🗺️ 路线图

- [x] 在重启后保留灵敏度 / 声音 / 振动 / LED 设置
- [x] 将带时间戳的检测记录“日志”保存到 SD 卡
- [x] 屏幕关闭时进行后台扫描——*隐身模式*
- [x] 可调阈值以实现更精细的范围控制——*自动校准 + 自定义灵敏度*
- [x] 通过轮询节奏对发射源进行指纹识别
- [x] 带房间判定结果的定时现场排查
- [x] 将日志导出为 CSV 以供报告——*与 .txt 同步实时写入*
- [x] 支持检测唤醒警报的长时间无人值守监视模式
- [x] 让仪表针对真实轮询读卡器使用其完整量程
- [x] 搜寻时显示越近越热 / 越远越冷的趋势箭头
- [ ] 研究将 LF(125 kHz)线圈式读卡器感知作为独立模式
- [ ] 在设备上按类型筛选日志

---

## 🗂️ 项目结构```
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×800README 页眉(2 倍尺寸,确保在视网膜屏幕上保持清晰)
images/social-preview.png1280×640设置 → 社交预览 — GitHub 推荐尺寸(最小 640×320,上限 1 MB)
images/mark.png512×512方形 Logo 标识:头像、网站图标、幻灯片
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 无法从仓库中自动获取的唯一资源——它必须在 **设置 → 社交预览** 中手动上传一次。当仓库在 Slack、X、LinkedIn 或 Discord 上被分享时,显示的就是这张预览图。

---

## 🙏 致谢

- 由 **[at0m-b0mb](https://github.com/at0m-b0mb)** 构建。
- 属于 Flipper 安全工具家族的一部分:**[Argus](https://github.com/at0m-b0mb/Argus-FlipperZero)**(Wi-Fi 解除认证 / 邪恶双子星看门狗)、**[GhostTag](https://github.com/at0m-b0mb/GhostTag-FlipperZero)**(BLE 反跟踪猎手)以及 **[Cerberus](https://github.com/at0m-b0mb/flipper-cerberus)**(Sub-GHz 射频看门狗)。
- 由 [Flipper Zero 固件](https://github.com/flipperdevices/flipperzero-firmware) NFC HAL(`furi_hal_nfc` 场检测)+ [ufbt](https://github.com/flipperdevices/flipperzero-ufbt) 提供支持。

## 📄 许可证

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

分类