news 2026/10/16 2:11:40

OpenPuck RF嗅探器实战:puck_sniffer被动抓包+浏览器可视化分析无线协议

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenPuck RF嗅探器实战:puck_sniffer被动抓包+浏览器可视化分析无线协议

【免费下载链接】openpuck

Opensource firmware for NRF52840 Pro Micro that copycats the Steam Controller 2 Puck and adds an Xbox and Switch mode

项目地址:https://gitcode.com/gh_mirrors/op/openpuck
点击查看免费下载

OpenPuck RF Sniffer(puck_sniffer)是 OpenPuck 内置的一个 2.4 GHz被动式无线嗅探器:它只监听、绝不发射,因此不会干扰真实 Valve Steam Controller 2 Puck 与手柄的配对链路。它把嗅探到的每一帧数据包实时推送到浏览器可视化页面,让你零代码门槛地"看懂"这套无线协议 📡

为什么需要一个"被动"RF 嗅探器

OpenPuck 是一个跑在 nRF52840 Pro Micro 上的开源固件,用于复刻 Steam Controller 2 的无线接收器(puck),并额外提供 Xbox / Switch 等模式。它的核心难点之一是逆向还原puck 与手柄之间的 2.4 GHz 私有协议。

puck_sniffer模块就是为这个目标设计的抓包工具,位于 puck_sniffer/ 目录:

  • 被动监听:只接收不发射,绝不干扰正在配对的设备
  • 自动跟踪会话:真实 puck 会在公共信道上广播E1信标帧,其中携带会话地址与频道;嗅探器读到后自动调谐,双向收包
  • 学习并持久化绑定:把学会的会话参数写入 flash(/sniffbonds.bin,按ibex_uuid索引),下次开机自动"蹲守",无需手动操作
  • 浏览器实时可视化:通过 WebUSB 把帧流推送到网页,支持过滤、导出 JSON/文本

协议细节的完整描述见 docs/PROTOCOL.md,抓包器自身的说明见 puck_sniffer/README.md。

开始前的硬件清单

准备抓包只需三样东西:

  1. 第二块nRF52840 开发板(与烧录 OpenPuck 相同的 Pro Micro / Feather 均可)——注意:不是你的 OpenPuck 板子本身
  2. 真实的 Valve SC2 puck + 手柄,且已配对可用
  3. 支持 WebUSB 的浏览器:Chrome 或 Edge

💡 抓包时请把 OpenPuck 开发板拔掉,它自己也会广播信标,会"污染"公共信道 ch2 的接收。

一键烧录嗅探器固件

烧录命令与 OpenPuck 固件流程一致(固件源码:puck_sniffer/puck_sniffer.ino,复用同一套经过 CRC 验证的射频配置 puck_sniffer/radio.cpp):

arduino-cli compile -b adafruit:nrf52:feather52840 \ --build-property "build.extra_flags=-DNRF52840_XXAA {build.flags.usb}" \ --upload -p <PORT> puck_sniffer

烧录成功后,板子会以 USB 标识28DE:534E "OpenPuck Sniffer"枚举。如果端口不自动复位,和烧 OpenPuck 一样走手动 DFU(双击复位键)即可。

最快打开浏览器可视化页面

WebUSB 要求安全上下文,所以file://协议直接双击打开的sniffer.html是连不上设备的。本地起一个静态服务即可:

cd docs && python3 -m http.server

然后浏览器访问http://localhost:8000/sniffer.html(页面源码就在 docs/sniffer.html),点击Connect sniffer,选择OpenPuck Sniffer。

⚠️ Linux 用户如果连接失败,多半是 udev 权限问题,可按 docs/WEBUSB_LINUX.md 配置规则文件后重插设备。

连接成功后确认页面上rx计数在上涨,说明帧流已经到达浏览器 ✅

三步抓包:从 Lock 到 Power-cycle

这是整个流程的核心,顺序不能乱:

  1. 查询目标手柄的 ibex_uuid:用 pairtui/ 下的 USB 配对工具读取已连接槽位的ibex_uuid(例如EF7171B4)
  2. Lock:在页面lock ibex输入框填入该 uuid,点击Lock
    • 如果bond状态直接显示… camped,说明嗅探器已经"认识"这只手柄,直接跳到第 4 步
    • 否则状态为ACQUIRE(正在 ch2 上等待该槽位的E1信标)
  3. ● Start Cap开始录制,然后给手柄断电重开(长按电源约 2 秒关到再开)。一旦捕获到E1,嗅探器锁定会话、把 bond 写入 flash,bond统计显示1 learned · camped
  4. 之后每次抓包只需重连:会话已学习的情况下,页面自动进入CAPTURE (auto-camped on learned bond)。此时只要给手柄断电重开,从第一个包起C→P计数就开始爬升
  5. 晃动摇杆 / 触控板保持流量,在 Steam 里做你想抓的操作(调亮度、关机……),最后■ End Cap → Download

提示:手柄如果重新配对过(空中地址会变),点一下Forget bonds清空学习库,从下一个E1重新学习即可。

浏览器过滤栏:从海量输入帧里"捞针"

真实链路上 99% 的流量是例行输入——49 字节的0xF1输入应答帧和裸0xE3轮询。可视化页面提供了完整的过滤栏,抓完之后随时可以改条件重新渲染:

过滤器作用
hide input/polls一键丢弃 99% 的例行流量,只剩命令、特性应答、信标和异常帧
dir按方向过滤:P→C(puck→手柄,LED/关机/亮度命令走这里)或C→P(手柄→puck,输入+电量/遥测)
op精确匹配操作码,如f1、e3
len按帧长过滤,≠ 49 (non-input)是找电量应答和特性响应的关键条件
hex按载荷十六进制子串匹配,如9f、2d

抓电量的标准姿势:先勾选hide input/polls+ dir 选C→P,然后在 Steam 里打开手柄设置页让 Steam 主动轮询电量——这时会出现一条 len > 49 的C→P长帧(携带 type-04 TLV),抓下它即可 🎯

导出数据与状态栏速读

点击Download JSON或Download text,会把 Start Cap 到 End Cap 之间的完整记录导出为sniff-<时间戳>.json/.txt,供离线分析或提交参考。

页面顶部状态栏建议关注几个指标:

  • link:ACQUIRE(扫描中)还是CAPTURE(已锁定会话)
  • E1 advertises:从E1帧解析出的会话频道 / 地址(byte 9 = 频道,bytes 13–16 = base,byte 17 = prefix)
  • drops:设备端环形缓冲满导致的丢帧数,0表示无损
  • bond:已学习的 bond 数量与当前蹲守状态

遇到问题?两个快速排查点

  • 断电重开后C→P不涨:点Survey ch2,在表里看op e1的行,正常应能看到你手柄 uuid 的小端字节(EF7171B4→… b4 71 71 ef …)。如果只看到别的uuid,说明在重连的是 OpenPuck 或其它槽位,检查你的 OpenPuck 板子是否已拔掉
  • 只在 ch2 看到E1/E2,永远等不到0xF_应答:说明嗅探器没能蹲守到会话。从一条真实的E1帧里读出会话参数(base 4 字节、prefix、channel),填入pin session输入框(格式b0 b1 b2 b3 pfx ch)点Pin强制锁定,可完全绕开自动捕获——这是真实 puck 的E1偏移与 OpenPuck 不一致时最可靠的路径

总结

puck_sniffer用一块廉价的 nRF52840 板子 + 一个浏览器页面,就把"逆向私有 2.4 GHz 协议"这件听起来高深的事,变成了烧固件 → 锁 uuid → 断电重开手柄 → 导出 JSON的四步操作。被动设计让它可以安全地旁路监听真实设备,学习式 bond 蹲守机制让重复抓包变得几乎零操作,而浏览器端的方向 / 操作码 / 帧长 / hex 过滤则是从输入洪泛中定位关键帧的利器。相关源码与文档:puck_sniffer/README.md、docs/sniffer.html、docs/PROTOCOL.md。

【免费下载链接】openpuck

Opensource firmware for NRF52840 Pro Micro that copycats the Steam Controller 2 Puck and adds an Xbox and Switch mode

项目地址:https://gitcode.com/gh_mirrors/op/openpuck
点击查看免费下载

相关推荐

上一篇:为什么 ts-reset 拒绝把 Boolean() 改造成类型谓词:false 分支过度窄化与单侧类型谓词的等待
下一篇:Joplin 插件开发实战:基于官方模板理解插件入口、manifest 与 JPL 打包构建全流程

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 2:10:30

Mac安装傲游云浏览器v4.1.2.1000:从Gatekeeper到云同步的避坑指南

简介&#xff1a;傲游云浏览器&#xff08;Maxthon&#xff09;Mac版是一款网页浏览工具&#xff0c;版本为v4.1.2.1000&#xff0c;面向需要在Mac OS与Windows、Android、iOS等多设备间同步浏览数据且希望获得一致浏览体验的Mac用户。该版本针对Mac OS操作习惯进行优化&#x…

作者头像 李华
网站建设 2026/10/16 2:10:18

LeetCode 11 盛最多水的容器:双指针 O(n) 题解与多语言实现

示例工程 【免费下载链接】leetcode &#x1f525;LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer&#xff08;第 2 版&#xff09;》、《程序员面试金典&#xff08;第 6 版&#xff09;》题解 项目地址&#xff1a; https://git…

作者头像 李华
网站建设 2026/10/16 2:09:18

Agentic RAG实战:从传统检索到可编排智能问答

1. 项目概述&#xff1a;从"检索问答"到"可编排的智能检索"先说结论&#xff1a;Agentic RAG Pipeline不是把一个大模型包一层检索工具那么简单&#xff0c;它是一个让模型像人一样去"查资料、筛资料、质疑资料"的完整流程系统。这两年只要做知识…

作者头像 李华