需要有关 USB 游戏鼠标的帮助

逆向工程 linux 串行通讯 USB
2021-06-29 22:54:35

我有一个中文 USB 游戏鼠标 ( 04d9:a070 ),它有 4 种颜色模式和 4 种亮度级别。我知道这个鼠标能够显示至少 5 种不同的颜色,所以它必须是 RGB LED(4 条腿)。该软件是我见过的最糟糕的软件,要更改颜色、亮度和模式非常困难,因此它可以正常工作,而不仅仅是关闭。现在我打算制作自己的控制软件(首先用于 Linux)。

我从 Bytepunk 的一个简单指南“逆向工程 USB 鼠标(2017 年 5 月 3 日更新)”开始(无法发布链接,但 Google 或 DuckDuckGo 应该可以找到该指南)

我已经嗅到了我需要的大部分东西。我在带有糟糕控制软件的 Windows 上使用 USBlyzer 并获得了一些十六进制字符串,并想出了如何更改十六进制字符串中的颜色、亮度和模式。我粘贴了我在这里发现的数据 (Pastebin)

Clicking turn on lights from the Windows control software

out: 07 07 01 00 00 00 00 00 <-- Is this a "Commands coming in call"?
out: 07 09 01 02 00 00 00 00 <-- 07 09 01 0X where X is the color
out: 07 0C 01 04 00 00 00 00 <-- 07 0Y 01 0Z where Y is the brightness and Z is the mode 
out: 07 13 04 00 00 00 00 00 <-- Is this a "Commands sent call"?

X - OFF: 0 RED: 1 BLUE: 2 GREEN: 3 PINK: 4
Y - LOW: B MED: 9 HIGH: C 
Z - STATIC: 1 SLOW PULSE: 2 MED PULSE: 3 FAST PULSE: 4

我的问题是,当我尝试向设备“写入”任何内容时,它只是挂起,并且出现“找不到 [Errno2] 实体”错误,需要重新插入鼠标才能使其再次工作。它不会“断开连接”,但会留lsusbdmesg.

我将修改后的 python 脚本粘贴到Pastebin

我还应用了自定义udev 规则

SUBSYSTEM=="usb", ATTR{idVendor}=="04d9", ATTR{idProduct}=="a070", GROUP:="plugdev", MODE="0666"

我是串行通信和逆向工程的新手,所以我不知道要搜索什么。我想我可以在评论中发布来自 USBlyzer 的图片和更多数据。这是我在这里的第一篇文章,所以我没有提供更多链接的声誉。

问候,桑泰利

1个回答

我对USB 的了解充其量是非常低的(即使我确实开发了一些简单的USB设备以谋生)所以阅读本文时有很大的偏见......

  1. 您的驱动程序类和配置必须与 USB(鼠标)设备匹配

    我不知道您的USB鼠标是如何编程的,但接口必须相同(CDC类可以有更多接口),如果不匹配,则USB将无法正常工作。

    所以你需要知道哪些管道被使用,哪些是输入和输出,如果它们使用批量或中断传输。

    我敢打赌,您的鼠标将成为仅使用中断传输HID类。但是,如果它是某种疯狂的多媒体人体工学多功能傻瓜,它甚至可能是CDC

  2. 数据传输

    假设您有HID,因此设备通过控制管道 0 和或中断管道(1,2...)进行通信。

    现在取决于鼠标固件,它可能需要特定顺序的读/写命令,否则固件将冻结或挂起直到超时。

    例如一些命令不返回任何数据,可以随时发送......

    某些命令在特定管道中返回数据,如果主机没有及时读回,固件可能会崩溃/冻结。

    另一个问题是鼠标可能是可配置的,并且需要一些代码/命令的初始化序列来确定鼠标的用途/规格/任何东西。同样,如果固件希望首先发送任何其他命令,则可以冻结您的鼠标。

    在这种情况下,一些固件也期望命令具有定时和发送太频繁或太少是错误的。

    您的嗅探数据没有考虑到这些。尝试嗅探其他管道(可能带有时间戳)并将所有日志记录为以下内容:

    完成后,您应该会看到设备发回的内容。查看哪个管道中有多少字节很重要。然后你可以更新你的脚本,在你发送命令后,将适当数量的字节读回主机,这样鼠标上的固件就不会冻结。