Purlvin's private Weblog ‹℘›

through the EyE, through the Life

USB读取U盘数据技术文档-2

Flash存储与FAT16文件系统
Flash存储器的结构
由于现在Flash的容量普遍较大,对于Flash的操作往往都是按块(Block)来进行的,为了与磁盘兼容,Flash存储器中Block的大小均为512Byte。因而Block就成为对Flash操作的最小单位,下文说提及的地址如没有特别指出都是指Block的地址。
Flash存储器的FAT16文件系统
目前Flash存储器中比较常见的文件系统有FAT16和FAT32,这里重点介绍FAT16文件系统的操作。使用FAT16文件系统格式化后的Flash存储介质的一般会被分以下四个部分:保留分区(Reserved Region)、FAT(File Allocation Table)区(文件分配表区)、根目录区(Root Directory Region)、文件和目录数据区(Data)。
保留分区(Reserved Region)
若U盘具有引导功能,则保留分区又可分成以下两个部分:MBR(Master Boot Record)主引导记录、DBR(Dos Boot Record)操作系统引导记录。
MBR是U盘引导所必须的,但是在PC上却往往却又是不可见的。即使对U盘进行格式化,该部分内容也不受影响。使用软件工具WinHex能观察到DBR、FAT、ROOT、DATA内的内容,但却观察不到MBR的内容。并且即使是有MBR的U盘,WinHex中也是将DBR以地址0x00开始。但在实际使用USB访问U盘时,地址0x00开始的Block是MBR,而地址0x20的Block才是DBR。
若U盘不具有引导功能,则保留分区只还有DBR,并且是以地址0x00开始。
MBR中包含了存取介质的分区信息,实际中U盘一般只有一个分区,所以就可以忽略MBR的信息,而将重点放在读取DBR中的若干内容,用以定位FAT、ROOT和DATA的开始地址。
DBR(Dos Boot Record)操作系统引导记录
DBR中又包含三部分内容:BPB(BIOS Parameter Block)引导扇区、Executable Code引导代码、0x55AA结束标志。其中最重要的是BPB,通过解析其中数据的含义可以获得存储介质中文件系统的特定参数。
实际读取U盘时需要关注是以下几个数据:
1.BS_jmpBoot(offset=0,length=3),只需关注第一个字节是否为0xEB或0xE9,以此来区分DBR和MBR。
2.BPB_SecPerClus(offset=13,length=1),该字节指出了每个簇(Cluster)所占的块(Block)数。对于Flash的底层操作是按最小单位Block进行的,但是在文件系统中却又是以Cluster来管理的。每个文件及目录所占用的最小单位都是Cluster, FAT区中存储的链接地址同样也是指Cluster地址。
3.BPB_RootEntCnt(offset=17,length=2),该数据说明了ROOT区中根目录的项数。根目录中每项都是32个字节,用目录项数×32÷512就能得到ROOT区的长度。不过一般FAT16中该处为512,即ROOT区占用32个Block。
4.BPB_FATSz16(offset=22,length=2),此处是指FAT区所占的扇区数,通过这个数据就能得到ROOT区的起始地址。
5.BPB_HiddSec(offset=28,length=4),该段数据说明了隐藏扇区的数目,实际上就是指DBR至FAT区之间的长度。
得到以上数据就可以很容易的计算出FAT区、ROOT区、DATA区的开始地址:
FAT=offset+BPB_HiddSec(offset是指DBR开始的地址,可以检测BPB的一个字节来确定是0x00还是0x20)
ROOT=FAT+BPB_FATSz16×2(必须有两个FAT区)
DATA=ROOT+32(FAT16中BPB_RootEntCnt一般为512)
FAT(File Allocation Table)区
FAT区用于存储当前Cluster的下一个Cluster的地址。读取文件时只需从目录项中获取文件起始Cluster地址,然后通过查找FAT区中对应地址中的值就可以获得第二个Cluster的地址,如此不断往复就能得到整个文件。
FAT区以0xFFF8开始,其中每一项都是两个字节(16bit,以此来命名FAT16,同理FAT12每项即为12bit)。FAT的第0项(0xFFF8)为FAT区起始标志,而第1项则为固定值0xFFFF,所以目录项中文件的Cluster起始地址最小为0x02。
FAT区中项的值为0xFFF8~0xFFFF则表明是文件的最后一个Cluster。

Flash存储与FAT16文件系统
Flash存储器的结构
由于现在Flash的容量普遍较大,对于Flash的操作往往都是按块(Block)来进行的,为了与磁盘兼容,Flash存储器中Block的大小均为512Byte。因而Block就成为对Flash操作的最小单位,下文说提及的地址如没有特别指出都是指Block的地址。
Flash存储器的FAT16文件系统
目前Flash存储器中比较常见的文件系统有FAT16和FAT32,这里重点介绍FAT16文件系统的操作。使用FAT16文件系统格式化后的Flash存储介质的一般会被分以下四个部分:保留分区(Reserved Region)、FAT(File Allocation Table)区(文件分配表区)、根目录区(Root Directory Region)、文件和目录数据区(Data)。
保留分区(Reserved Region)
若U盘具有引导功能,则保留分区又可分成以下两个部分:MBR(Master Boot Record)主引导记录、DBR(Dos Boot Record)操作系统引导记录。
MBR是U盘引导所必须的,但是在PC上却往往却又是不可见的。即使对U盘进行格式化,该部分内容也不受影响。使用软件工具WinHex能观察到DBR、FAT、ROOT、DATA内的内容,但却观察不到MBR的内容。并且即使是有MBR的U盘,WinHex中也是将DBR以地址0x00开始。但在实际使用USB访问U盘时,地址0x00开始的Block是MBR,而地址0x20的Block才是DBR。
若U盘不具有引导功能,则保留分区只还有DBR,并且是以地址0x00开始。
MBR中包含了存取介质的分区信息,实际中U盘一般只有一个分区,所以就可以忽略MBR的信息,而将重点放在读取DBR中的若干内容,用以定位FAT、ROOT和DATA的开始地址。
DBR(Dos Boot Record)操作系统引导记录
DBR中又包含三部分内容:BPB(BIOS Parameter Block)引导扇区、Executable Code引导代码、0x55AA结束标志。其中最重要的是BPB,通过解析其中数据的含义可以获得存储介质中文件系统的特定参数。
实际读取U盘时需要关注是以下几个数据:
1.BS_jmpBoot(offset=0,length=3),只需关注第一个字节是否为0xEB或0xE9,以此来区分DBR和MBR。
2.BPB_SecPerClus(offset=13,length=1),该字节指出了每个簇(Cluster)所占的块(Block)数。对于Flash的底层操作是按最小单位Block进行的,但是在文件系统中却又是以Cluster来管理的。每个文件及目录所占用的最小单位都是Cluster, FAT区中存储的链接地址同样也是指Cluster地址。
3.BPB_RootEntCnt(offset=17,length=2),该数据说明了ROOT区中根目录的项数。根目录中每项都是32个字节,用目录项数×32÷512就能得到ROOT区的长度。不过一般FAT16中该处为512,即ROOT区占用32个Block。
4.BPB_FATSz16(offset=22,length=2),此处是指FAT区所占的扇区数,通过这个数据就能得到ROOT区的起始地址。
5.BPB_HiddSec(offset=28,length=4),该段数据说明了隐藏扇区的数目,实际上就是指DBR至FAT区之间的长度。
得到以上数据就可以很容易的计算出FAT区、ROOT区、DATA区的开始地址:
FAT=offset+BPB_HiddSec(offset是指DBR开始的地址,可以检测BPB的一个字节来确定是0x00还是0x20)
ROOT=FAT+BPB_FATSz16×2(必须有两个FAT区)
DATA=ROOT+32(FAT16中BPB_RootEntCnt一般为512)
FAT(File Allocation Table)区
FAT区用于存储当前Cluster的下一个Cluster的地址。读取文件时只需从目录项中获取文件起始Cluster地址,然后通过查找FAT区中对应地址中的值就可以获得第二个Cluster的地址,如此不断往复就能得到整个文件。
FAT区以0xFFF8开始,其中每一项都是两个字节(16bit,以此来命名FAT16,同理FAT12每项即为12bit)。FAT的第0项(0xFFF8)为FAT区起始标志,而第1项则为固定值0xFFFF,所以目录项中文件的Cluster起始地址最小为0x02。
FAT区中项的值为0xFFF8~0xFFFF则表明是文件的最后一个Cluster。

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: