一、USB基础知识
1.USB基础知识
先了解一下USB的大概知识:
1.先看一下维基百科的介绍:zh.wikipedia.org/wiki/USB
USB分组格式
USB的分组格式和早期的互联网分组格式非常相似,要了解USB连接原理就一定要先了解分组格式。
2.了解一下VID和PID
(摘自: www.cyantechnology.com/chinese/sup…
什么是 USB 厂商 ID号码和产品ID 号码?
所有的USB 期间有三个号码来识别,这立按重要性排序解释。
厂商 ID (VID)
这是一个分配给USB器件厂商的16-位编码.这一号码的分配由USB官方论坛控制,该论坛位于 www.usb.org。分配给赛恩的VID 是 0x1B45。
产品 ID (PID)
一旦厂商获得了一个16-位 VID,就可以为自己的应用产品任意分配一个16-位的 PID。通常会为每一个具体的应用产品分配一个独立的 PID 编号。
序列编号
每一个独立的设备可由一个唯一的序列号设别。序列号为可选用,但是推荐使用。它可以被主机用来在拥有相同VID和PID的设备之间具体识别各个设备。
要了解更多详情, 请访问USB官方网站 www.usb.org/developers/…
这里有USB org为厂商分配的ID:www.baiheee.com/Documents/0…
2.USB硬件信息获取
Linux中USB设备信息查看的命令有很多:1、lsusb命令 2、fdisk命令(root用户下) 3、lsblk命令 4、demsg命令 5、ls /dev/sd* 6、ls /dev/input 7、cat /proc/scsi/scsi 8、ls /proc/scsi/usb-storage/ 9、cat /proc/bus/input/devices....
我自己测试了以下三种方式来获取设备信息:
1.lsusb命令
首先,测试了lsusb命令来获取硬件信息:
- 选项 说明
- -v 告诉lsusb详细显示所示设备的详细信息。这包括设备当前速度的配置描述符。如果可用,类描述符将显示USB设备类,包括集线器、音频、HID、通信和芯片卡。
- -s [[bus]:][devnum] 显示指定总线和设备号的设备信息,总线和设备号用十进制标识。格式:lsusb –s 00:01
- -d [vendor]:[product] 显示指定厂商和产品编号的设备,用十六进制表示编号。格式:lsusb –d 8086:
- -D 显示指定设备文件的设备信息,例如:lsusb –D /proc/bus/usb/001/001。只有
- root用户才可以使用这个选项
- -t 以树状结构显示
- -V 指令版本信息
根据lsusb所提供命令可以查看当前USB信息:
//总线号 设备号 厂商ID:VID:PID
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
根据以上描述,可以查出序列号:
查找连接了多少个USB设备
查找链接的设备数量,可以使用下面命令查找:
结合使用lsusb命令和-D参数,可以输出特定设备的详细信息。下面实例查看s闪迪存储设备的详细信息:
注意: 但lsusb该方法在有些机器上,不使用root曲线,不能查看到SN号,原因可能为:lsusb可能会尝试将USB设备作为O_RDWR(读/写模式)打开,并且您的用户可能无权执行此操作(某些错误消息“无法打开设备,某些信息将丢失”应位于输出之间,如果是这样).以root身份启动lsusb也应该能够输出整个iSerial值.
2.demsg命令
Linux dmesg命令用于显示开机信息。
kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里
语法
dmesg [-cn][-s <缓冲区大小>]
参数说明:
-c 显示信息后,清除ring buffer中的内容。
-s<缓冲区大小> 预设置为8196,刚好等于ring buffer的大小。
-n 设置记录信息的层级。
- 列出加载到内核中的所有驱动
我们可以使用如‘more’。 ‘tail’, ‘less ’或者‘grep’文字处理工具来处理‘dmesg’命令的输出。由于dmesg日志的输出不适合在一页中完全显示,因此我们使用管道(pipe)将其输出送到more或者less命令单页显示。 - 列出所有被检测到的硬件
要显示所有被内核检测到的硬盘设备,你可以使用‘grep’命令搜索‘sda’关键词
dmesg这个命令可以获取,但是获取的缓存中你电脑查过的所有的信息,即使现在拔掉也会存在。
3.cat /sys/kernel/debug/usb/devices命令
注意:sudo cat /sys/kernel/debug/usb/devices 这个命令测试,发现它可以获取SN号,但无法获取较长字符,只能获取到100位,像SerialNumber只能拿到前100位字符。
3.USB硬件信息分析
其中基于debian系统,我们目前采用sudo cat /sys/kernel/debug/usb/devices这个命令来查看设备信息,首先查看四个都是闪迪优盘的设备信息,分别来自不同渠道,如下:
以下是三个不同型号的U盘信息:
由以上截图可以看出:
1.相同厂商的U盘PID,VID相同
2.不同U盘的SN号均不相同,且长短不一,也可以不进行写入
3.Manufacturer/Product 这两个字段即使相同厂商生产U盘,也不一定相同,故不具有参考价值
因为目前需要确定U盘内是否存有唯一标识信息,结合以上所获得信息,需考虑一下几点问题:
1.通过PID,VID是否就可以识别唯一的厂商及产品
2.PID,VID是否可修改,且市场唯一
3.USB中的SN号是否全球唯一,且不可更改
二、调研过程
1.PID,VID是否可以识别唯一厂商及产品
由上节USB基础知识,了解到USB器件厂商的VID是由USB官方论坛控制的,以下截图是该网站所提供的获取供应商ID的方法:
通过该网站可以了解到,若要获取供应商ID是需要通过成为会员及续费的方式获取的,若获取后,所分配到的VID将唯一。
然后通过查询供应商ID列表:
由以上截图可以看出:VID唯一,但PID不唯一
结论:可以通过PID及VID标识确定该产品厂商。
2.PID,VID是否可修改
VID和PID都是两个字节长,其中,供应商ID(VID)由供应商向USB执行论坛申请,每个供应商的VID是唯一的,PID由供应商自行决定,理论上来说,不同的产品、相同产品的不同型号、相同型号的不同设计的产品最好采用不同的PID,以便区别相同厂家的不同设备。
我们了解到VID和PID在通常情况下有两种存储方式,第一种是主控生产商的VID和PID,存储在主控的bootcode中;第二种是设备生产商的 VID和PID,该VID和PID存储在主控外部的非易失性存储设备中(EEPROM或Flash)的设备固件中。当USB设备连接主机时,如果固件中有 设备生产商的VID和PID,会将该VID和PID报告给主机,而忽略主控生产商的VID和PID。所以理论上一个USB存储设备的VID应该是设备生产商的VID,而不是主控生产商的VID,这两个VID应该是不同的(主控生产商自己生产的设备除外)。
根据调研,发现由于VID申请需要进行收费,很多USB设备生产商(山寨厂居多)为了方便,并不会向USB执行论坛申请自己的VID,而是 依然沿用主控生产商的VID或随便向产品写入VID和PID;同时,正规厂家只需要申请VID,PID由厂家自行确定,所以存在相同型号的产品,可能采用了不同的主控(商业需要,很正常),而他们的PID是一样的。基于上述原因,通过VID和PID就不能准确识别USB设备的主控型号。
结论:VID和PID不存在绝对唯一,有很多人为因素可以对VID和PID进行修改,存在相同风险。
3.SN号是否全球唯一,且不可更改
经过调研,网上具有可以修改U盘的SN号的方式:
1.先下载工具(chipgenius...)测出主控芯片类型
2.下载对应量产工具进行修改
通过查询可以找到多种主控芯片所对应的量产工具
1、生产U盘不需要什么授权,这种开放式的生产让U盘的序列号重复的可能性极大。比如一个不同U盘厂家使用相同主控,他们的U盘序列号可能重复。
2、也有可能U盘生产厂商自己对程式管控不严格,随意卸载和安装程式:这些递增,递减或随机的序列号重复的可能性也很大。
3、同一厂家的U盘的序列号是唯一的,但是现在的U盘山寨产品比较多,U盘的序列号可以在量产时根据设定的组合生成可以出现重复,另外U盘的序列号不是一成不变的,可以用量产工具改变,故U盘的固件里没有完全固定不变的参数。
结论:SN不存在绝对唯一,有很多人为因素可以对SN号进行修改,存在相同风险。
三、结论:
通过调研得出以下结论:
1.可以通过PID及VID标识确定产品厂商。
2.PID、VID及SN并不存在绝对唯一,可以通过对应主控工具进行修改(需具体测试验证),也存在很多人为因素造成硬件信息的重复。