Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
Specter-FlipperZero — Specter — Flipper Zero용 패시브 13.56 MHz NFC 리더/스키머 도청 탐지 스윕. 온보드 NFC 칩을 사용하는 대(對)감시 EMF 미터. 추가 하드웨어 불필요, 전송하지 않음. | Kitploit
도구/GitHubGitHub/at0m-b0mb/specter-flipperzero
Defensive ToolsEmbedded Systems SecurityIoT SecurityRFID/NFC ToolsPenetration TestingHardware SecurityRed Teaming
GitHubat0m-b0mb/specter-flipperzero

Specter-FlipperZero

Specter — Flipper Zero용 패시브 13.56 MHz NFC 리더/스키머 도청 탐지 스윕. 온보드 NFC 칩을 사용하는 대(對)감시 EMF 미터. 추가 하드웨어 불필요, 전송하지 않음.

저장소 보기
884875일 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
<!-- banner: paper by default, true black when the reader's GitHub is dark -->
<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="images/banner-dark.png">
    <img src="https://assets.kitploit.com/production/public/readmes/42070/74bc06f0a6a1b0731b4768b4256f662b34a582f5b9701a9bce44cb1b10bedd0d.png" alt="Specter — NFC reader and skimmer bug-sweep for Flipper Zero" width="100%">
  </picture>
</p>

<p align="center">
  <sub>
    파형은 그래픽이 아니다. 이것은 Specter가 실제 폴링 리더에서 컬럼당 8&nbsp;ms로
    기록한 13.56&nbsp;MHz 반송파의 128개 컬럼이며, 옆의 스크린샷에서 다시 읽어낸
    것이다. 듀티는 28%로 측정되는데 기기 자체 카운터는 27%를 출력했고, 두 숫자
    모두 배너에 있다.
  </sub>
</p>

<p align="center"><i>보이지 않는 리더를 찾아 쓸어라.</i></p>

<p align="center">
  <a href="https://at0m-b0mb.github.io/Specter-FlipperZero/"><b>프로젝트 사이트</b></a>
  &nbsp;·&nbsp;
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases/latest">다운로드</a>
  &nbsp;·&nbsp;
  <a href="https://github.com/at0m-b0mb/specter-flipperzero/blob/main/docs/changelog.md">변경 내역</a>
</p>

<!-- live badges: these track the repo, so the README never goes stale -->
<p align="center">
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases/latest"><img src="https://img.shields.io/github/v/release/at0m-b0mb/Specter-FlipperZero?style=flat-square&amp;color=8A6714&amp;labelColor=000000" alt="Latest release"></a>
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/releases"><img src="https://img.shields.io/github/downloads/at0m-b0mb/Specter-FlipperZero/total?style=flat-square&amp;color=8A6714&amp;labelColor=000000&amp;label=downloads" alt="Downloads"></a>
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/stargazers"><img src="https://img.shields.io/github/stars/at0m-b0mb/Specter-FlipperZero?style=flat-square&amp;color=8A6714&amp;labelColor=000000" alt="Stars"></a>
  <a href="https://github.com/at0m-b0mb/Specter-FlipperZero/actions/workflows/build.yml"><img src="https://img.shields.io/github/actions/workflow/status/at0m-b0mb/Specter-FlipperZero/build.yml?branch=main&amp;style=flat-square&amp;labelColor=000000&amp;color=8A6714&amp;label=build" alt="Build"></a>
</p>

<p align="center">
  <img src="https://img.shields.io/badge/platform-Flipper%20Zero-8A6714?style=flat-square&amp;logo=flipper&amp;logoColor=FE8A2C&amp;labelColor=000000" alt="Flipper Zero">
  <img src="https://img.shields.io/badge/radio-13.56%20MHz%20NFC%20(onboard)-8A6714?style=flat-square&amp;labelColor=000000" alt="Onboard NFC">
  <img src="https://img.shields.io/badge/extra%20hardware-none-8A6714?style=flat-square&amp;labelColor=000000" alt="No extra hardware">
  <img src="https://img.shields.io/badge/transmits-never-8A6714?style=flat-square&amp;labelColor=000000" alt="Listen-only">
  <img src="https://img.shields.io/badge/license-MIT-8A6714?style=flat-square&amp;labelColor=000000" alt="MIT">
</p>

<p align="center">
  <b>Specter</b>는 여러분의 Flipper Zero를 <b>활성 13.56 MHz NFC 리더</b>를 위한 주머니 속
  <b>대(對)감시 도청 장치 색출 도구</b>로 바꿔준다. 전원이 켜진 리더가 끊임없이 내뿜는
  RF 필드를 <i>수동적으로 청취</i>한다 — 결제 단말기에 몰래 끼워 넣은 카드 스키머, 도어 패널
  뒤에 숨긴 은밀한 리더, 책상 밑에 테이프로 붙여둔 불법 로거 — 그리고 그것이 <b>어디에 있는지</b>,
  <b>어떤 종류인지</b>, <b>방이 깨끗한지</b>, 그리고 감시 모드로 켜두면 — <b>자리를 비운 사이
  그것이 나타난 순간</b>을 알려준다. 절대 송신하지 않는다.
</p>

<p align="center"><sub>리더는 보이지 않는다. Specter가 그것을 보이게 만든다.</sub></p>

<p align="center">
  <sub>
    <b>소개된 매체</b><br>
    <a href="https://www.helpnetsecurity.com/2026/07/29/specter-flipper-zero-skimmer-detector/">Help Net Security</a>
    &nbsp;·&nbsp;
    <a href="https://cybersecuritynews.com/specter-with-flipper-zero/">Cyber Security News</a>
  </sub>
</p>

---

## Flipper에서

<p align="center">
  <img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/images/demo.gif" width="70%" alt="Specter in use: sweeping a quiet room, closing in on a reader, locking on at PEGGED, fingerprinting its polling cadence, then a site-survey verdict">
</p>
<p align="center">
  <sub>스윕의 처음부터 끝까지: 조용한 방 → 접근 → 고정 → 그것이 <b>무엇</b>인지 → 방의 판정.</sub>
</p>

### 어떤 단일 모드도 담당하지 않는 화면들

<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="images/screens-dark.png">
    <img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/images/screens.png" width="100%" alt="The boot intro, main menu, Sweep listening, Fingerprint with nothing there, a Site Survey walking, Watch with a contact logged, the Logbook and Settings — all captured from a real Flipper Zero">
  </picture>
</p>
<p align="center">
  <sub>
    조용한 상태들과 인트로 — 아래 네 가지 모드는 각자 자신의 캡처를 가지고 있으므로,
    이것들은 그들이 담당하지 않는 화면들이다. <b>이 README의 모든 이미지는
    실제 기기에서 캡처한 것</b>이며, <code>tools_screenshot.py</code>로 Flipper 자체의
    RPC 세션을 통해 촬영했다. 이 프로젝트에는 더 이상 목업 렌더러가 없다 — UI를
    그려내는 것은 그것의 두 번째 구현이며, 완벽하게 그럴듯해 보이면서도 펌웨어와
    불일치했다 (<a href="https://github.com/at0m-b0mb/specter-flipperzero/blob/main/docs/changelog.md">3.0.1</a> 참조).
  </sub>
</p>

---

## 다섯 가지 모드

Specter는 하나의 센서를 둘러싼 다섯 가지 도구다. 각각 다른 질문에 답하므로,
어떤 것을 쓸지는 실제로 무엇을 알아내려는지에 달려 있다:

| 모드 | 답하는 질문 | 사용 시점 |
|---|---|---|
| **Sweep** | *어디에 있는가?* | 기기가 의심되어 돌아다니며 위치를 특정하고 싶을 때 |
| **Fingerprint** | *어떤 종류인가?* | 이미 발신원을 찾았고 그것이 어떻게 동작하는지 알고 싶을 때 |
| **Site Survey** | *이 방은 깨끗한가?* | 공간 전체에 대한 하나의 판정을 손 대지 않고 얻고 싶을 때 |
| **Watch Mode** | *내가 없는 동안 나타났는가?* | Flipper를 어딘가에 두고 감시하게 할 때 |
| **Logbook** | *무엇을, 언제 찾았는가?* | 보고서를 쓰거나 오늘과 지난주를 비교할 때 — 발견 유형별 필터 |

---

### Sweep — *어디에 있는가?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/sweep_reader.png" width="42%" align="right" alt="Sweep — reader found, meter pegged">

**하는 일.** 실시간 EMF 스타일 미터. Flipper를 평평하게 들고 확인하려는 대상
위로 천천히 움직인다 — 카드 단말기, 도어 리더, ATM 입구 아래쪽, 택배 상자, 책상.
바늘이 실시간으로 필드 세기를 따라간다.

**보이는 것.**
- **다이얼** — 바늘 = 실시간 측정값, 작은 점 = *피크 홀드* (지금까지 닿은 가장 강한
  지점이므로 위치를 비교할 수 있다).
- **`FIELD %`** — 같은 측정값을 숫자로 표시하며, **▲ / ▼ 추세 화살표**가 지난
  0.5초 동안 *더 뜨거워졌는지 차가워졌는지*를 알려준다. 추적할 때는 그 화살표가
  숫자보다 더 중요하다.
- **`PEAK %`** — 무장한 이후 가장 강한 측정값, 피크 홀드 점 뒤의 숫자.
- **다이얼을 가로지르는 표시** — 현재 감도에서 `READER`가 *시작되는* 지점. 그
  너머는 모두 Specter가 히트로 판정할 대상이므로, 다이얼이 "무엇이 카운트되는가"에
  답해주는 셈이다.
- **하단 띠** — 첫 리더를 찾기 전까지는 이것저것 눌러보지 않고는 알 수 없는 두 키
  (`LEFT=cal`, `hold OK=log`)를 표시하고, 그 이후에는 감도와 실시간 파형을 보여준다.
  반송파가 감지되는 순간 검은 **`● ACTIVE READER`** 경보 바로 바뀌며 근접도 단어가
  표시된다.
- **근접도** — `FAINT → NEAR → CLOSE → STRONG → PEGGED`. `PEGGED`는 미터가
  *최대치에 도달했다*는 뜻이다: 이 측정이 분해할 수 있는 한계까지 가까이 있다.

**소리.** 선택적 가이거 클릭음이 **가까워질수록 빨라져서**, Flipper를 주머니에 넣고
귀만으로 추적할 수 있다.

| 키 | 동작 |
|---|---|
| `OK` | 피크 홀드와 접촉 횟수 초기화 |
| `hold OK` | 이 측정값을 로그북에 저장 |
| `LEFT` | 방의 노이즈 플로어에 맞춰 보정 (3초) |
| `UP` / `DOWN` | 추적을 벗어나지 않고 감도 조절 |

<br clear="right">

### Fingerprint — *어떤 종류인가?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/fingerprint_reader.png" width="42%" align="right" alt="Fingerprint — polling reader identified">

**하는 일.** Sweep이 무언가를 찾았다면, Flipper를 그것에 **고정**시켜 댄다.
Fingerprint는 근접도 측정을 멈추고 **반송파의 온/오프 에지 타이밍**을 재기
시작하는데, 이것이 바로 한 종류의 발신원을 다른 것과 구별해주는 요소다.

**보이는 것.** 판정, 신뢰도 바, 그리고 둘을 뒷받침하는 근거:

| 분류 | 실제 의미 |
|---|---|
| **CONTINUOUS** | 반송파가 영구적으로 유지됨 |
| **POLLING** | 고정된, 수정 발진기 타이밍의 폴링 주기 — 주기가 ms 단위로 표시됨 |
| **INTERMITTENT** | 버스트형이지만 불규칙 — 흔히 사용 중인 휴대폰이나 리더 |

아래에는 `PER` (폴링 주기), `BST` (버스트 폭), `JIT` (지터), `UP` (실제 듀티 사이클)와
원시 반송파의 **로직 애널라이저 펄스 트레인**이 있어서, 판정을 맹신할 필요가 없다.
진짜 폴링 리더는 틀림없는 구형파로 나타난다.

> 타이밍 앞의 `~`는 2 ms 샘플링 하한에 가깝다는 뜻이며, 신뢰도는 그에 맞게
> 할인된다.

| 키 | 동작 |
|---|---|
| `OK` | 발견 사항을 로그북에 저장 |
| `hold OK` | 측정 재시작 |

<br clear="right">

### Site Survey — *이 방은 깨끗한가?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/survey_active.png" width="42%" align="right" alt="Site Survey — verdict">

**하는 일.** 공간 전체에 대한 **시간 제한** 스윕. 시작하고 방을 평소처럼 걸으면
끝날 때 하나의 판정을 얻는다 — 바늘을 지켜볼 필요가 없다.

**보이는 것.** 실행 중에는 카운트다운과 진행 바가 표시되고, 그다음 판정 카드가 나온다:

- **`CLEAN`** — 노이즈 플로어를 넘은 것이 없음
- **`TRACE`** — 짧거나 희미한 히트; 더 느린 2차 패스가 가치 있음
- **`ACTIVE READER`** — 무언가 실제로 켜져서 발신하고 있었음
- **`TOO SHORT`** — `CLEAN`이라고 말할 자격을 얻기 전에 중단함

…`PEAK` / `AVG` 필드, 접촉 횟수, 그리고 `UP %` — **스윕 중 반송파가 실제로 켜져
있던 비율** — 와 함께 표시되며, 이는 종종 네 숫자 중 가장 많은 것을 말해준다.
30초, 60초, 2분 동안 실행되며 결과를 자동으로 기록한다. 카드는 판정이 내려진
길이를 명시하는데, 30초의 `CLEAN`은 2분의 `CLEAN`과 같은 발견이 아니기 때문이다 —
그리고 10초보다 짧게 잘린 실행은 `CLEAN` 대신 `TOO SHORT`를 보고한다. 이 비대칭은
의도적이다: **존재는 증거이고, 부재는 그렇지 않다.** 1초 만에 무언가를 찾는 것은
진짜 발견이므로 `TRACE`와 `ACTIVE READER`는 빠르다는 이유로 보류되지 않는다;
1초 동안 아무것도 찾지 못한 것은 1초가 뒷받침할 수 없는 방 전체에 대한 주장이다.

| 키 | 동작 |
|---|---|
| `OK` *(실행 중)* | 지금 중단하고 지금까지의 결과로 판정 |
| `OK` *(카드에서)* | 새 스윕 실행 |

<br clear="right">

### Watch Mode — *내가 없는 동안 나타났는가?*

<img src="https://raw.githubusercontent.com/at0m-b0mb/specter-flipperzero/main/screenshots/watch_reader.png" width="42%" align="right" alt="Watch Mode — reader present">

**하는 일.** **무기한** 감시한다. 무장시키고, Flipper를 내려놓고, 자리를 뜬다.
Sweep이 내가 사냥하는 것이고 Survey가 고정 길이 테스트라면, Watch는 그저 기다린다 —
몇 분이든 몇 시간이든.

**보이는 것.** 아무것도 없을 때는 큰 경과 시계와 `NO READER`가 표시된다. 리더가
나타나는 순간 띠가 **`ACTIVE READER`**로 반전되고, 강도 바가 얼마나 가까운지
보여주며, **화면이 깨어나고**, 경보음이 울린다. 띠는 깜빡이지 않고 일정하게
유지되는데 — 1비트 화면에서는 꽉 찬 반전 블록이 이미 가장 요란한 요소이고, 실제로
변하는 판독값들이 생동감을 전달하기 때문이다. 지나간 뒤에도 화면은 증거를 남긴다:
`HITS` (별개의 접촉 횟수), `PEAK`, `LAST` (가장 최근 접촉이 얼마나 전이었는지),
`UP` (반송파가 실제로 켜져 있던 총 시간). 시계는 99:59를 넘으면 멈추지 않고
`hh:mm`으로 넘어가므로, 밤새 감시해도 제대로 누적된다.

Watch는 **의도적으로 스텔스 모드를 무시한다** — 무언가를 봤다는 사실을 결코
알려주지 않는 어둡고 조용한 감시자는 쓸모없는 것보다 못하다.

| 키 | 동작 |
|---|---|
| `OK` | 재무장 — 시계와 카운터 초기화 |

<br clear="right">

### Logbook — *무엇을, 언제 찾았는가?*

발견 사항은 **한 번의 동작으로 두 번 저장**되므로, 기기에서 읽을 수 있으면서
*동시에* 이미 스프레드시트다 — 기억할 내보내기 단계가 없다:

<table>
<tr><th><code>logbook.txt</code> — 그룹화, 기기 내 뷰어용</th><th><code>logbook.csv</code> — 항목당 한 개의 평면 행</th></tr>
<tr><td>```
2026-07-18 14:35:11
  SURVEY 60s ACTIVE max74…
2026-07-18 14:32:07
  READER POLLING 204ms…
```
</td><td>```
timestamp,type,detail
2026-07-18 14:35:11,SURVEY,60s ACTIVE …
2026-07-18 14:32:07,READER,POLLING 204ms …
```
</td></tr>
</table>

항목은 `SWEEP`, `READER`, `SURVEY` 또는 `WATCH`로 태그되며 Flipper의 시계를 기준으로 기록됩니다. 두 파일 모두 SD 카드의 `apps_data/specter/`에 저장됩니다. 어떤 데이터도 기기 밖으로 나가지 않습니다. **Settings → Clear logbook**에서 삭제할 수 있습니다(먼저 확인을 요구합니다 — 이 앱이 할 수 있는 유일한 되돌릴 수 없는 작업입니다).

---

## 지원 기능

### 자동 보정

Sweep 화면에서 **LEFT**를 누르면 Specter가 **3초 동안 주변 노이즈 플로어를 청취**한 뒤, 측정된 값 바로 위로 탐지 임계값을 설정합니다 — 이는 **Custom** 감도로 저장됩니다. 모든 공간은 서로 다른 RF 플로어를 가지고 있으므로, 빌드 시점에 정해진 값이 아니라 현재 서 있는 공간에 맞춰 조정됩니다. 실행할 때는 조용한 곳에 서십시오.

### 스텔스 모드

전체 스윕 동안 **화면과 LED를 어둡게** 유지하여, 당신이 탐색하는 동안 Flipper가 빛나지 않도록 합니다. 소리와 진동은 계속 작동합니다 — 요점은 스윕에 사용하는 피드백을 끄는 것이 아닙니다. 스텔스 화면에서 나가면 디스플레이가 다시 켜지므로, `BACK`을 누르면 항상 밝은 메뉴로 돌아옵니다.

### 미터 읽기

**접촉 중인 리더가 항상 100%를 방출하지 않는 이유.** 이 탐지기는 하나의 물리적 현상을 측정합니다: 13.56 MHz 반송파가 켜져 있는 시간의 비율입니다. 하지만 리더는 **폴링**합니다 — 짧은 버스트, 휴식, 또 다른 버스트. 일반적인 단말기는 **20–35%의 시간만 방사**하므로, 원시 듀티 사이클은 아무리 가까이 가도 약 30%에서 *포화*됩니다.

그 원시 수치를 게이지에 표시하면 완벽한 탐지가 3분의 1처럼 보였습니다. 대신 미터는 실제 폴링 대역을 기준으로 조정됩니다:

| 원시 반송파 듀티 | 미터 | 근접도 |
|---|---|---|
| 3% (공간 노이즈) | 10% | `FAINT` |
| 12% | 40% | `NEAR` |
| 20% | 67% | `CLOSE` |
| 28% | 93% | `STRONG` |
| ≥30% *(리더 위에 놓임)* | **100%** | `PEGGED` |

**원시 듀티는 결코 손실되지 않습니다**: 노이즈 플로어, 자동 보정, Fingerprint 화면의 `UP`은 모두 실제 듀티 사이클로 작동합니다. 왜냐하면 그것들은 *신호*를 설명하는 것이지, 신호로부터의 거리를 설명하는 것이 아니기 때문입니다. 문자 그대로의 숫자를 원하십니까? **Settings → Meter scale → Duty %**.

### 모든 것이 유지됨

감도, 스윕 길이, 소리, 진동, LED, 스텔스, 로깅, 미터 모드는 변경하는 즉시 **SD 카드에 저장**됩니다. 설정을 잊어버리는 스윕 키트는 아예 유지 기능이 없는 것보다 나쁩니다.

---

## 작동 방식

전원이 켜진 모든 NFC 리더는 카드가 깨어나기를 기다리며 **13.56 MHz 반송파로 공간을 지속적으로 핑**합니다. 당신은 볼 수 없지만 Flipper의 NFC 칩은 볼 수 있습니다: **ST25R3916**에는 하드웨어 **외부 필드 감지기**가 있습니다(Flipper가 카드를 에뮬레이트하고 리더가 자신과 통신하는 시점을 알 수 있게 해주는 동일한 회로). Specter는 칩을 감지 전용 모드로 두고 **그 "필드 존재?" 비트를 초당 약 500회 샘플링**합니다 — 자체 반송파를 켜지 않고서도.

충분히 빠르게 샘플링된 그 단일 비트는 두 가지 독립적인 신호를 담고 있습니다:```mermaid
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 동안 깨어나는 리더는 거의 지터가 없는 버스트/갭 패턴을 만들어내는데, 그 폴링 루프가 크리스털로 타이밍된 상태 머신에 의해 구동되기 때문이다. 손의 움직임과 RF 노이즈는 그렇게 일정하지 않다. 바로 그 차이가 **POLLING**과 **INTERMITTENT**를 구분한다.

### 결정 계층은 실제 컴퓨터에서 테스트된다

Specter가 숫자를 *주장*으로 바꾸는 지점 — "이것은 폴링 리더다", "이 방은 깨끗하다", "바늘이 읽어야 할 값은 이것이다" — 은 하드웨어 의존성이 없는 순수 C이며, 기기에서 발견되는 대신 호스트 테스트로 확정된다:```bash
make -C test     # 527 checks: classifier, verdict, meter scaling, presence,
                 #             cadence, log filtering, log wrapping
```
---

## 설치

개발 보드도, 플래시할 펌웨어도 필요 없습니다 — 단일 `.fap` 파일입니다.

**옵션 A — 미리 빌드된 `.fap` (가장 쉬움)**

1. [**Releases**](https://github.com/at0m-b0mb/Specter-FlipperZero/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`](https://github.com/flipperdevices/flipperzero-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_banner.py`로 재생성하세요 (`pillow` 필요).
> `screenshots/`의 모든 항목은 실제 기기에서 `python3 tools_screenshot.py`로 캡처한 것입니다
> (`pyserial`과 USB로 연결된 Flipper 필요).

---

## 사용법

**스윕, 처음부터 끝까지:**

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` | 한 단계 위로 |

---

## 솔직한 한계

- **13.56 MHz (HF) 전용.** Specter는 **NFC 대역** — 비접촉 결제 스키머, 대부분의 최신 출입 리더,
  교통 및 호텔 리더가 사용하는 대역 — 을 감지합니다. **125 kHz (LF)** 리더(구형 HID Prox / EM4100
  도어 패널)는 **볼 수 없습니다**; Flipper의 LF 경로에는 이에 상응하는 필드 감지 비트가 없습니다.
- **리더의 *반송파*를 감지할 뿐, 읽는 내용을 감지하지 않습니다.** Specter는 *활성 리더가 여기 있고,
  대략 얼마나 가까우며, 어떤 리듬으로 폴링하는지*를 알려줍니다 — 리더가 하는 어떤 것도 디코딩,
  식별, 캡처하지 않습니다.
- **강도는 상대적이며 보정되지 않았습니다.** `FIELD %`와 근접도 단어는 스윕을 위한 비교적
  "따뜻함 / 차가움" 가이드이며, cm 단위의 측정된 거리가 아닙니다. 이는 일반적인 폴링 대역에 대한
  반송파 듀티 사이클의 *스케일링된* 판독값입니다([미터 읽기](#-reading-the-meter--fixed-in-23) 참조);
  비정상적으로 드물게 폴링하는 리더는 같은 거리에서 더 낮게 읽히고, 연속파 모드의 리더는 더 멀리서도
  최대치를 찍습니다.
- **미터는 최대치에 도달합니다.** `PEGGED`는 반송파가 이 리더가 유지하는 최대치만큼 올라갔다는
  의미입니다 — 그 지점을 넘으면 더 가까이 가도 실제로 더 큰 숫자를 만들 수 없습니다. 그럴 때
  Flipper가 한 번 진동하므로, 화면이 보이지 않아도 멈춰야 한다는 것을 알 수 있습니다. 대신 `PEAK`
  홀드를 사용해 위치를 비교하세요.
- **주기는 ~2 ms까지 분해됩니다.** 이것이 샘플링 주기입니다. 그 근처의 타이밍은 **`~`**와 함께
  표시되며 신뢰도는 그에 따라 할인됩니다 — Specter는 자신이 뒷받침할 수 없는 정확해 보이는 숫자를
  제시하기보다 자신의 분해능 한계를 표시하는 쪽을 택합니다.
- **`CLEAN`은 선택한 감도에서 깨끗하다는 의미입니다.** 실제 탭에서만 깨어나는 휴면 스키머나
  차폐된 스키머는 *어떤* 임계값에서도 보이지 않습니다. 판독값이 없다고 해서 부재를 보장하지는
  않습니다.
- **한 번에 하나의 무선만.** Specter는 스윕하는 동안 NFC 칩을 점유하므로, 다른 NFC 앱을 먼저
  닫으세요 (다른 것이 무선을 점유하고 있으면 *NFC unavailable*이라고 표시됩니다).

---

## 법적 & 윤리적 고지

Specter는 **방어적, 수신 전용** 도구입니다 — **절대 송신하지 않고**, 필드에 전력을 공급하지 않으며,
리더를 건드리지 않습니다. **자신의** POS 구역, 문, 책상 또는 소지품, 또는 **명시적으로 권한을
받은** 하드웨어를 스윕하는 데 사용하세요. 사용 방식에 대한 책임은 본인에게 있습니다. 현지 법률을
숙지하세요.

---

## 로드맵

- [x] 재부팅 후에도 감도 / 소리 / 진동 / LED 유지
- [x] 타임스탬프가 포함된 감지 "Logbook"을 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
│   ├── cadence.h                 # pure: burst/gap/period timing with liveness
│   ├── ema.h                     # pure: the strength smoother
│   ├── log_filter.h              # pure: keep only one kind of finding
│   ├── log_wrap.h                # pure: wrap an entry at words, not mid-word
│   ├── specter_settings.{c,h}    # persisted settings (saved_struct)
│   └── specter_log.{c,h}         # SD logbook, RTC-stamped .txt + live .csv
├── views/
│   ├── view_chrome.h             # the header, presence dot and error screen
│   │                             #   every measurement view shares
│   ├── 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, mark and social card (generated), plus
│                                 #   device_*.png: real captures off a Flipper
├── screenshots/                  # the six captures the Apps Catalog listing uses
├── docs/catalog/                 # the prepared catalog manifest + how to submit
├── tools_check_layout.py         # static overlap + clearance checker (CI-gated)
└── tools_gen_*.py                # regenerate icons / mockups / banner / GIF
```
---

## 브랜딩

**BACKLIGHT.** 아이덴티티에는 **Didot**, 보이스에는 **Futura**, 모든 측정값에는 **Andale Mono**를 사용합니다. 주황색은 `#FE8A2C`이며 — 이 앱이 실행 중인 qFlipper 캡처에서 *추출*한 색으로, 비슷하게 보이도록 고른 색이 아니라 Flipper 자체의 백라이트입니다. `screenshots/`의 모든 캡처는 정확히 두 가지 색, `(254,138,44)`와 `(0,0,0)`으로만 이루어져 있으며, 이것이 하드웨어가 실제로 출력하는 색입니다.

이 색은 브랜드 색으로 사용되지 않습니다. **어떤 에셋에서든 유일한 잔불은 기기가 실제로 발산한 빛입니다** — 실제 캡처 내부의 픽셀로, 정수 배율로 그대로 붙여넣습니다. 아트워크는 같은 색상에서 15도 더 차가운 색조로 그려집니다. 하나의 램프를 양 끝에서 읽는 셈입니다: **종이에서는 잉크가 많을수록 신호가 강하고, 검정에서는 빛이 많을수록 신호가 강합니다** — 종이는 스윕이 끝나는 곳이고(Specter는 누군가에게 건넬 수 있는 타임스탬프 로그북을 기록합니다), 검정은 그것이 일어나는 곳이기 때문입니다(스텔스 모드는 백라이트를 강제로 끕니다).

액센트는 단 하나, 오직 한 가지만을 그립니다: **측정된 캐리어.** 결코 괘선, 프레임, 여백, 단어가 되지 않습니다 — 시스템 어디에도 금색 단어는 없으며, 렌더러는 그것이 시도되면 예외를 발생시킵니다. 따라서 배너에는 정확히 하나의 액센트 색 오브젝트가 있으며, 그 오브젝트는 측정값입니다.

파형은 실제 폴링 리더에서 8 ms당 한 열로 기록된 128열의 캐리어를, 옆의 스크린샷에서 다시 긁어낸 것입니다. 왼쪽의 평평한 구간은 누군가 측정한 침묵이 아니라, 트레이스 버퍼가 채워지기 전의 상태입니다. 그 듀티는 **28%**로 읽히는데 기기 자체 카운터는 **27%**를 출력했으며, 두 숫자 모두 배너에 있습니다. 마크는 **30%** 듀티의 한 폴링 사이클입니다 — 그 리더의 40 ms 중 12 ms이며, 동시에 `SPECTER_FULL_SCALE_DUTY`, 즉 미터가 100%를 읽는 듀티이기도 합니다. 하나의 숫자, 그것이어야 할 두 가지 독립적인 이유.

`#FE8A2C`는 여기서 우리가 고르지 않은 유일한 색입니다.

| 에셋 | 크기 | 사용 위치 |
|---|---|---|
| `images/banner.png` | 2560×800 | README 헤더, 종이 배경 (레티나에서 선명하게 유지되도록 2×) |
| `images/banner-dark.png` | 2560×800 | 순수 검정 위의 동일한 그림, `<picture>`로 다크 모드 독자에게 제공 |
| `images/social-preview.png` | **1280×640** | **Settings → Social preview** — GitHub 권장 크기 (최소 640×320, 1 MB 제한) |
| `images/mark.png` | 512×512 | 정사각형 로고 마크: 소셜 게시물, 슬라이드, 파비콘. **레포 아바타가 아님** — GitHub는 레포 옆에 *소유자의* 프로필 사진을 표시하므로, 설정할 레포별 아바타가 없음 |
| `images/mark-180/64/32/16.png` | 이름 그대로 | 180과 64는 다운스케일; **32와 16은 네이티브로 그려져** 안티앨리어싱으로 뭉개지지 않음 |
| `images/demo.gif` | 384×192 | 모든 모드를 순회하는 스크립트 투어, **기기에서 녹화** — `tools_screenshot.py --tour-gif` |
| `images/splash.gif` | 384×192 | 부팅 인트로, 실행 요청 시점부터 녹화 — `--splash` |
| `images/screens.png` | — | 캡처들의 콘택트 시트, 밝은 배경, `--sheet`로 재생성 |
| `images/screens-dark.png` | — | 순수 검정 위의 동일한 시트, `<picture>`로 다크 모드 독자에게 제공 |
| `screenshots/*.png` | 512×256 | **모든 화면, 실제 기기에서** RPC를 통해 캡처. 정확히 두 가지 색: 패널 자체의 색. |```bash
python3 tools_brand_data.py          # the facts the branding is allowed to state
python3 tools_gen_banner.py          # banner (light + dark), social preview, logo mark
python3 tools_gen_icons.py           # 1-bit Flipper icons

# these need a Flipper on USB (pip install pyserial)
python3 tools_screenshot.py --all      # walk every screen and capture it
python3 tools_screenshot.py --reader   # the shots that need a live reader
python3 tools_screenshot.py --splash   # the boot intro
python3 tools_screenshot.py --tour-gif # one GIF of the app being used
```
> 소셜 미리보기는 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 디인증 / 이블 트윈 감시), **[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
도구 다운로드