FEATURED · 精选文章

Flipper Zero 上的 nRF24L01+ 嗅探扫描器:Nrf24_Scanner 源码解析与实战使用指南

发布时间 / 2026/9/14 15:16:43
来源 / 创域科博编辑部
栏目 / 资讯中心
Flipper Zero 上的 nRF24L01+ 嗅探扫描器:Nrf24_Scanner 源码解析与实战使用指南 Flipper Zero 上的 nRF24L01 嗅探扫描器Nrf24_Scanner 源码解析与实战使用指南【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/FlipperNrf24_ScannerNrf24_Scanner.fap是运行在 Flipper Zero 上的 nRF24L01 2.4GHz 无线电模块嗅探与扫描工具它可以在 sniff嗅探模式下以 RAW 格式捕获任意地址的 Enhanced ShockBurst 数据包也可以按照配置文件中给定的地址列表进行定向 scan扫描还支持数据包重放resend与 CRC 校验解码。本文以仓库 Applications/Official/source-OLDER/xMasterX/nrf24scan/README.md 为骨架结合 nrf24scan.c 与 nrf24 驱动库源码完整讲解它的功能模式、设置文件格式、按键操作、接线方式与底层实现原理帮助你在拿到 .fap 文件后快速上手并理解它是如何在 Flipper Zero 上裸听整个 2.4GHz 频段无线电信号的。1. 项目概览这是什么能做什么该应用是一个面向 Flipper Zero 的 nRF24L01 驱动与嗅探工具。nRF24L01 是 Nordic Semiconductor 出品的一类非常流行的 2.4GHz 无线收发芯片大量用于无线鼠标键盘、遥控器、无人机遥控、私有无线协议设备等场景。通过外接一个 nRF24L01 模块Flipper Zero 就能对这类 2.4GHz 信号进行监听与重放。从 application.fam 可以看到它的应用元数据应用 ID 为Nrf24_Scanner入口函数为nrf24scan_app属于外部应用apptypeFlipperAppType.EXTERNAL分类归入GPIO_Extra并以内置私有库fap_private_libs的方式把nrf24.c驱动一起编译成最终的Nrf24_Scanner.fap。仓库的 Distr/Nrf24_Scanner.fap 中已附带可直接安装的编译产物。工具的核心能力可以归纳为Sniff 嗅探不指定目标地址捕捉所有带正确前导码preamble与 CRC 的有效 RAW 数据包Scan 扫描按设置文件中给定的 1~6 个管道地址pipe address定向接收 ESB/DPL 数据包地址发现统计出现两次及以上的唯一地址供后续针对性扫描数据回放在日志列表中选中任意已捕获数据包按下 OK 即可重发resendPCF 与 CRC 解码在查看模式下解码 Enhanced ShockBurst 的 Packet Control Field并逐位扫描定位 CRC 字节。2. 硬件接线与模块供电应用通过 Flipper Zero 的外部 SPI 总线furi_hal_spi_bus_handle_external驱动 nRF24L01其中 CE 引脚固定映射到外部引脚gpio_ext_pb2见 nrf24.h 中nrf24_CE_PIN与nrf24_HANDLE的宏定义。具体接线方式在 README.md 中有明确说明Flipper Zero 引脚nRF24L01 引脚信号2 / A7MOSI / 6SPI 主出从入3 / A6MISO / 7SPI 主入从出4 / A4CSN / 4片选低有效5 / B3SCK / 5SPI 时钟6 / B2CE / 3片使能收发切换8 / GNDGND / 1地9 / 3V3VCC / 23.3V 供电—IRQ / 8悬空不接该接线图最初来自 NoComp/Frog 的整理README 中同时还给出了 UberGuidoZ 整理的同一套接法。需要注意的是IRQ 引脚不需要连接代码中也没有使用中断方式而是通过轮询 STATUS 寄存器RX_DR位来取包见 nrf24scan.c 中对nrf24_rxpacket的调用。供电方面如果模块工作不稳定建议在 VCC 与 GND 之间并联电容3.3µF 到 10µF 的电解电容用于应对慢速频率变化再并联一颗 0.1µF 的陶瓷电容应对高频开关尖峰。若只做简单的 Mousejack 攻击类操作单独一颗 10µF 电容通常就够了。接线时务必注意电容正负极方向负极接 GND。3. 安装与运行方式把 Nrf24_Scanner.fap 复制到 SD 卡的apps/GPIO_Extra或自定义应用目录下按上述接线连接好 nRF24L01 模块后即可在 Flipper Zero 的应用菜单中找到[NRF24] Scanner并启动。从源码看应用启动时会自动创建ext/nrf24scan目录SCAN_APP_PATH_FOLDER见 nrf24scan.c并尝试自动加载该目录下的sniff.txt设置文件若文件不存在则回退到默认嗅探配置默认地址00 55、CRC 2 字节。也就是说你不需要在 SD 卡上预先放置任何文件插上模块直接运行即可进入 sniff 模式配置文件只是用来精细定制扫描目标。4. 两种工作模式Sniff 与 Scan应用核心的状态机定义在 nrf24scan.cwhat_doing0 设置界面1 查看日志列表2 查看地址/解码视图what_to_do0 仅查看view1 嗅探view sniff2 扫描view read3 按选中地址定向读取view read selected addr。4.1 Sniff 模式默认启动后默认进入嗅探模式捕获所有带有效前导码和 CRC 的 RAW 包。由于是 RAW 格式读取负载长度最大为 23 字节更长的数据包无法被捕获这个限制来自 nRF24L01 自身 FIFO 在 promiscuous 模式下的行为。设置里可以指定最小负载长度Min Payl用于过滤掉过短的碎片。嗅探时应用将芯片配置为近似混杂模式关闭自动应答、关闭动态负载、掩蔽全部中断并关闭 CRC见 nrf24scan.c 中对REG_CONFIG、REG_EN_AA、REG_FEATURE的写入。捕获到数据后应用会对数据包做逐位左移bit-shift扫描并反复校验 CRCnrf24scan.c这能大幅提高抓到有效包的几率但代价是垃圾包的数量也会明显增加——这是因为无法精确定位包边界只能靠 CRC 命中来判定。整个逐位滑动过程的计算量由calc_crc承担它会按 8 位 CRC多项式0x07或 16 位 CRC多项式0x1021增量计算校验值。在嗅探过程中所有出现两次及以上的唯一地址会被统计进 Found 1 列表上限MAX_FOUND_RECORDS 70 条每个地址记录addr_size、地址字节与出现次数total见 nrf24scan.c。嗅探结束后可以切换到按这些发现地址扫描或单独扫描某个数据包对应的地址甚至可以扫描一组仅最低有效字节LSB不同的地址族pipe 0~5。4.2 Scan 模式扫描模式就是按设置文件中给定的 MAC 地址最多 6 个 pipe与包类型ESB/DPL定向读取数据包。在prepare_nrf24中地址数量决定启用哪些接收管道addr_count 1时启用 RX_P12 时启用 RX_P2以此类推并通过REG_EN_RXADDR一次性使能nrf24scan.c。注意 nRF24L01 的硬件特性P2~P5 的地址只有 1 个字节是独立可配的其余高位字节与 P1 相同这正是设置文件中 P2~P5 只写 1 字节 LSB 的原因。切换 sniff/scan 只需在设置界面把光标移到 Start sniff / Start scan (pipes: N) 一栏用左右方向键在what_to_do各取值间循环即可nrf24scan.c。4.3 通道轮换设置项 Next Ch time 控制自动扫频设为一个正数秒后应用会周期性把通道号 1并在超过 125 时回绕到 0MAX_CHANNEL 125见 nrf24scan.c。该逻辑在事件循环中通过furi_get_tick()与start_time的时间差触发重新start_scanning()nrf24scan.c。若设为 0 则关闭自动轮换锁定在固定通道。5. 设置文件格式详解设置文件默认名为addresses.txtREADME 中的示例写为 addr.txt以源码实现为准存放于 SD 卡ext/nrf24scan/目录。程序启动时会优先尝试加载sniff.txt嗅探专用设置启动后也可以在设置界面通过 Load 菜单用文件浏览器选择其他.txt文件加载。文件为纯文本、每行一个参数#开头的行会被跳过。格式如下与源码 nrf24scan.c 中的注释定义一致Rate: 0/1/2 # 速率Mbps0 250Kbps1 1Mbps2 2Mbps Ch: 0..125 # 默认通道号 ESB: 0/1 # 1 Enhanced ShockBurst DPL: 0/1 # 1 动态负载长度Dynamic Payload Length CRC: 0/1/2 # CRC 长度字节0 关闭 Payload: 1..32 # 负载字节数在 sniff 模式下表示最小负载长度 P0: AABBCCDDEE # 管道 0 地址十六进制最多 5 字节LSB 在后 P1: AABBCCDDEE # 管道 1 地址十六进制最多 5 字节LSB 在后 P2: LL # 管道 2 地址仅 1 字节 LSB高位与 P1 相同 P3: LL # 管道 3 地址仅 1 字节 LSB P4: LL # 管道 4 地址仅 1 字节 LSB P5: LL # 管道 5 地址仅 1 字节 LSB要点说明地址字节序为 LSB lastMSB first即十六进制串按从高位到低位的顺序书写管道 2~5 只写 1 字节因为 nRF24L01 硬件规定它们复用 P1 的高位地址地址长度由 P0 推导ConvertHexToArray根据 P0 行实际解析出的字节数设置addr_len2~5 字节其余管道以同一长度解释nrf24scan.c其余设置通道、速率、CRC 等都可以在界面上交互式调整长按 OK 可将当前配置保存回addresses.txt若文件含SNIFF关键字则整份文件被当作嗅探配置加载sniff_loaded 1此时Payload行解释为最小负载长度P0/P1 最多解析 3 字节嗅探用地址前缀。5.1 仓库自带的示例文件Distr/nrf24scan/addresses.txt 演示了多管道配置Rate: 1 Ch: 2 ESB: 1 DPL: 0 CRC: 2 Payload: 4 P0: C8C8C0 P1: C8C8C1 P2: C2 P3: C3 P4: E5这是一份针对以C8 C8为公共前缀的地址族进行扫描的配置P0 为C8C8C0P1 为C8C8C1P2~P4 分别只给出 LSBC2、C3、E5组合成C8C8C2、C8C8C3、C8C8E5等 5 个监听管道。地址长度由 P0 推导为 3 字节。Distr/nrf24scan/addr-WCO1.txt 是单地址示例通道 120、1Mbps、ESBDPL、CRC 2 字节、负载 4 字节目标地址C8C8E5。Distr/nrf24scan/sniff.txt 是嗅探配置示例SNIFF ESB: 1 CRC: 2 P0: 00AA P1: 0055包含SNIFF关键字定义了嗅探地址前缀00AA/0055ESB 开启、CRC 2 字节。5.2 日志文件与缓冲区接收到的数据包保存在内存环形缓冲中MAX_LOG_RECORDS 200 条每条LOG_REC_SIZE 34 字节。设置项Log控制自动落盘方式nrf24scan.cNo不自动保存Yes缓冲区满 99 条时写入一个新文件log.txt已存在则自动编号为log-01.txt、log-02.txt…最多到 99见write_to_log_file的循环命名逻辑nrf24scan.cAppend追加到上一次的日志文件末尾Clear仅清空缓冲区不保存。日志文件每行是一串十六进制字节。每行前两个字节是元数据第一个字节高位 0x80 表示 RAW 嗅探包低 7 位为通道号第二个字节的高 5 位为负载长度0 表示 32低 3 位在非 RAW 模式下为管道号pipe 0~5RAW 模式下低 2 位表示地址长度减 2、bit2 表示是否 ESB详见 nrf24scan.c 的注释。长按 OK 也可以随时手动把当前缓冲区写入文件。6. 屏幕界面与按键操作6.1 设置主界面6 行菜单启动后默认显示设置界面共 6 个菜单项menu_selected_max 5枚举见 nrf24scan.c上下方向键移动光标菜单项左右键调整短按 OK长按 OKLoad/Save 文件切换 Save/Load 状态保存设置 / 打开文件浏览器加载—Ch±1长按重复时 ±10越界回绕切换 ESB / DPL / 关闭切换 AA自动应答开关Rate / Min Payl / Payload调整速率或负载循环切换速率 0/1/2—Next Ch time±1 秒重复时 ±10循环切换 CRC 0/1/2—Log循环 No → Yes → Append → Clear—手动写盘并清空缓冲Start sniff/scan/view循环 what_to_do 0~3开始嗅探/扫描进入日志视图—其中Ch通道号 0~125Rate250Kbps / 1Mbps / 2MbpsNext Ch time自动跳频间隔秒数off 表示关闭Log日志自动保存模式Start sniff / Start scan启动对应模式。若配置有误例如 nRF24 读写校验失败界面会显示 nRF24L01 r/w ERROR!NRF_ERROR标志由地址回读比对触发见 nrf24scan.c。在 Ch 菜单项上长按 OK 可切换 AAAuto Ack显示与划掉状态表示是否禁用自动应答。当 ESB 开启时芯片会自动发送 ACK 确认帧——这意味着我们自己的接收器也会尝试应答嗅探时可能造成冲突必要时建议关闭。6.2 日志列表视图开始扫描/嗅探后进入日志视图上/下键翻页浏览记录每屏 8 条左右键横向滚动查看超出屏幕宽度的数据每条记录行首有索引号当前选中行以标记发送过的包以*成功或!失败标记第一行显示当前模式Sniff/View/Read、通道号与已捕获包数量短按 OK进入地址/解码视图长按 OK重发resend当前选中的数据包。发送结果通过 LED 反馈蓝色闪烁表示发送成功红色闪烁表示失败nrf24scan.c。6.3 地址与解码视图在日志列表中短按 OK 后进入解码视图列表区显示所有被发现地址Found 1及出现次数或在 sniff 模式下显示嗅探地址前缀Sniff prefix底部显示选中包的通道、长度与 RAW/ESB/DPL 标记左键切换 PCF 解码开关view_log_decode_PCF右键循环切换 CRC 解码长度 0 / 1 / 2 字节view_log_decode_CRC解码要求ESB 选项关闭针对非 ESB 包做 CRC 定位扫描。6.4 PCF 与 CRC 解码输出含义开启 PCF 解码后每条记录会额外显示解析出的字段pipe 号数据来源管道 0~5负载长度十六进制表示若为固定长度包则显示33即 0x33表示负载长度非动态PID NO_ACK2 位 PID数据包标识左移 1 位加上 1 位 NO_ACK 标志。开启 CRC 解码后应用会在整包数据中滑动计算 CRC-8多项式 0x07或 CRC-16多项式 0x1021并定位匹配位置匹配到的 CRC 字节会在屏幕上加下划线标出同时该记录行号的冒号:会变成表示 CRC 校验已通过见 nrf24scan.c 的绘制逻辑。7. 用 Python 离线验证 ESB 包解码仓库在 nrf24_packet_decoder.py 中提供了一个独立的 Python 示例用于演示 nRF24L01 Enhanced ShockBurst 数据包的解码流程可以直接在 PC 上运行python3 nrf24_packet_decoder.py脚本内置了若干组示例比特流packets元组输出每个包的十六进制、前导码、地址、负载长度、PID、NO_ACK、CRC 及校验结果CRC valid / mismatch。其核心逻辑与固件中的校验算法一致地址长度通过统计 8 位字段数量推断出现 6 位字段PCF即判定为 ESB 包否则为非 ESB 包parse_packetCRC-8 使用多项式0x107等价于固件中的0x07CRC-16 使用0x11021等价于固件中的0x1021初始值分别为0xFF/0xFFFFESB 包的 PCF 为 9 位6 位负载长度 2 位 PID 1 位 NO_ACK。这正好印证了固件 calc_crc 的 CRC 实现与check_packet的逐位校验逻辑由于嗅探模式下包边界未知固件对所有可能的地址长度3~5 字节与负载长度组合逐一尝试直到 CRC 命中。8. 源码级原理补充数据流向与关键调用链整个应用的数据流可以概括为nrf24scan_app入口初始化 GUI、存储、通知服务分配日志与地址统计缓冲区调用nrf24_init()完成 SPI 初始化nrf24scan.c用户按 OK 开始扫描 →start_scanning()→prepare_nrf24(false)按当前模式写入各寄存器速率、CRC、地址、EN_RXADDR、DYNPD 等→nrf24_set_rx_mode()进入接收主循环每 100ms 轮询事件队列同时调用nrf24_read_newpacket()读取数据包nrf24scan.c收到包后 LED 白色闪烁提示嗅探模式下check_packet对 RAW 数据做 CRC 滑动校验有效则存入log_arr缓冲同时更新found地址统计表用户长按 OK →nrf24_send_packet()根据记录元数据重建发送参数地址、负载长度、ESB/AA 开关调用nrf24_txpacket发出nrf24scan.c退出长按 Back时若启用了日志保存会把残留缓冲区写盘并调用nrf24_deinit()释放 SPI 总线。nrf24 驱动库 nrf24.c 与 nrf24.h 提供底层寄存器读写nrf24_write_reg/nrf24_read_reg、收发nrf24_rxpacket/nrf24_txpacket以及嗅探辅助函数nrf24_init_promisc_mode/nrf24_sniff_address/nrf24_find_channel这些函数同样被仓库中其他 nRF24 相关应用复用。从源码结构看nrf24_set_mac负责按 MSB first 顺序写入 2~5 字节地址而 P2~P5 的短地址写法则由扫描器应用自己组合P1 高位 LSB完成。9. 常见问题与使用建议模块无响应/读写错误检查 7 根连线是否与上文表格一一对应特别是 CSN、CE 是否接反确认模块为 3.3V 供电不要接 5V在 VCC/GND 间加 10µF 电容稳定供电。垃圾包过多这是嗅探模式逐位滑动的固有代价。可以通过提高 Min Payl最小负载长度过滤过短的无意义数据或改用定向 scan 模式按已知地址监听。抓不到某些设备确认目标设备的速率250K/1M/2M与 CRC 设置是否与捕获配置一致RAW 模式下负载超过 23 字节的包无法捕获。ESB 包的 ACK 冲突nRF24L01 在 ESB 下会自动回 ACK可能造成碰撞。对只读场景可关闭 ESBAA以获得更干净的 RAW 数据。配置文件不生效注意文件必须放在ext/nrf24scan/目录且每行格式严格为参数: 值P0 的字节数决定整个地址族的地址长度P0 缺失或过短不足 2 字节会导致加载失败错误码显示为 LOAD ERROR#x。10. 总结Nrf24_Scanner 把 nRF24L01 的近似混杂模式、CRC 滑动校验、多管道定向扫描与数据回放整合进了一个 128×64 屏幕即可完整操作的应用中。其价值在于不需要知道目标协议的任何细节只要它跑在 2.4GHz 的 nRF24 系列芯片上就能通过嗅探-发现地址-定向扫描-回放验证的完整链路快速还原并复现一条无线数据流。配合仓库自带的设置示例、Python 解码脚本与完整 C 源码无论是把玩无线鼠标键盘协议还是研究私有 2.4GHz 遥控协议它都是一套开箱即用且可以深度二次开发的参考实现。【免费下载链接】FlipperPlayground (and dump) of stuff I make or modify for the Flipper Zero项目地址: https://gitcode.com/GitHub_Trending/fl/Flipper创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻