分析U盘文件系统(以FAT32为例)
前言
准备了一个U盘
这里我准备了一个U盘,它的系统是FAT32的容量是28.8G我们来看一下分别在本机与U盘上建立两个内容一样的文件它们有什么不一样。
我们发现这两个相同的文件即使大小相同都是9B,但是他们所占字节不同,这是为什么呢?
这就是因为,文件存储是按照簇为单位进行存储的两个盘的文件系统里面的簇是不一样大的,而文本文档他需要最少占用一个簇。test2所在U盘的他一个簇为16字节。
文件系统簇的概念:
当向磁盘中存写一个文件时,操作系统往往会根据磁盘中的空闲簇,将文件分布不连续的段空间上,形成链式存储结构,并把段与段之间的连接信息保存在FAT中,以便操作系统读取文件时,能够准确地找到各段的位置并正确读出。
分析U盘文件系统
- 找个优盘,在winhex里面打开U盘
- 建议找一个容量较小的U盘,请在做实验之前先把U盘数据备份
先来补充一下操作系统引导扇区的知识:
OBR(OS Boot Record,操作系统启动目录)通常位于每个分区(partition)的第一个扇区,是操作系统可直接访问的位置,由高级格式化程序产生。OBR通常包括一个引导程序和一个被称为BPB参数块的本分区参数记录表,参数视分区大小、操作系统的类别而不同。
引导程序的主要作用是判断本区根目录前两个文件是否为操作系统的引导文件,如果是,就把第一个文件读入内存,并把控制权交给该文件。BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数、分配单元(也成为簇)的大小等重要参数。
如下图为一个BPB表,offset表示偏移量,每个数值都代表着不同的含义:
FAT32文件系统由DBR及其保留扇区、FAT1、FAT2及DATA区四部分组成。
FAT32文件系统大概就分为这么四块,第一块为DBR(也就是个引导扇区)及其保留扇区,DBR也就是个引导扇区,它占用一个扇区,但他的后面还会有一块保留的部分,那保留的一部分可能将来要去做一些什么参数之类的,其长度在BPB中规定。第二部分是两个FAT表。最后一区域叫做数据区(DATA),它又分为根目录,子目录和文件区。
接下来打开winhex,用winhex打开U盘:
点击上面的分区1,如下图可见,这个分区1的第一个扇区在8046扇区上,就是DBR所在的地方
开头是个EB 58,EB的意思相当于jump(跳过,跳转),EB 58的意思就是从当前位置往下跳转58个字节之后跳到那去,也就是33 C9那个部分,接着去执行他的引导程序部分,后面就是U盘的引导程序了,而前面那部分(从58后到33 C9前)就是BPB表,我们点击查看—>模板管理器,并双击选择Boot Sector FAT32,即可查看BPB表的内容信息:
开始那三个指令是跳转指令,不属于FAT表,从偏移量4128771到4128778这一部分(即4D 53 44 4F 53 35 2E 30)这一部分(OEM)即所谓的厂商标识,就是这个U盘他是用什么样的系统格式化出来的;接下来偏移量4128779~4128780的这两位Bytes per sector代表每一个扇区有多大,即512B(十六进制02 00(小端序));接下来偏移量4128781这一位代表着每个簇有几个扇区,即32个(十六进制数20),以下这些参数都是这么来的,这些参数一共到了偏移量为4192278这个地方即那个55 AA。
接下来来记下个数:
每个扇区:512B
每个簇有32个扇区
保留扇区(Reserved sector):3230个扇区
Number of FATS(FAT表的个数):2个
(FAT表的长度)Sector per FAT:14769个扇区
Root dir 1st cluster(根目录开始的簇号):2号簇
可以算得:
一个簇为32x512B=16384B
当前DBR扇区号(8046)+ 保留扇区数(3230)=11276,这个扇区号就是我们FAT1的位置,我们跳过去看一看:
因为我们一个FAT表长度为14769个扇区,所以我们,FAT1扇区号(11276)+ 一个FAT表长度(14769)=26045为第二个FAT的起始扇区号,我们跳过去发现跟FAT1是一样的
我们在往后跳过FAT2的长度,26045+一个FAT表长度(14769)=40814号,就到了数据区开始的地方,(根目录)
数据区不是分三部分吗,这就是那个根目录的地方,这个根目录所在的簇号是在2号簇(前面说过了)。
现在我们把U盘格式化,我们看看格式化之后那三个区域都长什么样。
格式化…
好了。
打开后那个分区1不会变化(就是那个DBR),
它的各种参数也不会变。跳到FAT1
发现有点不一样了,比刚才的那个FAT1少了一行还多。一行为16个字节,只有第一行前12个有东西,后面的全是0,FAT2一样。但是跳转到数据区,发现还是有东西的,如下图,是我在U盘创建的一个txt文件内容abcdefg,但是根目录变成0了
也就是说磁盘格式化后,数据区还在,只是前面的跟目录那些东西没了,也就是说数据是可以恢复的,就算你格式化了,只要数据区还在,就能恢复。
但是计算机为什么看不见他们了呢?因为数据删除仅仅“撕掉”了根目录,而数据还都在。
我们从新在U盘上建个new.txt文件,内容1234567890。刷新winhex,跳到FAT表1,发现FAT1有多个FF FF FF 0F。
先来学习一下FAT表的结构
发现FAT表中,每一个表项占4个字节,即4x8b=32b。所以他叫FAT32。
注:每一个表项对应一个簇。 也就是说2号表项分预留出来给了根目录,所以根目录在2号簇。一个FFFFFF0F叫做一个结束标记,表示这个簇中的文件已经完结,就是这个簇就完了,到头了,后面簇里的文件跟我这个簇里的没关系。后面的全0,0就代表了空白簇,,还没有分出去的,只要一来一个文件,我就可以找这么一个簇分给你用(如刚才我新建了一个文件new.txt,他很小,文件系统就分给他一个簇,就把3号簇分给了他,并打上了删除标记)。
接下来我们往U盘里存一个比较大的文件,刷新winhex,跳至FAT1:
发现这个文件并不是接着从5号表项分配的,而是从17 00 00 00开始分配(链式存储),一直到下面那个结束标记FF FF FF 0F整个文件才结束,一共占用了25个簇,并能算出该文件大小:25x16384B=409600B。
图中可以发现规律17 00 00 00—>18 00 00 00—>19 00 00 00,每个簇中存放着下一个簇的簇号,就像在指针一样。
接下来再跳转到根目录看一下:
根目录记载了U盘里有多少个文件或文件夹,如图中就是根目录登记项中登记的项。如,之前那个new.txt
跟目录有分为短文件名和长文件名。
短文件名:
占两行(如上面那个new.txt的文件名),共32个字节。我们点击查看—>模板管理器,并双击选择FAT Directory Entry即可查看这个短文件名的内容信息了:
分析: