USB MSC

编辑博客时,回车的意思是切换段落,shift+回车才是换行。

1 U盘量产工具 - 主控芯片私有的SCSI命令
1.1 Tools
ChipEasy / ChipGenius
FlashGenius
MyDiskTest

1.2 URLs
SCSI commands in BadUSB
https://stackoverflow.com/questions/47086505/scsi-commands-in-badusb

U盘量产网
www.upantool.com

优盘之家
http://www.upan.cc

针对基于phison(群联)U盘的badusb攻击

基于加密U盘和虚拟技术的安全系统
https://www.docin.com/p-175738088.html

1.3 Abbreviations
MGX:三星SSD主控
ps2251-63:Phison(Phison = “Five-Person”, 由五位Flash 研发经验超过14年专业人士创立),群联
SSS:Solid State System,鑫创,简称3S

2 为何已经有了CBI,又再弄出个BBB
USB MSC传输层协议分CBI(Control/Bulk/Interrupt)和BOT(Bulk-only Transport),而BOT又称为BBB。

对于USB MSC设备来说,USB设备和USB主机之间的通信,既然已经定义了一个CBI规范,那么为何还要再新定义一个BBB呢?

因为最开始USB协议定义的时候,那时候市场上的Floppy Disk还是用的很多的。所以针对Floppy设备特点,分别定义了多个端点来传输不同的信息,即Control端点传命令块,Bulk传数据,Interrupt传状态信息。而后来计算机行业发展了,Floppy类的设备很少用了,存储数据多数开始用Flash Memory了,再加上通过合理规划,可以用同一种端点(Bulk),传输上述三种信息,即命令块,数据,状态。因此,只需要物理上实现2个Bulk端点,节省掉了其他两个端点(Control端点和Interrupt端点),而达到同样的信息传输的目的。

常见的大容量存储设备的bInterfaceClass、bInterfaceSubClass和bInterfaceProtocol分别如下所示。
UFI CBI:0x08/0x04/0x00
UFI BOT:0x08/0x04/0x50
SCSI CBI:0x08/0x06/0x00
SCSI BOT:0x08/0x06/0x50
SFF-8070i/ATAPI BOT(移动硬盘用):0x08/0x05/0x50

Linux系统处理UFI和SCSI命令集参考如下的代码。
drivers/usb/storage/usb.c
get_transport(us);
get_protocol(us);

3 SCSI命令集
3.1 CBW and CSW
CBW:第15个字节(从0索引开始数)是SCSI CMD
CSW:第12个字节(从0索引开始数)是SCSI CMD执行状态,0表示成功,其它表示失败

3.2 Inquiry
Figure 3-1 标准Inquiry返回数据

Peripheral Device Type(PDT):标识当前连接逻辑单元的类型,0x00为直接存储设备,0x05为光盘
Removable Media Bit(RMB):置1表示可移除设备
Response Data Format:UFI设备置1,SCSI-2设备置2
Additional Length:参数长度,此值为31
Vendor Information:8个字节长度的ASCII字符串,不包括'\0'
Product Identification:16个字节长度的ASCII字符串,不包括'\0'
Product Revision Level:4 hexadecimal digits,不包括'\0'

3.3 Read Capacity
返回的是最大扇区数目减1,即是num_sectors - 1。

3.4 Request Sense
Figure 3-2 Request Sense

Valid:表示Information域是否有效
Information:4个字节的sense_data_info,表示出错的逻辑块地址
Additional Sense Length:值是10
SK、ASC、ASCQ:组成一个24bit的sense_data,表示错误代码
Linux中实施:
#define SS_NO_SENSE             0
#define SS_COMMUNICATION_FAILURE        0x040800
#define SS_INVALID_COMMAND          0x052000
#define SS_INVALID_FIELD_IN_CDB         0x052400
#define SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE   0x052100
#define SS_LOGICAL_UNIT_NOT_SUPPORTED       0x052500
#define SS_MEDIUM_NOT_PRESENT           0x023a00
#define SS_MEDIUM_REMOVAL_PREVENTED     0x055302
#define SS_NOT_READY_TO_READY_TRANSITION    0x062800
#define SS_RESET_OCCURRED           0x062900
#define SS_SAVING_PARAMETERS_NOT_SUPPORTED  0x053900
#define SS_UNRECOVERED_READ_ERROR       0x031100
#define SS_WRITE_ERROR              0x030c02
#define SS_WRITE_PROTECTED          0x072700

#define SK(x)       ((u8) ((x) >> 16))
#define ASC(x)      ((u8) ((x) >> 8))
#define ASCQ(x)     ((u8) (x))

4 Linux内核SCSI子系统
4.1 Linux中的SCSI模型
Figure 4-1 SCSI四元组的逻辑关系

上述概念在Linux内核中有3个对应的数据结构,分别是Scsi_Host、scsi_target和scsi_device。

4.2 Linux Mass Storage Flow
do_scsi_command() - 假如读写时由N个buffer,那么这个函数传输的buffer范围是从[1, N - 1],最后一个buffer由finish_reply()完成传输
finish_reply()            - 传输最后一个buffer
send_status()           - 完成CSW状态

4.3 SCSI Host注册使用到的函数
scsi_host_alloc()
scsi_add_host()
scsi_scan_host() - 执行INQUIRY命令,每扫描到一个lun(函数scsi_probe_and_add_lun())就创建一个struct scsi_device(譬如U盘一般只有一个lun,而读卡器和UFS可能有多个lun;每个struct scsi_device创建一个disk,可能有多个分区),与sd_probe()匹配。

4.4 sync执行流程
4.4.1 sys_sync
sys_sync()
wakeup_bdflush(0)
sync_inodes(0)
sync_supers()
sync_filesystems(0)
sync_filesystems(1)
sync_inodes(1)

4.4.2 命令行执行sync流程
SYSCALL_DEFINE0(sync)
->
wakeup_flusher_threads()

4.5 TUR执行流程
4.5.1 从文件系统到SCSI块设备
第一步:
static struct file_system_type xxx_fs_type = {
    [...]
    .mount = xxx_mount,
    [...]
};

第二步:
@ fs/block_dev.c
const struct file_operations def_blk_fops = {
    .open       = blkdev_open,
    [...]
};
->
blkdev_get()
->
__blkdev_get()

第三步:
@ drivers/scsi/sd.c
static const struct block_device_operations sd_fops = {
    [...]
    .open           = sd_open,
    [...]
    .revalidate_disk    = sd_revalidate_disk,
    [...]
};

第四步:
sd_open()
->
sd_revalidate_disk()
->
sd_spinup_disk()

4.5.2 SCSI spinup流程
@ drivers/scsi/sd.c - sd:scsi disk
sd_probe()
->
sd_probe_async()
->
sd_revalidate_disk()
->
sd_spinup_disk()

4.6 Linux内核SCSI硬盘盘符分配
4.6.1 usb层和scsi层传自定义参数
通过struct Scsi_Host {}

4.6.2 URLs
Linux内核SCSI硬盘盘符分配
http://ilinuxkernel.com/?p=794

磁盘槽位和盘符绑定方案
http://www.voidcn.com/article/p-dvjobuge-ga.html

Linux硬盘盘符分配
http://ilinuxkernel.com/?p=958

gendisk struct having the disk_name,struct Scsi_Host(drivers/usb/storage/usb.c)
https://stackoverflow.com/questions/5257402/drive-letter-for-usb-device-and-hdd-devices-in-linux-kernel

5 Android StorageManagerService
5.1 vdc - mConnector
抓取log
dumpsys mount
logcat | grep StorageManagerService

5.2 获得系统所有的存储卷
StorageManager mStorageMgr =
 (StorageManager)this.getSystemService(Context.STORAGE_SERVICE);
StorageVolume[] vlists = mStorageMgr.getVolumeList();
String str = "";
for (StorageVolume sv: vlists) {
    str += "path: " + sv.getPath() + "\n";
}
// /storage/emulated/0
str += Environment.getExternalStorageDirectory().getPath();
tv.setText(str);

6 Abbreviations
ARC:Argonant RISC Core
AT91SAM9260:SAM means Smart ARM-based Microcontroller
ATMEL SAMBA:ATMEL Smart ARM-based Microcontroller Boot Assistant
bdi:backing device info - 脏页写回核心结构;文件系统page cache,使用struct address_space_operations(每个文件系统都有这个结构体,譬如 fat_aops)
CC2530:TI ChipCon2530
DBR:DOS Boot Record
DWC2:Design Ware Controller 2,Apple的嵌入式设备,包括iPad和iPhone都是使用的DWC2
EBR:Extended Boot Record
IDA & IDR:Identification,IDR机制在Linux内核中指的是整数ID管理机制。实质上来讲,这就是一种将一个整数ID号和一个指针关联在一起的机制。IDA是用IDR来实现的ID分配机制,与IDR的区别是IDA仅仅分配与管理ID,并不将ID与指针相关联。
ISP1161:Philips' Integrated host Solution Pairs 1161,“Firms introduce USB host controllers”,https://www.eetimes.com/document.asp?doc_id=1290054
Linux dd命令参数:if表示input file,of表示output file,bs表示block size
MBR:Main Boot Record
MMC-2:SCSI Multimedia Commands-2
NTFS:n ei f ts
Quirks:the attributes of a device that are considered to be noncompliant with expected operation
RCU:Read-Copy Update,RCU支持一个更新者和多个读者同时访问。通过维护对象的多个版本,RCU保证读者看到的对象是前后一致的,并且保证在所有之前已存在的读者离开临界区时,这些版本才会被释放
SFF-8020i:Small Form Factor Committee,小型化委员会
SL811HS:Cypress/ScanLogic 811 Host/Slave,性能上与ISP1161(Integrated host Solution Pairs 1161)相当
TDI:TransDimension Inc.,该公司首先发明了将TT集成到EHCI RootHub中的方法,这样对于嵌入式系统来说,就省去了OHCI/UHCI的硬件,同时降低了成本,作为对该公司的纪念,Linux内核定义了宏ehci_is_TDI(ehci);产品UHC124表示USB Host Controller;收购了ARC USB技术;现已被chipidea收购,chipidea又被mips收购
TLV:TI Low Value,高性价比
TPS:TI Performance Solution
TT:Transaction Translator(事务转换器,将USB2.0的包转换成USB1.1的包)
TUR:Test Unit Ready(类似心跳信号),sd_spinup_disk()执行该命令,底层排队函数
USB BH reset:Bigger Hammer or Brad Hosler,表示warm reset;you may be confused why the USB 3.0 spec calls the same type of reset "warm reset" in some places and "BH reset" in other places. "BH" reset is supposed to stand for "Big Hammer" reset, but it also stands for "Brad Hosler". Brad died shortly after the USB 3.0 bus specification was started, and they decided to name the reset after him. The suggestion was made shortly before the spec was finalized, so the wording is a bit inconsistent.
usb_stor_host_template.queuecommand()和ufshcd_queuecommand()。Linux工具sg_turs(SCSI Generic,隶属于sg3_utils)用来手工发送TUR命令。
UASP:USB Attached SCSI Protocol
W-LUNs:UFS Well Known Logical Units

发布了123 篇原创文章 · 获赞 49 · 访问量 32万+

猜你喜欢

转载自blog.csdn.net/zoosenpin/article/details/74686990
usb