Momentum Firmware SubGHz 计数器实验模式(Counter Mode)完全指南
2026/9/16 14:54:48 网站建设 项目流程

Momentum Firmware SubGHz 计数器实验模式(Counter Mode)完全指南

【免费下载链接】Momentum-Firmware🐬 Feature-rich, stable and customizable Flipper Firmware项目地址: https://gitcode.com/GitHub_Trending/mo/Momentum-Firmware

本指南围绕 Momentum Firmware 的 SubGHz 计数器实验模式(Experimental Counter Mode)展开,讲解如何通过手工编辑.sub文件中的CounterMode字段,定制 Nice Flor-S、Came Atomo、Alutech AT-4N、KeeLoq、V2 Phoenix 等滚动码(rolling code)协议在发射时的计数器递增规律,从而制作不与原遥控器冲突的克隆信号。读完本文,你将掌握每个协议各模式的计数器序列、底层实现原理与安全使用边界。

该功能及文档最初由 Unleashed Firmware 团队贡献,Momentum Firmware 在自身固件中实现了同样的能力(对应源码位于 lib/subghz/protocols/ 下的各协议实现文件中),本文在保留原始文档全部内容的基础上,结合仓库源码补充实现级细节。

什么是 SubGHz 计数器实验模式

许多车库门、门禁等无线系统采用滚动码(rolling code)协议:每次按键发射时,信号中会携带一个递增的计数器值,接收端只接受计数器比上次更大的信号,从而防止重放攻击。Flipper 在模拟这类遥控器时,默认每次发射计数器 +1(该步长来自全局设置中的 rolling counter multiplier,默认值为 +1),与真实遥控器行为一致。

Counter Mode 实验功能允许你自定义计数器在每次发射时如何变化。不同协议支持不同的计数器模式,其核心目的是:制作一个不会与原遥控器冲突的克隆信号,使 Flipper 与原遥控器能在同一滚动码系统中交替使用,而不造成接收端失步(desync)或其他问题。

强烈警告:不要对不属于你的设备做实验!如果你不确定哪种模式适合你的系统、并且无法把原遥控器重新对码到接收端——请勿使用这些模式。只有在你能访问接收端并可以进行测试的前提下,才建议逐个尝试这些模式,并将结果反馈到 GitHub issues 或社区。

如何启用计数器实验模式

启用某个计数器模式,只需要手工编辑.sub文件,在文件末尾添加一行CounterMode字段。

操作步骤

  1. 在 Flipper Zero 的 SD 卡/ext/subghz/目录中找到目标.sub文件;
  2. 用文本编辑器打开该文件;
  3. 在文件末尾添加如下一行:
    CounterMode: X

    其中X是模式编号(0、1、2 等)。

示例 .sub 文件

Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Nice FloR-S Bit: 52 Key: AA AA AA AA AA AA AA CounterMode: 1

解析机制(源码视角)

从源码看,CounterMode是一个可选字段:在反序列化(deserialize)阶段,各协议通过flipper_format_read_uint32尝试读取该字段,读取成功则把模式号存入一个静态变量(如 nice_flor_s.c 中的nice_flors_counter_mode),读取失败则回退为模式 0:

uint32_t tmp_counter_mode; if(flipper_format_read_uint32(flipper_format, "CounterMode", &tmp_counter_mode, 1)) { nice_flors_counter_mode = (uint8_t)tmp_counter_mode; } else { nice_flors_counter_mode = 0; }

注意:源码中每个协议都使用独立的静态变量保存模式号(如came_atomo_counter_modekeeloq_counter_modealutech_at4n_counter_modev2_phoenix_counter_mode),这意味着模式只对对应协议生效,不同协议的.sub文件互不影响。

另一个重要实现细节是bypass 机制:如果在 Flipper 的 Signal Settings(信号设置)菜单中修改了 Counter(计数器)或 Button(按键),源码会置位bypass标志并跳过Counter Mode 逻辑,直接按用户指定的值生成信号(见 came_atomo.c 中的注释 "if we change counter/button in SignalSettings menu then we must bypass counter_modes")。也就是说,实验模式只在"直接发射"场景下生效,手动改计数时以手动值为准。

支持协议与计数器模式对照

以下内容逐一列出五个支持协议的计数器模式,并给出源码中的实现依据。

1. Nice Flor-S

模式计数器行为适用场景
0(默认)标准模式,行为同普通遥控器,按全局滚动计数器乘数递增(默认 +1),溢出(> 0xFFFF)时归零大多数情况
1(floxi2r)序列0x0001 / 0xFFFE交替floxi2r 接收器
2(ox2)序列0x0000 / 0x0001交替ox2 接收器

源码实现位于 nice_flor_s.c:模式 0 走标准递增路径(叠加furi_hal_subghz_get_rolling_counter_mult(),超过 0xFFFF 归零);模式 1 在0xFFFE0x0001之间切换;模式 2 在0x00000x0001之间切换。实际发射数据由((uint64_t)serial << 16) | cnt拼接序列号与计数器后,再经subghz_protocol_nice_flor_s_encrypt加密(该协议依赖nice_flor_srainbow table 密钥文件,见 subghz_keystore.c 的读取逻辑)。

2. Came Atomo

模式计数器行为适用场景
0(默认)标准模式,按全局乘数递增(默认 +1),溢出归零大多数情况
1序列0x0000 / 0x0001 / 0xFFFE / 0xFFFF外接 CAME RE432 接收器,可能兼容其他接收器
2序列0x807B / 0x807C / 0x007B / 0x007C外接 CAME RE432 接收器,可能兼容其他接收器
3计数器冻结(不递增)特殊场景

源码实现见 came_atomo.c。模式 1 的四个值按0x0000→0x0001→0xFFFE→0xFFFF→0x0000循环;模式 2 按0x807B→0x807C→0x007B→0x007C→0x807B循环;模式 3 直接不修改cnt。Came Atomo 的报文使用 Manchester 编码(manchester_encoder/manchester_decoder),并且每次发射会附带一个从 0 到 0x7F 的按键保持周期计数器cnt_2(源码中通过atomo_encrypt/atomo_decrypt加解密)。

3. Alutech AT-4N

模式计数器行为适用场景
0(默认)标准模式,按全局乘数递增(默认 +1),溢出归零大多数情况
1序列0x0000 / 0x0001 / 0xFFFE / 0xFFFFMCSW-3.3M 接收器
2序列0x0000 / 0x0001 / 0x0002 / 0x0003 / 0x0004 / 0x0005循环其他接收板

源码实现见 alutech_at_4n.c:模式 1 同 Came Atomo 模式 1 的四值循环;模式 2 从 0 递增到 5 后归零循环。Alutech AT-4N 报文同样使用 rainbow table 加密(subghz_protocol_alutech_at_4n_encrypt/decrypt),计数器字段为 16 位。

4. KeeLoq

KeeLoq 是模式最丰富的一个协议,源码见 keeloq.c。

模式计数器行为适用场景
0(默认)标准模式,按全局乘数递增(默认 +1),溢出归零大多数情况
1序列0x0000 / 0x0001 / 0xFFFE / 0xFFFF可能兼容部分系统(欢迎反馈)
2每次发射计数器+0x3333(十进制 13107)可能兼容 Doorhan,见于部分"万能遥控器"
3序列0x8006 / 0x8007 / 0x0006 / 0x0007可能兼容 Hormann EcoStar 等系统
4序列0x807B / 0x807C / 0x007B / 0x007C可能兼容 Nice Smilo 等系统
5序列0x0000 / 0xFFFF(0 与最大值 65535 交替)可能兼容部分系统(欢迎反馈)
6计数器冻结(不递增)特殊场景
7每次发送一组 7 个信号:当前计数器+0x3333共 5 次,然后回到原值 +1 再发 2 次可能兼容 Doorhan,见于部分"万能遥控器"

模式 7 的实现非常特殊:源码在 keeloq.c 中构造一组 7 个信号的时序——前 5 个信号用+0x3333递增(其中第 3 个信号计数器归零),随后 2 个信号分别使用原计数器与原值+1。文档特别提示:在 Flipper 上单击一次 Send 按钮即可完整发出整组信号,可能绕过接收器的计数器校验,但必须等待整组信号发送完成

5. V2 Phoenix(Phox)

模式计数器行为适用场景
0(默认)标准模式,按全局乘数递增(默认 +1),溢出归零大多数情况
1(类 ofex)序列0x0000 / 0x0001 / 0xFFFE / 0xFFFF已验证可用
2序列0x0000 / 0x0001 / 0x0002 / 0x0003 / 0x0004循环可能兼容(欢迎反馈)

源码实现见 phoenix_v2.c。模式 1 与前述四值循环一致;模式 2 从 0 递增到 4 后归零。V2 Phoenix 的计数器在发射前还会经过subghz_protocol_phoenix_v2_encrypt_counter加密后才拼入数据帧。

默认行为与协议兼容性

默认行为

  • 如果.sub文件中没有CounterMode字段,则默认使用普通遥控器模拟模式(计数器 +1);
  • 普通遥控器模拟是标准模式,适用于绝大多数场景,不会引入额外风险。

协议兼容性

  • 并非所有协议都支持全部模式编号(如 Nice Flor-S 只有 0/1/2,Came Atomo 只有 0~3);
  • 使用不支持的模式编号会导致意外行为。从源码结构看,各协议的模式分发均为if / else if / else链,最后一个else分支兜底,因此 FAQ 中说明"无效模式号将使用列表中的最后一个模式";
  • 使用任何模式前务必先测试你的配置。

故障排查

添加CounterMode后文件不工作,请按以下顺序排查:

  1. 检查语法CounterMode: X——注意冒号后要有空格;
  2. 核对模式号:确认该模式号对当前协议是合法的;
  3. 另外建议确认Protocol:字段与模式所属协议一致(例如 KeeLoq 的 Doorhan 模式还需要Manufacture: Doorhan字段配合,见下文示例)。

完整示例配置

示例 1:Nice Flor-S 使用模式 1(floxi2r 接收器)

Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: Nice FloR-S Bit: 52 Key: 01 23 45 67 89 AB CD CounterMode: 1

示例 2:KeeLoq 使用模式 2(+0x3333,Doorhan 类)

Filetype: Flipper SubGhz Key File Version: 1 Frequency: 433920000 Preset: FuriHalSubGhzPresetOok650Async Protocol: KeeLoq Bit: 64 Key: DE AD BE EF CA FE BA BE Manufacture: Doorhan CounterMode: 2

KeeLoq 协议支持按制造商(Manufacture)选择编码分支(源码中 keeloq.c 对 AN-Motors、HCS101 等制造商使用不同的 hop 构造方式),因此示例 2 中保留了Manufacture: Doorhan字段,供参考。

常见问题(FAQ)

Q:这些模式会损坏我的遥控器或接收器吗?A:可能会。具体取决于接收器——它可能导致你的原遥控器失步(desync)。请务必注意,不要对你不拥有访问权的设备做实验。

Q:我该用哪个模式?A:如果不确定,不要使用这些实验模式。默认模式 0 对大多数系统都足够。

Q:使用了无效的模式编号会发生什么?A:会使用该协议模式列表中的最后一个模式(源码的else兜底分支)。

Q:是否每个.sub文件都要加CounterModeA:不需要。只有需要非默认行为时才添加;不指定时自动使用模式 0。

与全局设置的关系:滚动计数器乘数

所有协议的模式 0(标准模式)都依赖全局设置中的滚动计数器乘数(rolling counter multiplier)。源码通过furi_hal_subghz_get_rolling_counter_mult()读取该值:

if((instance->generic.cnt + furi_hal_subghz_get_rolling_counter_mult()) > 0xFFFF) { instance->generic.cnt = 0; } else { instance->generic.cnt += furi_hal_subghz_get_rolling_counter_mult(); }
  • 默认乘数为+1:每次发射计数器加 1,等价于普通遥控器;
  • 溢出条件为计数器超过0xFFFF(16 位计数器上限,即 65535)时归零;
  • 当乘数被设置为特殊值-0x7FFFFFFF时,所有协议会进入OFEX(overflow experimental,溢出实验)模式:计数器按0x0001 → 0xFFFE交替跳跃(见 came_atomo.c 的 OFEX 分支),这也是文档中 V2 Phoenix "Mode 1 (ofex like)" 得名的由来——它与 OFEX 行为一致,但被固化成了独立的协议模式。

需要说明的是,全局乘数设置与CounterMode是两套独立的机制:乘数只影响模式 0 的递增步长,而实验模式通过固定序列或固定步长完全接管计数器变化逻辑。

小结

SubGHz 计数器实验模式是 Momentum Firmware 提供的高级发射控制能力:通过在.sub文件中添加CounterMode: X,可以针对 Nice Flor-S、Came Atomo、Alutech AT-4N、KeeLoq、V2 Phoenix 五种滚动码协议,将计数器递增规律切换为固定值序列、大幅跳跃(+0x3333)、冻结或整组信号连发等实验行为,目标是制造与原遥控器互不冲突的克隆信号。由于实验模式可能造成接收端失步,务必只在拥有访问权限、可重新对码的设备上测试,且优先使用默认模式 0。

【免费下载链接】Momentum-Firmware🐬 Feature-rich, stable and customizable Flipper Firmware项目地址: https://gitcode.com/GitHub_Trending/mo/Momentum-Firmware

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询