通过HID++协议探索罗技鼠标寄存器中的数据存储
罗技MX Vertical鼠标使用闪存在不同设备间保存DPI设置。这为将其转变为2字节数据存储设备提供了可能。一款基于Rust的工具通过构建在USB HID之上的HID++ 2.0协议,实现了枚举33个设备属性。
该协议基于属性表工作:一个稳定的属性ID(例如0x2201)与鼠标型号索引(例如0x12)相关联。请求以数据包形式构成:报告ID、设备索引、属性索引、功能ID和参数(最多3字节)。响应采用类似格式。
大多数属性未记录文档。有潜力的属性包括TemplateBytesNVS(0x1eb0)和PersistentRemappableAction(0x1c00),但它们要么不响应请求,要么被macOS的IOHIDManager阻止。后者会静默丢弃长报告而不报错,需要通过IOKit进行变通处理。
分析寄存器并寻找存储空间
设备名称寄存器接受写入但忽略内容,始终返回“MX Vertical”。DPI寄存器(u16)被证明是功能性的:它接受任何值而不进行验证。写入0x6869在单次会话中切换计算机时能保持。
当鼠标关闭/开启时,该值会重置为默认值。写入仅影响活动DPI,不改变默认值。
测试其他寄存器(0x1e、0x1f、0x18xx)未发现持久存储。默认DPI可能存储在固件的封闭部分,或仅能通过罗技专有工具访问。
会话存储的关键特性:
- 仅在鼠标通电时有效。
- 跨计算机:移动Unifying接收器可保留数据。
- 容量:严格2字节(
u16)。 - 无验证:接受0到65535之间的任意值。
HID++逆向工程的经验教训
调查揭示了特性表与特性索引之间的差异。罗技的IFeatureSet反向查找功能已损坏。文档仅涵盖一半属性;其余需通过实验探索。
macOS的IOHIDManager会静默阻止非标准报告。写入PersistentRemappableAction需要通知或底层访问权限。
Rust方法的优势:
- 无需依赖罗技SDK即可完整转储属性。
- 支持所有配备Unifying接收器的鼠标。
- 批量交换便于调试:实时请求/响应。
目标——持久存储——虽未实现,但获得了关于协议和操作系统行为的宝贵知识。
核心要点
- HID++ 2.0使用与设备型号绑定的动态属性索引。
- DPI寄存器是唯一可访问的2字节会话存储空间,且无验证。
- macOS通过IOHIDManager阻止长HID报告;需通过IOKit变通解决。
- MX Vertical拥有33个属性,其中一半未记录文档。
- 该工具代码适用于所有罗技Unifying鼠标。
— Editorial Team
暂无评论。