frebergguru/nfc-pmpro

GitHub: frebergguru/nfc-pmpro

为 FURUI NFC PM-Pro RFID 读写器打造的开源 Linux 原生应用,通过逆向 HID 协议实现完整的卡片读写、克隆、密钥恢复与 NDEF 管理功能。

Stars: 0 | Forks: 0

# NFC PM-Pro — 开源配套应用 这是一款独立运行的 Linux 配套/替代应用,专为 **FURUI NFC PM-Pro**(`FR-RATEL`,USB `1629:1831`)RFID 读写器/复制器设计。它使用 C 语言开发,提供 GTK4/libadwaita GUI,通过设备原生(逆向工程)的 HID 协议进行通信。无需运行厂商软件,运行时也不需要 Wine。 ## 截图 **HF · Mifare** 标签页 — 使用密钥读取卡片、写入/格式化扇区、克隆到空白卡以及全卡标签操作: ![HF · Mifare 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/81e1975ada030451.png) | | | |---|---| | **Device** — 连接、识别、蜂鸣 | **Crack** — 字典 / 嵌套 / 暗面 / 硬嵌套 + autopwn | | ![Device 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/4df292aa86030457.png) | ![Crack 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/5736eaa6ae030503.png) | | **LF · HID** — 125 kHz EM4100/T5577 + HID prox | **Dump** — 加载/保存/导出,十六进制编辑器,diff | | ![LF · HID 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/80177699dd030508.png) | ![Dump 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/150fea19ec030514.png) | | **Records** — 构建/读取 NDEF(文本、URL、联系人等) | **Console** — 发送原始 protocol payload | | ![Records 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9715d45dd4030520.png) | ![Console 标签页](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/7a4a024724030525.png) | ## 功能说明(除特别说明外,均在真实硬件上验证) - **连接** — 识别 + RC4 握手。 - **识别标签** — 一个按钮(Device 页面)或 `pmctl identify` 命令,可自动检测读卡器上的任何内容:HF 13.56 MHz,然后是 125 kHz LF,最后是 HID prox。能指出类型(Classic 1K/4K/Mini、Plus、DESFire、Ultralight/NTAG 家族等),并标记 gen1a/UID0 魔术卡。注意:该设备仅报告 ATQA+SAK,因此无法将 Ultralight/NTAG 家族细分为 UL / UL-C / EV1 / NTAG21x(这需要 PM-Pro protocol 未暴露的 GET_VERSION 帧 — OEM 应用也无法做到)。 - **魔术测试** — 一个按钮(HF 标签页)或 `pmctl magic`,用于区分真卡和可更改 UID 的**魔术**卡。检测 **gen1a**(cmd 1D 后门)和 **gen2/CUID**(block 0 可写)— 后者通过翻转 block-0 的一个字节、读取并恢复它来检测。(CUID 卡读取时与真卡完全相同,因此这是发现它的唯一方法;它会写入 block 0 并将其恢复。) - **读取 HF**(13.56 MHz,ISO14443A)— UID/类型,以及逐扇区的 dump。每个扇区使用框中的密钥读取,如果失败则回退到字典(内置 + 加载的 `.keys` + 从 dump 导入的密钥)。输出呈现为 MifareClassicTool 风格:每行一个 block,扇区间隔开,UID/制造商 block、Key A、access bit 和 Key B 均进行颜色编码。 - **读取 / 写入 / 克隆 Mifare 扇区** — 使用密钥读取扇区,写入扇区,以及将缓冲的卡片克隆到空白卡(自动恢复 trailer 密钥)。 - **读取 / 写入 LF**(125 kHz,EM4100/T5577/EM4305)和 **HID prox**(读/写)。LF 读取可解码 EM4100 客户/卡号 + fob 文本。 - **保存 / 加载 dump** — 将读取的卡片保存为 `.pmdump`,或将其加载回缓冲区以写入空白卡。加载时会自动检测原始二进制 `.mfd` dump(例如 autopwn 输出,或 libnfc/Proxmark dump)以及 `.pmdump`。 - **编辑 / diff dump** — GUI Dump 标签页具有可编辑的十六进制编辑器(点击并输入,每行一个 block,带颜色编码),以及一个字节级的 **Diff Tool** 窗口(逐字节高亮,显示差异百分比,可隐藏相同部分),类似于 MifareClassicTool。离线命令:`pmctl dumpset ` / `dumpdiff ` / `dumpconv `。 - **导入 / 导出 `.keys`** — 导入 MifareClassicTool 风格的 `.keys` 字典(GUI Crack/Dump 标签页,或 `pmctl dict `),以扩展用于读取 / 字典 / Nested / Autopwn / 标签操作的字典;或将 dump 中恢复的 Key A/Key B 值导出到 `.keys` 文件。 - **破解** — 四种 Mifare 密钥攻击,加上全卡 autopwn: - **字典** (cmd 13) — 尝试常见/默认密钥;返回通过认证的密钥。*(已实测验证)* - **Nested** (cmd 14) — 经典的 mfoc 攻击:已知一个默认扇区密钥(通过字典自动找到)时,利用 Crypto-1 + nonce-distance 恢复其余密钥,并在卡上确认。**已验证:破解了真实 fob 的 7 个未知扇区密钥,每个约 10–30 秒。** - **Darkside** (cmd 15) — 收集 + Crypto-1 求解 + 卡上确认;适用于存在 parity-leak 漏洞的卡片(加固卡会照实报告)。 - **Hardnested** — 完整的 **mfoc-hardnested** 求解器已移植到纯 C(AVX512/AVX2/SSE2/NOSIMD,16线程,约 5 G keys/s),由设备的 nonce 收集 (cmd 0x30) 提供数据;像 mfoc 一样通过字典自动寻找落脚点。*(求解器可运行;端到端测试需要带有 foothold key 的加固卡)* - **Autopwn → .mfd** — 对每个扇区进行字典 + nested 攻击,然后读取整张卡并写入原始的 **`.mfd`** dump(恢复的密钥在 trailer 中),可由标准 Mifare 工具加载。*(已验证:dump 了完整的 1K fob,16/16 扇区密钥已破解并读取)* - **格式化**扇区、**蜂鸣**(带静音切换)、**查找/扫描** (openfind),原始 **console**(发送 payload;查看解密回复)。 - **标签操作** (Mifare Classic) — 复制、擦除、格式化内存、设置/移除密码。每一项都会找到逐扇区的密钥(框中密钥 → 字典 → nested),在需要时使用 Key B 写入 trailer(自动恢复它),通过设备的 `cmd 16` 格式化重置扇区 0(其 block 0 是只读的),并**通过重新读取扇区来验证每一次写入** — 它不会声称实现了无法证实的更改。还包括 LF EM4100 的复制/擦除。(锁定操作被延后 — 因为它是不可逆的。) - **记录 (NDEF)** — 构建并将 NDEF 记录写入 Mifare Classic 卡,并读取它们。**读取记录**会列出每条记录的完整内容,并将第一条加载回构建器(选择匹配的类型并填充字段 — 包括 vCard 姓名/电话/电子邮件/组织/URL/地址),方便您编辑和重写。支持 **文本**、**URL / URI**(带有知名 scheme 前缀 — 因此 http(s)、`tel:`、`mailto:`、视频 / 文件链接均被覆盖)、**社交媒体**(选择一个平台 — X、Instagram、LinkedIn、YouTube、TikTok、GitHub、WhatsApp 等 — 加上一个账号,它会自动构建个人资料 URL)、**评价 / 应用链接**(通过 Place ID 进行 Google 评价、Google Maps、Yelp、Play Store / App Store、Spotify、PayPal.me / Venmo / Cash App — 您提供特定业务的 ID 或从您的 Google 商家资料粘贴评价链接;应用无法替您查找)、**Smart Poster**(带标题的 URL)、**联系人** (vCard)、**Android Application Record**、**geo:** 位置、自定义 **MIME** 和 **External** 类型,以及 **原始** 记录编辑器 — 将它们组合成多记录消息。它们通过 MAD + NDEF 映射(NDEF 密钥 `D3F7D3F7D3F7`)存储,因此 **Android 手机可以读取它们**(iOS 无法读取 Mifare Classic 上的 NDEF)。该设备不支持 Ultralight/NTAG 页写入,因此 NDEF 仅能写入 Classic 卡 — 并且由于 MAD 位于扇区 0,*格式化* 手机可读标签需要一张**魔术 (gen2/CUID) 卡**(在真卡上 block 0 是只读的,因此数据扇区会被写入,但 MAD 不会 — 已在硬件上验证)。**已格式化为 NDEF 的卡仍然可以(重新)写入** — 保留现有的 MAD,仅更新数据扇区(因此由手机格式化的卡可以在此处编辑)。CLI:`pmctl ndefencode …`(离线预览),`pmctl ndefwrite …`,`pmctl ndefread`。 - **卡片洞察** — 卡类型检测(SAK/ATQA),解码 access condition 和 value block(内联显示),以及逐扇区的 **Key map** 网格。 - **自动读取** — 放置卡片时自动轮询并读取。 - **写入确认** — 破坏性写入在接触卡片前会进行询问。 GUI 有七个标签页 — **Device**、**HF · Mifare**、**LF · HID**、**Crack**、**Dump**、**Records**、**Console** — 每个页面都有自己的日志,以便操作输出显示在对应位置。偏好设置(静音、默认密钥、窗口大小、导入的 `.keys`)持久化保存在 `~/.config/pmpro/settings.ini` 中。 protocol(RC4 + CRC-16/CCITT + 封装、完整命令表)已在 [PROTOCOL.md](PROTOCOL.md) 中记录。它是从官方 `PM_Pro.exe`(使用 ilspycmd 反编译)中恢复的,并已通过真实设备验证。 ## 构建 需要 GTK4 + libadwaita、`liblzma`、C 编译器以及 CMake/Ninja。设备 I/O 是纯 `/dev/hidraw` — 不需要 libusb/hidapi。 安装依赖项: ``` # Arch / Manjaro sudo pacman -S --needed base-devel cmake ninja gtk4 libadwaita xz # Debian / Ubuntu sudo apt install build-essential cmake ninja-build libgtk-4-dev libadwaita-1-dev liblzma-dev pkg-config # Fedora sudo dnf install gcc cmake ninja-build gtk4-devel libadwaita-devel xz-devel pkgconf ``` 然后构建: ``` cmake -G Ninja -S . -B build && ninja -C build ./build/pmpro # GUI ./build/pmctl connect # CLI: connect+beep ./build/pmctl identify # CLI: auto-detect the tag on the reader + its type ./build/pmctl readic # CLI: read a 13.56 MHz card ``` 将其安装为桌面应用(添加启动器 + 图标): ``` cmake -G Ninja -S . -B build -DCMAKE_INSTALL_PREFIX=/usr && sudo ninja -C build install ``` ## 设备访问(一次性) HID 节点默认仅限 root 用户访问。安装 udev 规则: ``` sudo cp tools/99-pmpro.rules /etc/udev/rules.d/ && sudo udevadm control --reload-rules && sudo udevadm trigger # 然后拔出/重新插入设备 ``` ## 布局 - `src/furui.[ch]` — RC4 密码、CRC16、数据包封装。 - `src/session.[ch]` — 连接握手、命令执行(多报告发送/接收 + 解密)。 - `src/hidraw.[ch]` — 无依赖的 hidraw 传输(自动发现设备)。 - `src/protocol.[ch]` — 十六进制/解析、卡类型、value block 和 access condition 解码。 - `src/crack.c`, `nested.c`, `crypto1.c`, `hardnested_glue.c`, `hardnested/` — 密钥恢复。 - `src/dump.[ch]` — `.pmdump` / `.mfd` / `.keys` 加载 · 保存 · diff。 - `src/ndef.[ch]` — NDEF 记录(编码/解码)+ Mifare Classic NDEF 映射。 - `src/app.c` — GTK4/libadwaita GUI。`src/pmctl.c` — CLI。`src/probe.c` — RE 探测。 - `tests/` — Crypto-1、dump/protocol 和 NDEF 自测 (`ctest`)。 - `data/` — `.desktop` 启动器 + 图标。`tools/99-pmpro.rules` — udev 规则。 ## 负责任的使用 该设备和应用可读取/写入/克隆 RFID/NFC 卡,并包含 Mifare 密钥恢复功能。请**仅**在您拥有或获得明确授权测试的卡片和系统上使用(您自己的门禁卡、您管理的酒店/办公室行政、获得许可的安全研究)。克隆您不拥有的凭证可能是违法的。 ## 许可证 `src/crypto1.c` 移植了 **to1**(bla & Proxmark3 贡献者),`src/hardnested/` 内嵌了 **mfoc-hardnested** 求解器(piwi/Proxmark3 + nfc-tools)— 两者均为 **GPL** — 因此整个项目根据 **GPLv3** 分发。内嵌的求解器已与 libnfc 解耦;nonce 收集来自 PM-Pro (cmd 0x30),通过 `src/hardnested_glue.c` 实现。 有关完整的 GPLv3 文本,请参见 **[LICENSE](LICENSE)**;有关第三方归属和来源(所有其他 `src/` 代码均为原创,根据 `PROTOCOL.md` 编写 — 不包含反编译的厂商代码),请参见 **[NOTICE](NOTICE)**;有关预期/授权使用的免责声明,请参见 **[DISCLAIMER](DISCLAIMER)**。
标签:Bash脚本, GTK4, Mifare破解, NFC, RFID读写器, StruQ, 客户端加密