Flipper Zero 逆向 iBells ZJ-68 餐厅寻呼机:433.92 MHz Princeton 24-bit 信号分析与 256 码批量生成与枚举

发布时间:2026/9/15 0:51:48
Flipper Zero 逆向 iBells ZJ-68 餐厅寻呼机:433.92 MHz Princeton 24-bit 信号分析与 256 码批量生成与枚举 Flipper Zero 逆向 iBells ZJ-68 餐厅寻呼机433.92 MHz Princeton 24-bit 信号分析与 256 码批量生成与枚举【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper本篇技术指南以仓库 iBells_ZJ-68 目录 为核心素材完整讲解如何对一个真实的餐厅寻呼系统iBells ZJ-68在德国北部一家加油站被发现进行信号逆向从捕获的三个仅末字节不同的信号归纳出 24 位 Princeton 编码规律再用 Python 脚本批量生成 256 个 Flipper SubGhz 键文件.sub最后借助 Sub-GHz 播放列表实现全码顺序发送与暴力枚举。读完你将掌握 .sub 文件各字段的实际含义、基于模板批量生成合法键文件的方法以及播放列表应用在 SD 卡上的部署与使用流程。背景德国加油站里的 iBells ZJ-68 客叫系统iBells ZJ-68 是一款典型的餐厅客叫Gästeruf寻呼系统顾客按桌位按钮服务台的寻呼机振动或响铃提示。该设备被 Flipper 玩家在德国北部的加油站偶然遇到信号被完整抓取并整理进了仓库。按原文档描述该系统存在两个版本固定 20 台寻呼机的版本寻呼机数量固定为 20支持最多 999 台的版本手册中提及可扩展至 999 台寻呼机。作者在目录中提供了 3 个捕获信号的分析结论、1 个批量生成脚本、256 个生成好的 .sub 文件以及 1 个播放列表文件文件清单如下仓库相对路径README.md —— 逆向过程说明create_zj68_pager_files.py —— 批量生成脚本ZJ-68-pager_00.sub 至 ZJ-68-pager_FF.sub —— 256 个键文件ibells-pager_zj-68_playlist.txt —— 全码播放列表逆向核心发现三个信号只差最后一个字节原文档给出了整个逆向工作的关键线索我捕获了三个信号它们只在最后一个字节上不同于是我写了一个小型 Python 脚本生成 256 种不同的编码。也就是说作者对同一寻呼系统发射了多次呼叫抓到的多份原始信号经过协议解析后得到的按键编码Key只有最后一位随寻呼机编号变化其余字节完全一致。这直接指向一个结论寻呼机编号被编码在 24 位键值的低 8 位中。以仓库中生成的第 0 号和第 255 号文件为例完整内容分别为ZJ-68-pager_00.subFiletype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Princeton Bit: 24 Key: 00 00 00 00 00 E9 C4 00 TE: 325ZJ-68-pager_FF.subFiletype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Princeton Bit: 24 Key: 00 00 00 00 00 E9 C4 FF TE: 325对照可见除Key行末尾字节00→FF外其余字段完全相同。由此可以推断Key中的E9 C4两个字节大概率对应该系统固定的站点/餐馆标识而末字节即寻呼机编号256 种取值正好覆盖全部单字节寻呼码空间。.sub 键文件字段逐项解读上述文件是标准的 Flipper SubGhz 键文件格式各字段含义如下字段值说明FiletypeFlipper SubGhz Key File文件类型声明表明这是一个 SubGhz 键文件Version1键文件格式版本号Frequency433920000载波频率433.92 MHz欧洲 ISM 频段以 Hz 为单位PresetFuriHalSubGhzPresetOok650Async射频预设OOK 调制、650 kHz 带宽、异步发送模式对应固件枚举FuriHalSubGhzPresetOok650AsyncProtocolPrinceton协议类型Flipper 内置解码/编码器可识别并发送 Princeton 格式帧Bit24有效码位数为 24 bitKey00 00 00 00 00 E9 C4 XX编码数据以 8 字节十六进制表示实际参与发送的是低 24 bitE9 C4 XXTE325协议时间单元Time Element325 µs决定每位脉冲的时宽关于频点433.92 MHz 落在 CC1101 芯片官方支持频段300–348 MHz、387–464 MHz、779–928 MHz之内因此在官方固件下即可直接收发无需任何扩频或危险设置这点在 Restaurant_Pagers 目录的说明 中有明确交代。关于TE: 325与Bit: 24Princeton 是 Flipper 固件内置的经典固定码协议之一通常以 325 µs 作为时间单元24 bit 表示一条完整呼叫帧的有效载荷为 24 位。将这些字段与捕获信号比对后填入即可让 Flipper 精确重放原始波形。批量生成 256 个寻呼码脚本逐行拆解仓库中的 create_zj68_pager_files.py 是本次逆向的自动化成果全文如下#!/usr/bin/python3 filename ZJ-68-pager_{:02X}.sub template Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Princeton Bit: 24 Key: 00 00 00 00 00 E9 C4 {:02X} TE: 325 playlist sub: /ext/subghz/Restaurant_Pagers/iBells_ZJ-68/ZJ-68-pager_{:02X}.sub\n playlist_file open(ibells-pager_zj-68_playlist.txt, w) for i in range(0, 256): playlist_file.write(playlist.format(i)) sub_file open(filename.format(i), w) sub_file.write(template.format(i)) sub_file.close() playlist_file.close()脚本逻辑非常清晰共四步模板定义template是一个多行字符串除Key行末尾的{:02X}占位符外其余字段频率 433.92 MHz、Ook650 预设、Princeton 协议、24 bit、TE 325、前 5 字节00 00 00 00 00与固定段E9 C4全部写死。十六进制占位符{:02X}是 Python 格式化语法——02表示至少两位、不足补零X表示大写十六进制。因此i 0生成00i 255生成FF与目录下从ZJ-68-pager_00.sub到ZJ-68-pager_FF.sub的 256 个文件一一对应。循环写文件for i in range(0, 256)遍历 0–255每轮生成一个 .sub 键文件。同步生成播放列表循环内同时向ibells-pager_zj-68_playlist.txt写入一行sub: 路径路径指向 SD 卡上的/ext/subghz/Restaurant_Pagers/iBells_ZJ-68/ZJ-68-pager_XX.sub。在任意 Linux/macOS 环境执行python3 create_zj68_pager_files.py即可在脚本所在目录重建这 256 个键文件和 1 个播放列表文件。关于扩展到 999 台的推测原文档提到手册中该系统可支持最多 999 台寻呼机并猜测probably could be extended to support the 999 possible pagers。需要注意的是单字节编码最多只能表达 256 个不同编号若系统真实支持 999 台则其寻呼码编码必然不止占据 8 bit例如使用更多低位比特、多位编码或跳码映射。仓库目前仅覆盖 256 码的单字节方案未提供针对 999 台版本的完整编码方案这需要结合实际设备或手册进一步逆向此处不做臆测。用播放列表一键枚举全部 256 个寻呼码生成 256 个文件之后逐个手动发送显然不现实。仓库给出的解法是把播放列表文件放到 Flipper 的播放列表目录让 Sub-GHz Playlist 应用自动按顺序发送全部 256 个码。播放列表文件 ibells-pager_zj-68_playlist.txt 的格式如下节选sub: /ext/subghz/Restaurant_Pagers/iBells_ZJ-68/ZJ-68-pager_00.sub sub: /ext/subghz/Restaurant_Pagers/iBells_ZJ-68/ZJ-68-pager_01.sub sub: /ext/subghz/Restaurant_Pagers/iBells_ZJ-68/ZJ-68-pager_02.sub ... sub: /ext/subghz/Restaurant_Pagers/iBells_ZJ-68/ZJ-68-pager_FF.sub共 256 行每行以sub:前缀指向一个键文件的 SD 卡绝对路径。部署与使用步骤将整个iBells_ZJ-68目录含 256 个.sub文件复制到 Flipper SD 卡的/ext/subghz/Restaurant_Pagers/iBells_ZJ-68/下与播放列表中的路径保持一致将ibells-pager_zj-68_playlist.txt复制到 SD 卡的播放列表目录。按 subplaylist 目录说明该应用对应的 SD 卡目录名为subplaylist旧版文档中的playlist目录名已弃用在支持该应用的固件如 Unleashed、RogueMaster中通过Applications - Tools - Sub-GHz Playlist打开选择该播放列表即可顺序发送全部 256 个寻呼码应用支持循环播放选项。频率合规与固件注意事项虽然本方案工作在 433.92 MHz、无需改固件但仓库中关于寻呼机逆向有一个重要的频段边界提示值得一并了解详见 Restaurant_Pagers 说明 与 SubGHz_changes.md官方支持频段300–348 MHz、387–464 MHz、779–928 MHz依据 CC1101 芯片数据手册非官方扩展频段281–361 MHz、378–481 MHz、749–962 MHz依据 CC1111/YARD Stick One 文档官方固件默认拒绝超出官方频段的频率RogueMaster、UnleashedCodeGrabber等第三方固件可通过extend_range、dangerous_settings选项放开限制超出芯片数据手册范围工作可能导致 VCO/PLL 失锁、杂散发射、天线失配下的谐波增大与功放损坏风险仓库明确警告Going outside the officially supported frequencies may DAMAGE YOUR FLIPPER AMP。仓库内另一个寻呼机逆向案例 LRS_Pagers 就是 467 MHz 频段需要改固件的例子可作为频率合规问题的对比参考。本方案中的 433.92 MHz 完全处于官方范围内直接可用。验证与仓库内的延伸资源验证方法把 256 个码按播放列表顺序发送观察目标寻呼机是否在某个码位被唤醒/振动/响铃命中的码即该寻呼机的编号信号可视化仓库 wetox_scripts 中的 draw_subghz.py 可以把 .sub 键文件绘制成波形图适合进一步分析E9 C4 XX各字节在时域上的实际占位同类资料Restaurant_Pagers 根目录 汇总了寻呼机逆向的频段边界知识LRS_Pagers 展示了针对另一品牌寻呼系统的完整暴力破解思路含餐馆 ID 与寻呼机 ID 全组合可作为理解系统码 编号码两级编码的对照案例。最后提醒寻呼系统属于他人经营的通信设备相关捕获与测试应仅限于自己拥有或明确授权的设备并遵守当地无线电法规。【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考