
Specter-FlipperZero v2.3
👻 Specter — 用于 Flipper Zero 的被动式 13.56 MHz NFC 读取器/嗅探器窃听器扫描工具。利用板载 NFC 芯片的反监控 EMF 探测器。无需额外硬件。
Specter 👻
去扫描那些你看不见的读卡器。
Specter 将你的 Flipper Zero 变成一台口袋大小的反监控排查工具,专门用于发现工作中的 13.56 MHz NFC 读卡器。它会被动监听通电读卡器持续发射的射频场——藏在支付终端里的隐蔽刷卡盗录器、暗设在门板后面的秘密读卡器、被胶带粘在桌下的恶意记录器——然后告诉你它在哪里、它是哪种设备、房间是否干净,以及——当你让它留守值守时——你不在期间它出现的那个瞬间。它从不发射任何信号。
读卡器是隐形的。Specter 让它们现形。
📟 在 Flipper 上
扫描(安静) · 扫描(已锁定读卡器) · 指纹识别 · 现场勘测(运行中) · 现场勘测(结论)
值守(无异常) · 值守(发现读卡器!) · 日志簿 · 校准 · 设置
✨ 它能做什么
Specter 回答四个不同的问题——它在哪里、它是什么、房间是否干净,以及我不在时是否有读卡器出现——每个问题都有自己专属的屏幕。
🔍 扫描(Sweep)— 它在哪里?
重头戏:一块模拟风格的 EMF 仪表。指针实时跟随 FIELD % 摆动,峰值保持标记会记住最强的一次信号,表盘顶端是热区。安静时,实时波形会描绘出本底噪声的起伏。
一旦感应到读卡器的载波,屏幕四周立即亮起警报边框,表盘外围脉动光环闪烁,状态条切换为 ● ACTIVE READER 并显示接近程度(FAINT → NEAR → CLOSE → STRONG)。可选的盖革计数器咔嗒声会随场强增强而加快,这样你可以把 Flipper 揣在口袋里扫过某个表面,用耳朵听出自己正越来越“热”。
OK 重置峰值/接触计数 · hold OK 记录当前读数 · LEFT 针对当前所在房间进行校准。
🔬 指纹识别(Fingerprint)— 它是什么? 2.0 新增
发现了什么?把设备稳稳对准它别动。Specter 不再追踪接近程度,而是开始对载波的开关沿计时,然后告诉你眼前是哪一类发射源:
| 类别 | 含义 |
|---|---|
| CONTINUOUS | 载波持续保持开启 |
| POLLING | 固定轮询周期——周期以毫秒显示 |
| INTERMITTENT | 突发但无规律 |
你会得到轮询周期、突发宽度、抖动、占空比和一根置信度条——外加底部一条由原始载波绘成的逻辑分析仪脉冲串,结论从不要求你单凭一句话就相信。读卡器的轮询循环由晶振精确计时,因此真正的轮询会显示为一条绝不会认错的方波。
OK 将发现保存到日志簿 · hold OK 重新开始测量。
🗺️ 现场勘测(Site Survey)— 这个房间干净吗? 2.0 新增
对整个空间做一次定时扫描。启动它、走遍房间,最后拿到一个结论,而不必全程盯着一根指针:
CLEAN—— 没有任何信号越过本底噪声TRACE—— 短暂或微弱的信号,值得再扫一遍ACTIVE READER—— 确实有设备在持续开机发射
……并报告最大/平均场强、接触次数,以及整个勘测期间载波实际开启的占比。可运行 30 秒、60 秒或 2 分钟,并自动记录结果。
🛰️ 值守模式(Watch Mode)— 有读卡器出现就告诉我 2.1 新增
如果说扫描(Sweep)是你主动搜寻、现场勘测(Survey)是一次有始有终的结论,那么值守模式(Watch Mode)则会无限期站岗。布防之后,把 Flipper 放下,走人即可。它会持续计时并统计检测次数,记住最近一次接触发生的时间,并且——这正是全部意义所在——读卡器一出现就点亮屏幕并发声报警。每次新的接触都会连同时间戳自动记入日志。
它刻意摒弃隐身:一个从不告诉你它看到了什么的、无声又黑暗的哨兵,比毫无用处更糟。OK 可重新布防(清除计数和时钟)。
📖 日志簿(Logbook)+ 实时 CSV 2.1 新增 CSV
每一次发现都会由一次操作同时写入两份——既可在设备上阅读,又已经是一份电子表格,无需记得任何导出步骤:
logbook.txt — 分组格式,供设备端查看器使用 | logbook.csv — 每条记录一行 |
|---|---|
|
|
两者都存放在 SD 卡的 apps_data/specter/ 目录下。任何数据都不会离开设备。
🎯 自动校准 2.0 新增
在扫描(Sweep)屏幕上按 LEFT,Specter 会聆听 3 秒环境本底噪声,然后把检测阈值设为略高于测得值——并保存为你的 Custom(自定义) 灵敏度。每个房间的射频底噪都不同;它针对你正站着的这间屋子调校,而不是用编译时写死的某个数字。
🕶️ 隐身模式(Stealth mode) 2.0 新增
让屏幕和 LED 在整个扫描期间保持全黑,这样当你在暗中观察时,Flipper 自己不会发光。声音和振动照常工作——重点不是关掉你赖以扫描的反馈。退出隐身屏幕时会重新点亮显示屏,因此按 BACK 后你总会落在有照明的菜单上 (2.2 版本修复——此前退出后会保持屏幕全黑,让 BACK 看起来像失灵了)。
📏 读表 2.3 修复
为什么你紧贴着的读卡器并没有 100% 的时间在发射。 探测器只测量一件物理事实:13.56 MHz 载波真正开启的时间占比。但读卡器是轮询工作的——短促突发、休眠、再来一次突发。典型的终端或门禁读卡器只有 20–35% 的时间在辐射,因此无论你贴得多近,原始占空比都会饱和在 30% 左右。
Specter 过去把那个原始数字直接印在表盘上,于是一次完美的检测看起来只有三成——CLOSE/STRONG 以及勘测的峰值测试也永远遥不可及。现在表盘已按照真实轮询区间重新缩放:
| 原始载波占空比 | 表盘读数 | 接近程度 |
|---|---|---|
| 3%(房间噪声) | 9% | FAINT |
| 12% | 34% | NEAR |
| 20% | 57% | CLOSE |
| 31% (紧贴读卡器) | 89% | STRONG |
| ≥35% / 连续波 | 100% | MAX |
MAX 表示已经顶满——你已经贴近到该测量能分辨的极限,再靠近也不会改变读数。这一点被明确说明而非藏着掖着,所以指针卡住时永远不会被误认为指针坏了。
原始占空比从未丢失:本底噪声、自动校准以及指纹识别屏幕上的 DUTY 仍以真实占空比工作,因为它们描述的是信号本身,而不是你与它的距离。更喜欢字面上的数字?Settings → Meter → Raw。
💾 一切都持久保存 2.0 新增
灵敏度、勘测时长、声音、振动、LED、隐身、日志和仪表模式,在你改动的那一刻就会保存到 SD 卡。一套会忘记自己配置的扫描工具,比完全没有持久化更糟。
🧠 工作原理
每一台通电的 NFC 读卡器都会持续以 13.56 MHz 载波“ping”空气,等待卡片被唤醒。你看不见它,但 Flipper 的 NFC 芯片看得见: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 的读卡器会把表盘打满;较弱或较远的读卡器只会让指针轻轻一动。这驱动着指针、接近程度文字和咔嗒声频率。
什么节奏 → 身份。 与此同时,该比特位的每一次跳变都会被计时。一台每 200 ms 醒来 20 ms 的读卡器,其突发/间隙模式几乎没有任何抖动,因为它的轮询循环由晶振精确计时的状态机驱动。而手部移动和射频噪声可没那么稳定。正是这种差异把 POLLING(轮询)和 INTERMITTENT(间歇)区分开来。
决策层在真实计算机上经过测试
在 Specter 把数字变成结论的地方——“这是一台轮询读卡器”、“这个房间是干净的”、“表盘就该显示这个值”——都是不依赖硬件的纯 C 代码,并且由宿主机测试钉死,而不是等到设备上才发现问题:
make -C test # 284 checks: classifier, survey verdict, meter scaling
🚀 安装
无需开发板,无需刷写固件——它只是一个 .fap 文件。
方案 A —— 预编译 .fap(最简单)
- 从 Releases 页面获取
specter.fap。 - 打开 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。在**扫描(Sweep)**屏幕上按 LEFT,保持静止 3 秒,使设备针对房间的本底噪声完成校准。
- 让 Flipper 保持平放,缓慢移动它扫过你要检查的对象——刷卡终端、门禁读卡器、ATM 出钞口下沿、包裹、桌面。
- 安静 / 波形平坦 → 探测范围内没有工作中的读卡器。
- 指针上升、咔嗒声加快 → 你正在接近发射源。继续朝峰值方向移动。
● ACTIVE READER+ 警报边框 → 一台工作中的读卡器就在此处。
- 发现什么了?返回并打开指纹识别(Fingerprint)。把 Flipper 稳稳贴住目标,让节奏稳定下来——通常几秒钟就够。按 OK 保存发现。
- 是要排查整个房间?打开现场勘测(Site Survey),走遍整个空间直到进度条填满,然后读取结论。
- 要离开这片区域?把 Flipper 放进值守模式(Watch Mode),它会站岗放哨;你不在期间若有读卡器现身,它会亮屏并报警。
- 到**日志簿(Logbook)**查看你保存的所有内容,均带时间戳——或者把
logbook.csv从存储卡中导出到电子表格。
💡 先扫一台已知良好的读卡器(例如你自己开启 NFC 的手机,或一个你信任的非接触终端),看看强势且合法的场在表盘上是什么样子——以及它的指纹会被识别成什么。然后再出门搜寻。
操作方式
| 屏幕 | 按键 | 操作 |
|---|---|---|
| 扫描(Sweep) | OK | 重置峰值 / 接触计数 |
hold OK | 记录当前读数 | |
LEFT | 校准本底噪声(3 秒) | |
| 指纹识别(Fingerprint) | OK | 将发现保存到日志簿 |
hold OK | 重新开始测量 | |
| 现场勘测(Site Survey) | OK | 再次运行勘测 |
| 值守模式(Watch Mode) | OK | 重新布防(清除计数和时钟) |
| 任意位置 | BACK | 返回上一级 |
🔬 坦诚的局限
- 仅限 13.56 MHz(HF)。 Specter 感知的是 NFC 频段——非接触支付盗刷器、大多数现代门禁读卡器、交通与酒店读卡器都使用这一频段。它无法看到 125 kHz(LF) 读卡器(较老的 HID Prox / EM4100 门禁面板);Flipper 的 LF 通路没有等效的场检测位。
- 它感知的是读卡器的载波,而不是它所读取的内容。 Specter 告诉你这里有一台工作中的读卡器、大概有多近、它以什么节奏轮询——它不会解码、识别或捕获读卡器所做的任何事。
- 强度是相对的,并非标定值。
FIELD %和接近程度词汇是用于扫描的“更近 / 更远”对比指南,而不是以厘米为单位的实测距离。它是将载波占空比相对典型轮询区间做缩放后的读数(见 读表);一台轮询格外稀疏的读卡器在相同距离下读数会更低,而连续波模式的读卡器在更远处就会把表打满。 - 表盘有上限。
MAX表示载波已按照该读卡器能达到的最大占空比持续开启——越过该点,继续靠近确实无法产生更大的数字。请改用PK峰值保持来比较不同位置。 - 节律分辨率约为 2 ms。 这就是采样周期。任何接近该值的计时都会带有
~标记,置信度也会相应打折——Specter 宁可标明自己的分辨率下限,也不引用一个看似精确、却无法背书的数字。 CLEAN意味着在你选择的灵敏度下是干净的。 一台只有真实刷卡时才会醒来的休眠盗刷器,或一台被屏蔽的盗刷器,在任何阈值下都保持隐形。没有读数并不等于没有设备。- 同一时刻只有一部无线电。 扫描期间 Specter 会独占 NFC 芯片,因此请先关闭其他所有 NFC 应用(如果其他程序占用了无线电,它会提示 NFC unavailable)。
⚖️ 法律与道德
Specter 是一款防御性、仅监听的工具——它从不发射,从不驱动场,从不触碰读卡器。请仅用它来扫描你自己的 POS 区域、门、桌或随身物品,或你明确获授权评估的硬件。你需为自己的使用方式负责。请了解当地法律。
🗺️ 路线图
- 重启后保持灵敏度 / 声音 / 振动 / LED 设置
- 将带时间戳的检测“日志簿”写入 SD 卡
- 熄屏后台扫描——隐身模式
- 可调阈值,实现更精细的范围控制——自动校准 + Custom(自定义)灵敏度
- 按轮询节律为发射源做指纹识别
- 带房间结论的定时现场勘测
- 将日志簿导出为 CSV 用于报告——与 .txt 同步实时写入
- 长时间无人值守的值守模式(Watch Mode),带检测即唤醒的报警
- 让表盘面对真实轮询读卡器时用满整个量程
- 研究基于 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
│ ├── 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 构建。
- 属于一个 Flipper 安全工具家族:Argus(Wi-Fi 去认证 / 邪恶双子星看门狗)、GhostTag(BLE 反跟踪猎手)和 Cerberus(Sub-GHz 射频看门狗)。
- 由 Flipper Zero 固件 的 NFC HAL(
furi_hal_nfc场检测)+ ufbt 驱动。
📄 许可证
MIT © 2026 at0m-b0mb