我有一个中文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] Entity not found”错误,需要重新插入鼠标才能使其再次工作。它不会“断开连接”,但会保留在lsusb中,并且在dmesg中不会显示任何特殊内容。规则

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

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

Santeri的问候,

#1 楼

我对USB的了解充其量是非常低的(即使我确实开发了一些简单的USB设备来谋生),因此请以重大偏见阅读本文档。类和配置必须匹配USB(鼠标)设备

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

因此,如果它们使用批量传输或中断传输,则需要知道使用了哪些管道以及输入和输出的管道。

我的选择是鼠标将是仅使用中断传输的HID类。但是,如果这是一种疯狂的,符合人体工程学的多媒体愚蠢功能,甚至可能是CDC。通过控制管道0和/或中断管道(1,2 ...)。

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

例如某些命令不返回任何数据并且可以随时发送...

某些命令返回特定管道中的数据,如果不被读取则返回

鼠标的另一个问题可能是可配置的,并请求一些初始化序列的代码/命令来确定鼠标的用途/规格/其他。再一次,如果固件期望首先发送其他命令会冻结鼠标。 br />您的嗅探数据没有考虑任何这些。尝试嗅探其他管道(可能带有时间戳),并将所有日志记录如下:


将应用程序放置在客户端和服务器之间完成后,您应该看到设备发回了什么。重要的是要查看在哪个管道中有多少个字节。然后,您可以更新脚本,并在发送命令后将适当数量的字节读回主机,以使鼠标上的固件不会冻结。



评论


1.几乎解决了我的问题。我的bmRequestType值错误。我不确定为什么,但是从USBlyzer获得了无效的值。这次我使用Wireshark并获得了正确的值(0x21)。现在,我可以控制LED和其他设置了。谢谢你的解释!

–user1475122
17年9月26日在15:42

@ user1475122很高兴能为您提供帮助。

– Spektre
17年9月26日在17:54