如何伪造不同的设备 ID 来实现 Linux 设备管理?

如何伪造不同的设备 ID 来实现 Linux 设备管理?

我有一个 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 转串行芯片。

相关内容