我从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