前面总结了usb,现在总结一下fat文件系统,首先看看下文。

那偶就不用那么辛苦总结了。

首先需要介绍一个工具winhex,江湖上到处流传这种武器的用法是恢复数据,其实这里不是用来恢复,这里是用来读数据,并且创造其镜像。

下面的所有图图都是来至于这个工具。

其次需要看看《FAT16文件系统格式说明》,这个东东是一个pdf,在网上就可以找到。在看下面的分析,你得首先了解一下FAT16文件系统

的格式吧。知道硬盘上的数据按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。

引导扇区的信息如下:

1.偏移地址00H,长度3,内容:EB 3C 90跳转指令。

2.偏移地址03H,长度8,内容:4D 53 44 4F 53 35 2E 30为厂商标志和os版本号,这里是MSDOS5.0。

3.偏移地址0BH,长度2,内容:00 02。注意这里数据的布局,高地址放高字节,低地址放低字节(数据为小端格式组织),所以数据应该是0200,即512。表示的意思是,该磁盘每个扇区有512个字节。有的可能是1024、2048、4096。

4.偏移地址0DH,长度1,内容:01。表示的意思是每个簇有1个扇区。这个值不能为0,而且必须是2的整数次方,比如1、2、4、8、16、32、64、128。但是这个值不能使每个簇超过32KB字节。

5.偏移地址0EH,长度2,内容:08 00。转换一下,就是00 08,意思是保留区域中的保留扇区数为8个。那么就可以知道下面的FAT1区的开始的地址就是:0x08*0x200(每个扇区的字节数)=0x1000。

6.偏移地址10H,长度1,内容:02。表示此卷中的FAT结构的份数为2,另外一个是备份的。

7.偏移地址11H,长度2,内容:00 02。转换一下,就是0200H,表示根目录项数(Root Entries)能够保存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数。在一个典型的硬盘上,本字段的值为512。

8.偏移量地址13H,长度2,内容:4D ED。转换一下就是ED4DH,即大约32MB的SD卡存储量。表示小扇区数(Small Sector)。该分区上的扇区数,表示为16位(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它。

9.偏移地址16H,长度2,内容:EC 00。转换一下为00EC,表示每个FAT占用的扇区数。那么每个扇区占用的字节数就是0x00EC*0x200=0x1D800。根据启动区、FAT1、FAT2、根目录、数据区的次序,可以依次计算出它们的地址了。(教程中给出的偏移地址为24H,但是根据实际的FAT1/FAT2地址的推算,应该是16H地址)

10.偏移量地址20H,长度2,内容:00 00。表示大扇区数(Large Sector)。如果小扇区数字段的值为0,本字段就包含该FAT16分区中的总扇区数。如果小扇区数字段的值不为0,那么本字段的值为0。

11.偏移量地址36H,长度为8,内容:46 41 54 31 36 20 20 20,对于ASCII码为“FAT16”,表示文件系统类型(File System Type)根据该磁盘格式,该字段的值可以为FAT、FAT12或FAT16

启动区:理所当然是0x00;

FAT1:0x1000;

FAT2:0x1000 + 0x1D800 = 0x1E800;

根目录区:0x1E800 + 0x1D800 = 0x3C000;

数据区的地址,等等再计算。这个只是计算,可以看看是不是和实际的一致。

怎么样,是不是和计算的很一致。

为什么要计算SD数据的读取要给出地址,而且每次读取都是一个整扇区,512个字节。找出这些地址后,可以很方便的找到数据。

现在分析下根目录区的内容:

这里使用的是FAT16短文件目录项,每32个字节表示一个文件(文件夹也是),32个字节的表示定义分别如下:

FAT16目录项32个字节的表示定义

字节偏移(16进制)

字节数

定义

0x0~0x7

8

文件名

0x8~0xA

3

扩展名

0xB

1

属性字节

00000000(读写)

00000001(只读)

00000010(隐藏)

00000100(系统)

00001000(卷标)

00010000(子目录)

00100000(归档)

0xC~0x15

10

系统保留

0x16~0x17

2

文件的最近修改时间

0x18~0x19

2

文件的最近修改日期

0x1A~0x1B

2

表示文件的首簇号

0x1C~0x1F

4

表示文件的长度

1.偏移地址00H,长度8,内容:驱动器的名称,8个字节。这里的CCD8对应国标码“特”,而C8A8对应国标码“权”,即特权同学给该SD卡起的“特权”一名。

2.偏移地址20H,长度8,内容:54 45 53 54 20 20 20 20。表示第一个文件名:TEST (空缺部分是空格)。

偏移地址80H,长度8,内容:4E 45 58 54 20 20 20 20。表示第二个文件名:NEXT (空缺部分是空格)。

3.偏移地址28H(88H也一样),长度3,内容:54 58 54。表示文件类型,为ASCII字符表示。

4.偏移地址2BH(8BH也一样),长度1,内容:20。表示文件属性,00000000(读写);00000001(只读);00000010(隐藏);00000100(系统);00001000(卷标);00010000(子目录);00100000(归档)。

5.偏移地址36H,长度2,内容为BA 49。表示时间=小时*2048+分钟*32+秒/2。得出的结果换算成16进制填入即可。也就是:36H字节的0~4位是以2秒为单位的量值;36H字节的5~7位和37H字节的0~2位是分钟;37H字节的3~7位是小时。

6.偏移地址38H,长度2,内容为A3 3A。表示日期=(年份-1980)*512+月份*32+日。得出的结果换算成16进制填入即可。也就是:38H字节0~4位是日期数;38H字节5~7位和39H字节0位是月份;39H字节的1~7位为年号,原定义中0~119分别代表1980~2099,目前高版本的Windows允许取0~127,即年号最大可以到2107年。

7.偏移地址3AH,长度2,为该文件开始簇号,这里也是用了小端格式组织。转换下为00 02,根据这个就可以找到文件TEST.txt下一个簇号在FAT1中的位置了。1000H+02H*02H(因为2个字节存一个簇号)= 1004H。

偏移地址3AH,长度2,为该文件开始簇号,这里也是用了小端格式组织。转换下为00 62,根据这个就可以找到文件NEXT.txt下一个簇号在FAT1中的位置了。1000H+62H*02H(因为2个字节存一个簇号)= 10C4H。

8.偏移地址3CH,长度4,内容:59 BE 00 00。表示文件长度,转换后为00 00 BE 59就是48729字节。

偏移地址9CH,长度4,内容:32 00 00 00。表示文件长度,转换后为00 00 00 32就是50字节。

TEST.txt占用了48KB的空间,NEXT占用了512B的空间。文件是按照整簇来存放的,不够一个簇的大小(由上面算得,一个簇为一个扇区即512B),也要给一个簇的空间。

计算出该文件放置空间。

从文件的大小可以计算出,需要占用多少个簇。根据前面的数据,每个簇放1个扇区,每个扇区512个字节,那么一个簇的空间就是512字节了。那么48729字节需要96个簇,这96个簇的开始的地址就可以计算出来了。

首先要提一点,这个地方也是特权同学找了很多资料才发现的,就是根目录中根文件夹占有32(20H)个扇区应该是固定的(至少对于FAT16应该是这样),所以真正的用户数据存放应该是从根目录地址的32个扇区偏移量后开始算的。

上面已经知道TEST.txt开始簇地址存放在FAT1中的偏移量了:02H,由此可以先计算出TEST.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(02H-02H)*01H(1个簇有1个扇区)*200H=40000H。把偏移量-02H意思是簇号在FAT1中存储都是从02H开始的。

而第一个簇地址存放在FAT1中的:1000H(FAT1起始地址)+02H*02H=1004H。而1004H地址上的数据为:03 00,转换后为0003H,那么我们可以计算出TEST.txt第二个簇的地址为:3C000H(根目录区地址)+20H*200H(前面提到的用户数据偏移量)+ (03H-02H)*01H(1个簇有1个扇区)*200H=40200(第一个簇开始地址)。依此类推,一直到FAT1中偏移量为C2处出现了FF FF,这表示TEST.txt文件存储结束,那么前面的0061H就是文件最后一个簇偏移量。我们可以由此算一下文件大小为:(0061H-0002H+0001H(补偿))=96个簇,和实际相符。

同样的道理可以算出NEXT.txt文件的存放地址。首先起首地址偏移量为62H,由此可以先计算出NEXT.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(62H-02H)*01H(1个簇有1个扇区)*200H=4C000H。而第一个簇地址存放在FAT1中的:1000H(FAT1起始地址)+62H*02H=10C4H。而10C4H地址上的数据为:FF FF,即结束了,也就是说由于NTXT.txt不满一个簇,那么只能分配到一个簇的地址空间。

linux fat16 id,解析FAT16文件系统相关推荐

  1. 【Linux】磁盘管理与文件系统

    文章目录 一.磁盘基础 1.磁盘的解释 2.磁盘结构 物理结构 数据结构 3.磁盘接口类型 4.MBR与磁盘分区 5.文件系统类型 XFS文件系统 SWAP交换文件系统 Linux支持其他文件系统类型 ...

  2. linux系统可支持多种文件系统类型,Linux文件系统类型简介及支持的文件系统汇总--Linux入门到精通系列...

    不同的操作系统需要使用不同类型的文件系统,为了与其他操作系统兼容,以相互交换数据,通常操作系统都能支持多种类型的文件系统,比如Windows 2000 Server,系统默认或推荐采用的文件系统是NT ...

  3. linux 分区id,分区ID对照表和diskpart更改分区ID的方法

    DISKPART更改分区ID的方法 DISKPART支持压缩卷 在系统下就可以分区 可以压缩系统分区 无损分区 缺点:压缩有限(分区一半左右) 新版diskpart 支持更改分区ID 里面有一个SET ...

  4. Linux学习笔记19——XFS 文件系统的备份与还原、光盘写入工具、其他常见的压缩与备份工具

    目录 一.XFS 文件系统的备份与还原 1,XFS 文件系统备份 xfsdump 用 xfsdump 备份完整的文件系统 用 xfsdump 进行累积备份 (Incremental backups) ...

  5. linux中怎么看挂载文件系统,Linux中如何查看已挂载的文件系统类型详解

    前言 如你所知,Linux 支持非常多的文件系统,例如 ext4.ext3.ext2.sysfs.securityfs.FAT16.FAT32.NTFS 等等,当前被使用最多的文件系统是 ext4.你 ...

  6. linux 内核移植和根文件系统的制作【转载】

    原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...

  7. linux 查看磁盘分区,文件系统,使用情况的命令和相关工具介绍,Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍...

    Linux 查看磁盘分区.文件系统.使用情况的命令和相关工具介绍 作者:北南南北 来自:http://doc.xuehai.net 提要:Linux 磁盘分区表.文件系统的查看.统计的工具很多,有些工 ...

  8. linux内核深度解析_十年磨一剑,第一本龙芯平台的Linux内核书来了

    <用"芯"探核:基于龙芯的Linux内核探索解析>是一本基于龙芯平台,结合源代码来探索和解析Linux-5.x内核的书. 市面上解析Linux 内核的经典书籍已有不少, ...

  9. linux源码文件名,Linux中文件名解析处理源码分析

    Linux中文件名解析处理源码分析 前言 Linux中对一个文件进行操作的时候,一件很重要的事情是对文件名进行解析处理,并且找到对应文件的inode对象,然后创建表示文件的file对象.在此,对文件名 ...

最新文章

  1. ubuntu配置ipv6
  2. java.sql.Connection.close() vs null
  3. web框架flask(12)——国际化和本地化
  4. 第二次作业— —结对项目
  5. 人工智能算法--KNN算法(C++实现)
  6. 由一个小库存软件想到的
  7. 解决 IDEA 调用其他类的时候自动加上包路径和类名的情况_惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密...
  8. 全国计算机等级考试题库二级C操作题100套(第84套)
  9. html中,怎么样才能获得iframe页面里的内容
  10. 【英语学习】【加州教材】【G2】【科学】Science目录及术语表
  11. Windows update一直停留在正在检查更新,为什么
  12. 一个html文件创造多个页面,使页眉和页脚文件包含在多个html页面中。
  13. python往mysql存入数据_Python向mysql存入数据出错.
  14. ListView+CheckBox两种解决方式及原因分析
  15. 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口 ....
  16. 串口调试助手CRC16_MODBUS校验码计算
  17. html页面前端乱码,css网页代码乱码怎么解决?
  18. 2021-11-09 jQuery常用方法及事件
  19. 轨迹优化 | Minimum-jerk
  20. 判断单链表是否存在环以及两个链表是否相交

热门文章

  1. js中的trim函数怎么使用
  2. 什么是用户画像——从零开始搭建实时用户画像(一)
  3. 疯狂python讲义学习笔记——中十章完结
  4. 实现百度第三方登陆详细解答
  5. Verilog 过程结构(initial, always)
  6. 《黑客与画家》读书笔记(四)
  7. springboot毕设项目协同过滤推荐的餐厅点菜系统b2033(java+VUE+Mybatis+Maven+Mysql)
  8. win7注册表关闭防火墙服务器,急问::怎么用注册表关闭windows防火墙??
  9. 《数据结构》物联1131-1132同学链接
  10. 加密网站地址——从根本解决盗连