关于DIY鼠标中间人的一些笔记(AI问答)
不了解硬件逆向,记一下
一、PC是怎么认识一个鼠标的
当把一个鼠标插到电脑上时,电脑并不是靠"看"或者"猜"来知道这是个鼠标。它俩之间有一整套固定的"自我介绍"流程,就像陌生人见面先递名片。
鼠标插上后,电脑会主动发一个请求,意思大概是"你是谁,你是什么东西"。这时候鼠标就会回传一串数据,这串数据里最重要的两个东西就是VID和PID。
VID是厂商识别码,这个是全球唯一的,由USB协议官方组织分配给各个硬件厂家。比如罗技有自己的VID,微软有自己的VID,ST也有自己的VID。这个是要花钱向USB-IF申请并且每年交年费的,不是随便就能拿到的。
PID是产品识别码,这个由厂商自己定义,用来区分自家不同型号的产品。同样是罗技,它的游戏鼠标和办公鼠标会用不同的PID来区分。
电脑拿到VID和PID之后,就会在自己系统里查找匹配的驱动程序。如果是罗技的VID,系统可能就会去加载罗技的官方驱动。如果是通用的VID,系统就加载微软自带的通用HID驱动。
所以电脑认识一个鼠标,本质上就是靠这组VID加PID来识别身份的。
二、VID和PID的来源,以及为什么不能随便伪装
关于VID和PID的来源,正规量产的硬件厂商必须向USB-IF购买属于自己的VID,这个不是一次性买断的,每年都要交维持费。然后厂商再给自己的每一款产品分配不同的PID。
这就是为什么大厂的所有产品都用自己的专属VID,比如罗技是0x046D,微软是0x045E。
那为什么不能自己随便填一个,比如直接填罗技的VID和PID来伪装成罗技鼠标呢?这里有几个层面的原因。
第一个是法律层面。罗技的VID是它的商业标识,未经授权擅自使用属于侵权行为。就算只是自己测试不商用,严格来说也是不被允许的。
第二个是技术层面的兼容性问题。如果只是把VID和PID填成罗技的,但鼠标本身的功能和罗技的完全不一样,电脑尝试加载罗技的官方驱动时,驱动会发现这个"罗技鼠标"的行为异常,可能直接导致设备无法正常工作,连基本的点击都用不了。
第三个是更深层的问题。如果是无线鼠标,罗技的接收器本身是一个封闭系统,它只认符合罗技私有协议和加密标准的设备。即使你的设备在USB枚举时成功冒充了罗技鼠标,接收器在尝试更深入的握手验证时,也会因为通不过加密校验而拒绝工作。所以伪装不是简单改两个数字就能糊弄过去的。
总的来说,在DIY项目里,最稳妥的做法是使用ST官方或者ESP官方那种通用的VID,或者使用开源项目里常见的测试VID,让电脑把它识别成一个"通用HID鼠标"就行了,完全满足功能需求,不需要冒法律和技术兼容性的风险去冒充品牌。
三、USB私有协议逆向难度
为什么不能去逆向罗技那种品牌的私有USB协议呢?因为难度和常规App逆向完全不在一个量级上,可以说比逆向一个手机App难得多得多。
先看常规App逆向,比如逆向一个Android或者Windows程序。逆向的对象是软件代码,这些代码虽然被编译成了机器码,但整体是有结构的。有入口函数,有API调用,有时甚至还会残留一些字符串提示。而且有大量成熟的工具可以用,比如IDA Pro、Frida这些,还能下断点调试,可以动态观察程序在内存里的行为。
但USB私有协议就完全是另一回事了。你要面对的不是代码,而是一大堆纯数据流,就是一堆十六进制数字。你连这堆数据怎么切分都不知道,哪里是包头哪里是有效数据完全靠猜。而且你没法调试,只能被动地抓包、对比,通过大量的控制变量实验去推测每个字节的含义。比如按住左键数据变了,松开又变了,反复试才能猜出哪个位代表左键状态,这个过程极其枯燥耗时。
更要命的是,品牌厂家为了防止别人逆向,通常会对USB数据做加密或者压缩。你抓到的东西本身就是密文,没有密钥的话根本无从分析。拿罗技来说,它的无线通信用的是符合FIPS标准的高强度加密,配对过程还涉及动态密钥交换和双向握手验证。安全研究人员曾经花了数年时间才成功逆向罗技早期Unifying接收器的部分协议,这不是个人爱好者能完成的任务。
简单说,逆向USB私有协议就像给你一本用密码写的天书,没有语法,没有标点,没有任何提示,你只能通过反复试验去猜每个字的意思,而这本书每页的内容还可能是加密的。所以这条路,基本走不通。
四、当前方案的详细原理
方案的核心思路很简单:不去碰加密的那部分,只在解密之后的数据上做手脚。所以整个链路是这样的。
无线鼠标和它的接收器之间用2.4G无线通信,这部分是加密的私有协议,ESP32完全接触不到,也根本不需要关心这部分。
接收器收到无线信号后,在内部完成解密,把鼠标的移动和按键动作还原成标准的USB数据,然后通过USB线发给电脑。
ESP32就接在接收器和电脑之间。它从接收器那端读到的是解密后的明文数据,比如"X轴移动了+5"这种格式。这些数据是标准的、公开的USB HID报告格式,每个字节代表什么意思都是公开的,所以ESP32完全可以读懂。
ESP32读到这些明文数据后,在内部进行修改,比如把"+5"改成"+50",或者把左键映射成右键,或者做其他任何修改。
最后,ESP32把自己模拟成一个标准的USB鼠标设备,把修改后的数据发给电脑。电脑收到的是修改过的鼠标信号,但电脑完全不知道中间有ESP32动过手脚,它只知道自己收到了一个鼠标发来的数据。
需要特别说明的是,ESP32读到的数据从来就不是加密的无线信号,而是接收器已经解密好的明文USB报告。所以ESP32不需要破解任何加密,它只需要读懂标准USB HID协议就行了,而这个协议是公开的文档,谁都可以查。
这个方案的巧妙之处就在于"偷懒":不挑战加密,只修改解密后的结果。这也是市面上那些KMBox、MAKCU等成品盒子共同的核心设计思路。

浙公网安备 33010602011771号