![如何伪造不同的设备 ID 来实现 Linux 设备管理?](https://linux22.com/image/229625/%E5%A6%82%E4%BD%95%E4%BC%AA%E9%80%A0%E4%B8%8D%E5%90%8C%E7%9A%84%E8%AE%BE%E5%A4%87%20ID%20%E6%9D%A5%E5%AE%9E%E7%8E%B0%20Linux%20%E8%AE%BE%E5%A4%87%E7%AE%A1%E7%90%86%EF%BC%9F.png)
我有一个 WWAN 设备,我通过使用 AT 命令覆盖供应商和产品 ID(VID 和 PID)愚蠢地变砖了。我这样做是希望绕过笔记本电脑白名单功能,该功能会阻止笔记本电脑在插入该卡时启动。
此时,设备正在启动,并正确地伪装成不同的 USB 设备,但是 Linux 将不再为其加载正确的驱动程序,并且无论出于何种目的,它都无法访问。我无法再获取串行端口来恢复 VID/PID 值。
问题:有没有办法告诉 Linux,当它看到设备 2cb7:0007 在内部将其 id 替换为 1199:9079,或者至少强制加载一些驱动程序,这将允许我获得它的串行接口,以便我可以恢复身份吗?也许我可以使用其他操作系统来做到这一点?
答案1
您可以通过以下命令查看将为供应商:产品 ID 1199:9079 的 USB 设备加载的模块:
sudo modprobe -c | grep usb:v1199p9079
结果将类似于:
alias usb:v1199p9079d*dc*dsc*dp*ic*isc*ip*in* qcserial
alias usb:v1199p9079d*dc*dsc*dp*ic*isc*ip*in08* qmi_wwan
alias usb:v1199p9079d*dc*dsc*dp*ic*isc*ip*in0A* qmi_wwan
表示对于接口号 8 和 10(十六进制为 0xA),模块将为qmi_wwan
,并且qcserial
将控制该设备的任何其他接口。
大多数 Linux USB 串行驱动程序都有一种方法告诉驱动程序尝试接受它不知道的设备。
在这种情况下,您应该首先将rmmod
通常为设备 2cb7:0007 加载的任何驱动程序列入黑名单(如果已加载)(如果存在此类驱动程序)。然后使用 手动加载模块sudo modprobe qcserial
,并将设备的当前 ID 写入/sys/bus/usb-serial/drivers/qcserial/new_id
,如下所示:
echo "2cb7 0007" | sudo tee /sys/bus/usb-serial/drivers/qcserial/new_id >/dev/null
因为您只是更改了 ID 值,而没有对设备的实际行为进行任何更改,所以驱动程序应该能够像往常一样控制设备。
这也是处理具有自定义供应商/产品 ID 的内置 OEM USB 转串口转换器芯片的设备的方法:一旦您确定了可以处理所使用的实际芯片的驱动程序,您就可以使用此机制来即使 Linux 串行驱动程序开发人员尚不知道该特定的自定义供应商/产品 ID 对,也允许驱动程序声明具有该供应商/产品 ID 对的设备。当然,在这种情况下,向相应串行驱动程序的维护人员发送描述新 ID 的电子邮件会很有帮助,以便未来的内核版本能够自动识别此类定制的 OEM USB 转串行芯片。