
👻 Specter — Flipper Zero 用パッシブ 13.56 MHz NFC リーダー/スキマー盗聴器スイープ。オンボード NFC チップを使用したカウンターサーベイランス EMF メーター。追加ハードウェア不要。
見えないリーダーを探り当てる。
Specterは、あなたのFlipper Zeroを、アクティブな13.56 MHz NFCリーダーを探すためのポケットサイズの対盗聴バグスイープに変えます。電源が入ったリーダーが常時放射しているRFフィールドをパッシブに傍受します — 決済端末に忍ばせられた隠しカードスキマー、ドアパネルの裏に隠された秘密のリーダー、机の下にテープで貼られた不正ロガー — そして、それがどこにあるか、どんな種類のものか、部屋がクリーンかどうか、さらに見張りを続ければ — あなたが離れている間に現れた瞬間を教えてくれます。送信は一切行いません。
リーダーは見えない。Specterがそれを見えるようにする。
掲載メディア
Help Net Security
·
Cyber Security News
スイープの開始から終了まで: 静かな部屋 → 接近 → ロックオン → 何かの特定 → 部屋の判定。
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 | ピークホールドと接触回数をリセット |
OK長押し | この読み値をログブックに保存 |
LEFT | 部屋のノイズフロアにキャリブレーション(3秒) |
機能。 Sweepで何かを見つけたら、Flipperをそれに静止させて当てます。Fingerprintは近接度の測定をやめ、キャリアのオン/オフエッジのタイミングを計測します。これこそが、発信源の種類を区別する決め手です。
表示されるもの。 判定、信頼度バー、そしてその根拠となる証拠:
| クラス | 実際の意味 |
|---|---|
| CONTINUOUS | キャリアが常時オン |
| POLLING | 固定されたクリスタルタイミングのポーリング周期 — 周期はmsで表示 |
| INTERMITTENT | バースト的だが不規則 — 多くの場合、使用中のスマホやリーダー |
その下にはPER(ポーリング周期)、BST(バースト幅)、JIT(ジッター)、DUTY(実デューティサイクル)に加え、生のキャリアのロジックアナライザー風パルス列が表示されます — 判定を鵜呑みにする必要はありません。本物のポーリングリーダーは、紛れもない方形波として現れます。
タイミングの前の
~は、2msのサンプリング下限に近いことを意味し、信頼度もそれに合わせて割り引かれます。
| キー | アクション |
|---|---|
OK | 発見をログブックに保存 |
OK長押し | 測定を再開 |
機能。 空間全体の時間制限付きスイープ。開始して部屋を普通に歩き回ると、最後に1つの判定が得られます — 針を注視する必要はありません。
表示されるもの。 実行中はカウントダウンとプログレスバー、その後は判定カード:
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フラット行に |
|---|---|
| ``` 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 から消去できます(最初に確認が求められます——アプリが実行できる唯一の取り消し不能な操作です)。
Sweep画面でLEFTを押すと、Specterは周囲のノイズフロアを3秒間聞き取り、測定した値のすぐ上に検出しきい値を設定します——それがCustom感度として保存されます。部屋ごとにRFフロアは異なります。これはビルド時に組み込まれた数値ではなく、あなたが立っている場所に合わせて調整されます。実行するときは静かな場所に立ってください。
スイープ全体を通して画面とLEDを暗く保つため、あなたが探っている間もFlipperが光ることはありません。サウンドとバイブレーションは動作し続けます——目的は、スイープ中に頼りにするフィードバックを無効にすることではありません。ステルス画面を終了するとディスプレイが再点灯するため、BACKを押せば常に照明付きのメニューに戻れます。
触れているリーダーが100%の時間で放射しない理由。 検出器は1つの物理的な事柄を測定します: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回サンプリングします——自らのキャリアをオンにすることは一切ありません。
その単一のビットを十分な速さでサンプリングすると、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
`.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` | 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 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
すべてのアートワークは生成されるため、アプリから乖離することはありません:
> ソーシャルプレビューは、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 deauth / 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` フィールド検出) + [ufbt](https://github.com/flipperdevices/flipperzero-ufbt) を搭載。
## 📄 ライセンス
[MIT](https://github.com/at0m-b0mb/specter-flipperzero/blob/main/LICENSE) © 2026 at0m-b0mb
| モード | 答える問い | 使用する場面 |
|---|
| 🔍 Sweep | どこにあるか? | デバイスの存在を疑い、動き回って位置を特定したいとき |
| 🔬 Fingerprint | どんな種類のものか? | 発信源を見つけ、その挙動を知りたいとき |
| 🗺️ Site Survey | この部屋はクリーンか? | 空間全体について、ハンズフリーで1つの判定が欲しいとき |
| 🛰️ 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。
| アセット | サイズ | 配置先 |
|---|
images/banner.png | 2560×800 | README ヘッダー(Retina で鮮明に保つため 2 倍) |
images/social-preview.png | 1280×640 | 設定 → ソーシャルプレビュー — GitHub 推奨サイズ(最小 640×320、1 MB 上限) |
images/mark.png | 512×512 | 正方形のロゴマーク: アバター、ファビコン、スライド |
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 |