
Specter-FlipperZero v2.8
👻 Specter — 用于 Flipper Zero 的被动式 13.56 MHz NFC 读取器/嗅探器窃听器扫描工具。利用板载 NFC 芯片的反监控 EMF 探测器。无需额外硬件。
Specter 👻
扫除你看不见的读卡器。
Specter 将你的 Flipper Zero 变成一台口袋大小的反监控扫描仪,用于检测 活跃的 13.56 MHz NFC 读卡器。它会被动监听通电读卡器持续发射的射频场——无论是被塞进支付终端里的隐藏卡片盗刷器、藏在门板后面的隐蔽读卡器,还是被胶带粘在桌下的恶意记录器——然后告诉你它在哪里、 是什么类型的设备、房间是否干净,并且——如果让它值守——还能告诉你你离开期间它出现的时刻。它从不发射信号。
读卡器是隐形的。Specter 让它们现形。
媒体报道
Help Net Security
·
Cyber Security News
📟 在 Flipper 上
一次完整的扫描:安静的房间 → 逼近 → 锁定 → 识别类型 → 房间结论。
扫描(安静) · 扫描(锁定读卡器) · 指纹识别 · 现场勘察(进行中) · 现场勘察(结论)
值守(无异常) · 值守(发现读卡器!) · 日志簿 · 校准 · 设置
✨ 五种模式
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 … ``` |
条目带有 SWEEP、READER、SURVEY 或 WATCH 标签,并加盖 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(最简单)
-
从 Releases 页面获取对应的
.fap文件:你的固件 文件 官方 / 原版 specter.fapUnleashed、RogueMaster、Momentum 或任何更新版本 specter-fw-dev.fap如果 Flipper 提示
APP:87 < FW:88 — This app might not work,说明你选错了 文件——请换用另一个。应用的 API 版本在编译时即已固定, 因此单个构建无法同时兼容两条固件线。通常按 Continue 仍可运行, 但匹配的构建不会弹出该提示。 -
打开 qFlipper,将文件拖放到
SD Card / apps / NFC /中。 -
在 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.png | 2560×800 | README 页眉(2 倍尺寸,确保在视网膜屏幕上保持清晰) |
images/social-preview.png | 1280×640 | 设置 → 社交预览 — GitHub 推荐尺寸(最小 640×320,上限 1 MB) |
images/mark.png | 512×512 | 方形 Logo 标识:头像、网站图标、幻灯片 |
images/demo.gif | 768×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