
👻 Specter — Flipper Zero 用パッシブ 13.56 MHz NFC リーダー/スキマー盗聴器スイープ。オンボード NFC チップを使用したカウンターサーベイランス EMF メーター。追加ハードウェア不要。
見えないリーダーを探り出せ。
Specterは、Flipper Zeroをアクティブな13.56 MHz NFCリーダー向けのポケットサイズの 対盗聴スイープに変えます。電源の入ったリーダーが常時放射しているRFフィールドを パッシブに傍受します — 決済端末に仕込まれた隠しカードスキマー、ドアパネルの裏に隠された リーダー、机の下にテープで貼り付けられた不正ロガー — そしてどこにあるか、 どんな種類のものか、部屋がクリーンかどうかを教えてくれます。さらに — 見張りに置いておけば — 離れている間にリーダーが現れた瞬間も知らせます。送信は一切行いません。
リーダーは目に見えない。Specterがそれを見えるようにする。
Sweep(静か) · Sweep(リーダー検出) · Fingerprint · Survey(実行中) · Survey(判定)
Watch(クリア) · Watch(リーダー出現!) · Logbook · Calibrate · Settings
Specterは、1つのセンサーを軸にした5つのツールです。それぞれが異なる問いに答えるため、 実際に何を知りたいかによって適切なモードが変わります:
機能。 ライブ表示のEMF式メーターです。Flipperを平らに持ち、調べたいもの — カード端末、ドアリーダー、 ATMの下端、小包、机 — の上をゆっくり動かします。針がリアルタイムで電界強度に追従します。
表示されるもの。
FIELD % — 同じ測定値を数値で示し、▲ / ▼のトレンド矢印が、直近の0.5秒で値が上がったか下がったかを教えてくれます。探索中は、この矢印が数値よりも重要です。PK / C — ピーク値と、これまでに別々に検出した回数。● ACTIVE READER**アラームバーに切り替わります。FAINT → NEAR → CLOSE → STRONG → MAX。MAXはメーターが振り切っている状態。この測定で判別できる限界まで近づいています。サウンド。 任意で有効にできるガイガー風クリック音が、近づくほど速くなります。 Flipperをポケットに入れたまま、耳だけを頼りに探索できます。
| キー | 動作 |
|---|---|
OK | ピークホールドと検出回数をリセット |
hold OK | この測定値をログブックに保存 |
LEFT | 部屋のノイズフロアにキャリブレーション(3秒) |
機能。 Sweepで何かを見つけたら、Flipperを対象に静止させたまま当ててください。Fingerprintは近接度の測定をやめ、 キャリアのオン/オフエッジのタイミングを計測します。これこそが、発信源の種類を見分ける実際の決め手です。
表示されるもの。 判定、信頼度バー、そしてその根拠となる証拠:
| クラス | 実際の意味 |
|---|---|
| CONTINUOUS | キャリアが常時オンの状態 |
| POLLING | 水晶発振による固定のポーリング周期 — 周期はms単位で表示 |
| INTERMITTENT | バースト的だが不規則 — 多くの場合、スマートフォンや使用中のリーダー |
その下にはPER(ポーリング周期)、BST(バースト幅)、JIT(ジッター)、DUTY(実効デューティーサイクル)に加えて、
生のキャリアのロジックアナライザ風パルス列が表示されます — 判定を鵜呑みにする必要はありません。
本物のポーリングリーダーは、紛れもない方形波として現れます。
タイミングの前の
~は、2 msのサンプリング下限に近いことを意味し、信頼度もそれに応じて割り引かれます。
| キー | 動作 |
|---|---|
OK | 発見をログブックに保存 |
hold OK | 測定をやり直す |
機能。 空間全体を時間を決めてスイープします。開始したら部屋を普通に歩き回り、最後にひとつの判定を得ます — 針を注視する必要はありません。
表示されるもの。 実行中はカウントダウンとプログレスバー、その後に判定カード:
CLEAN — ノイズフロアを超えるものはなかったTRACE — 短い、または微弱なヒット。ゆっくり2回目のパスをする価値ありACTIVE READER — 何かが実際に起動して発信していた…さらにMAX / AVGフィールド、検出回数、FIELD %が表示されます — キャリアが実際に立ち上がっていた調査時間の割合で、
これは4つの数値の中で最も示唆に富むことが多い指標です。30秒、60秒、2分のいずれかで実行され、結果は自動的にログに記録されます。
| キー | 動作 |
|---|---|
OK | サーベイをもう一度実行 |
機能。 無期限に見張りを続けます。セットしてFlipperを置き、その場を離れます。Sweepが自分で探すモードで、 Surveyが時間固定のテストなのに対し、Watchはただ待ち続けます — 数分でも数時間でも。
表示されるもの。 何もない間は大きな経過時間クロックとALL CLEARが表示されます。リーダーが現れた瞬間、
バンドが**READER PRESENT**に反転し、画面が点灯してアラームが鳴ります。バンドは点滅ではなく常時点灯 —
代わりに小さなマーカーが脈動するので、ストロボのようにチカチカせずにライブ表示だと分かります。イベントが過ぎ去った後も、
画面には証拠が残ります: HITS(別々の検出の回数)、PEAK、LAST(最後の検出がどれだけ前か)、
SEEN(キャリアが実際に立ち上がっていた合計時間)。
Watchは意図的にステルスモードを無視します — 何かを検知しても知らせてくれない暗く静かな見張りは、 役に立たないどころか有害だからです。
| キー | 動作 |
|---|---|
OK | 再セット — クロックとカウンターをクリア |
発見は1回の操作で2つの形式で保存されるため、デバイス上で読めるうえに、すでにスプレッドシートにもなっています — エクスポートの手順を覚えておく必要はありません:
logbook.txt — デバイス上のビューア向けにグループ化 | logbook.csv — 1エントリにつきフラットな1行 |
|---|---|
| ``` 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/ に
あり、何もデバイスの外に出ることはありません。削除するには Settings → Clear logbook
(最初に確認があります——このアプリで唯一取り消しが効かない操作です)から行います。
スイープ画面で LEFT を押すと、Specter は 周囲のノイズ フロアを 3 秒間聞き取り、検出しきい値を、計測された値のすぐ上に設定します ——これが Custom 感度として保存されます。部屋ごとに RF フロアは異なり 、この機能はビルド時に埋め込まれた数値ではなく、あなたがいる部屋の値に合わせます 実行するときは静かな場所で行ってください。
スイープ中ずっと 画面と LED を暗く保つので、あなたが探っている間も
Flipper が光ることはありません。音と振動は動作し続けます——
その狙いは、スイープ中に得ているフィードバックを無効にすることではありません。ステルス画面を終了すると
ディスプレイが再点灯し、BACK は必ず明るいメニューへ戻ります。
触れているリーダーが、なぜ 100% の時間ずっと放射しているわけではないのか。 検出器が 計測する物理量はひとつだけです。13.56 MHz キャリアが立っている時間の割合です。 しかしリーダーは ポーリング します——短いバースト、休止、またバースト。典型的な端末は 時間の 20–35% しか放射していません。そのため生のデューティサイクルは約 30% で 飽和 し ます。どれだけ近づいても同じです。
ゲージにそのままの数値を表示すると、完璧な検出が 3 分の 1 のように見えてしまいます。 そこでメーターは、実際のポーリング帯域に合わせてスケーリングしています。
生のデューティが失われることはありません: ノイズフロア、自動キャリブレーション、そして
Fingerprint 画面の DUTY はすべて、実際のデューティサイクルのまま動作します。なぜならそれらは
信号 を表すものであり、リーダーまでの距離ではないからです。正確な数値が欲しいですか?
Settings → Meter → Raw。
感度、スイープ時間、サウンド、バイブ、LED、ステルス、ログ、メーターモードは、変更したその瞬間に SD カードへ保存されます。セットアップを忘れてしまうスイープキットは、 永続化がまったくないことよりも悪いものです。
電源が入っているすべての NFC リーダーは、常に 13.56 MHz キャリアを空気中に発信して、カードが 起きるのを待っています。あなたには見えませんが、Flipper の NFC チップには見えます。ST25R3916 はハードウェアの 外部フィールド検出器 を備えています(Flipper がカードをエミュレートし、リーダーが話しかけていることを 知るのと同じ回路です)。Specter はチップを検出専用モードに置き、「フィールド存在?」ビットを 毎秒約 500 回サンプリング します——自分のキャリアを一切オンにすることなく。
その 1 ビットを十分な速度でサンプリングすると、2 つの独立した信号が得られます。```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起きるリーダーは、ほとんどジッタのないバースト/ギャップパターンを生成します。なぜなら、そのポーリングループは水晶でタイミングを取られたステートマシンによって駆動されているからです。手の動きやRFノイズはそれほど安定していません。その違いが**POLLING**と**INTERMITTENT**を分けるものです。
### 判断レイヤーは実機コンピュータ上でテストされる
Specterが数値を*主張*に変える箇所 —「これはポーリングリーダーだ」「この部屋はクリーンだ」「針がこの値を示すべきだ」— は、ハードウェア依存のない純粋なCであり、デバイス上で発見されるのではなく、ホストテストによって固定されています。```bash
make -C test # 300 checks: classifier, verdict, meter scaling, presence
開発ボードも、書き込むファームウェアも不要です。単一の .fap ファイルです。
オプション A — プリビルド .fap(最も簡単)
Releases ページから適切な .fap を入手してください:
| お使いのファームウェア | ファイル |
|---|---|
| 公式 / ストック | specter.fap |
| Unleashed、RogueMaster、Momentum またはそれ以降のもの | specter-fw-dev.fap |
Flipper に
APP:87 < FW:88 — This app might not workと表示されたら、間違った ファイルです。もう一方のファイルを使ってください。アプリの API バージョンはコンパイル時に固定されるため、 単一のビルドでは両方のファームウェア系統に対応できません。Continue を押せば通常は動作しますが、 一致するビルドでは確認を求められません。
オプション B — ufbt を使って自分でビルドする```bash
python3 -m pip install --upgrade ufbt
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
The `.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` | ピーク / コンタクトをリセット |
| | `hold OK` | 現在の読み取りを記録 |
| | `LEFT` | ノイズフロアを較正(3秒) |
| **Fingerprint** | `OK` | 発見をログブックに保存 |
| | `hold OK` | 測定を再開 |
| **Site Survey** | `OK` | サーベイを再度実行 |
| **Watch Mode** | `OK` | 再セット(カウントと時計をクリア) |
| *どこでも* | `BACK` | 1つ上のレベルへ |
---
## 🔬 正直な制限
- **13.56 MHz(HF)のみ対応。** Specter は **NFC バンド**(非接触決済スキマー、最新のアクセスリーダーのほとんど、交通系・ホテル用リーダーが使用する帯域)を感知します。**125 kHz(LF)** リーダー(旧型の HID Prox / EM4100 ドアパネル)は **確認できません**。Flipper の LF 経路には同等のフィールド検出ビットがないためです。
- **感知するのはリーダーの *キャリア* であり、読み取る内容ではありません。** Specter が教えてくれるのは、*アクティブなリーダーがここにあり、おおよそどれだけ近く、どのリズムでポーリングしているか* だけです。リーダーが行う何かをデコード、識別、キャプチャすることはありません。
- **強度は相対的であり、較正されていません。** `FIELD %` や近接を示す言葉は、スイープのための比較用の「近い / 遠い」ガイドであり、cm 単位の測定距離ではありません。キャリアのデューティサイクルを標準的なポーリング帯域と比較した *スケーリング* された読み取りです([メーターの読み方](#-reading-the-meter--fixed-in-23) を参照)。ポーリングが異常に疎なリーダーは、同じ距離でも低く読まれ、連続波モードのリーダーはより遠くからピークを示します。
- **メーターは上限に達します。** `MAX` は、このリーダーがキャリアを保持できる最大限まで上がっていることを意味します — その先では、近づいても実際には数値は大きくなりません。代わりに `PK` ピークホールドを使って位置を比較してください。
- **リズムの分解能は約2 msです。** これがサンプリング周期です。これに近いタイミングは **`~`** 付きで表示され、信頼度もそれに応じて割り引かれます — Specter は、裏付けできない精密そうな数値を示すよりも、自らの分解能の限界を明示することを選びます。
- **`CLEAN` は、選択した感度でのクリーンを意味します。** 実際のタップでのみ起動する休眠中のスキマーや、遮蔽されたスキマーは、*どの* しきい値でも見えません。読み取りがないことは、存在しないことを保証するものではありません。
- **同時に使える無線は1つだけ。** Specter はスイープ中に NFC チップを占有するため、他の NFC アプリを先に閉じてください(他のアプリが無線を保持していると *NFC を使用できません* と表示されます)。
---
## ⚖️ 法的・倫理的な注意
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
furi_hal_nfc field detection) + ufbt.MIT © 2026 at0m-b0mb
| モード | 答えられる問い | 使う場面 |
|---|
| 🔍 Sweep | それはどこにあるのか? | 機器の存在を疑っていて、動き回って位置を特定したいとき |
| 🔬 Fingerprint | どんな種類のものか? | 発信源を見つけて、その挙動を知りたいとき |
| 🗺️ Site Survey | この部屋はクリーンか? | 空間全体について、手を使わずにひとつの判定を得たいとき |
| 🛰️ Watch Mode | 離れている間に現れたか? | Flipperをどこかに置いて見張らせたいとき |
| 📖 Logbook | 何を、いつ見つけたか? | 記録にまとめたいとき、または今日と先週を比較したいとき |
| 生キャリアデューティ | メーター | 近接度 |
|---|
| 3%(周囲ノイズ) | 10% | FAINT |
| 12% | 40% | NEAR |
| 20% | 67% | CLOSE |
| 28% | 93% | STRONG |
| ≥30% (リーダーに接触) | 100% | MAX |
qFlipper を開き、ファイルを SD Card / apps / NFC / にドラッグします。
Flipper で: Apps → NFC → Specter。