之前一直想把自己开发的数据恢复软件开源,但一直没有进行基本原理、研发过程文档的编写和代码的整理,这几天找出以前的源码,再补充几篇基本原理和研发思路的博文。

为什么会有数据恢复软件?

平时我们使用电脑的时候,会发现删除文件的速度比拷贝文件的速度快很多,但这是为什么呢?这里就有文件系统的基本原理了,我们在创建文件的时候,文件系统会创建文件文件名、属性信息、文件内容,但我们在删除文件的时候,文件系统只会将我们的文件属性设置为“已删除”,将我们文件内容所占的空间设置为未使用,这样文件系统的shell(windows系统就是explorer)就不会显示出已删除的文件,这个很容易理解,一件物品扔到垃圾箱里面就是垃圾,但它仍然存在,只不过放在我们不去关注的地方,磁盘上的文件也是一样,如果我们没有彻底的粉碎它,只是按了一下delete按钮,那它的内容仍然存在在我们的磁盘上,只不过文件系统的shell向我们撒了谎,并没有显示它。

因此,只要我们能够掌握文件系统的实现原理,就可以将delete的文件找回来,这就是为什么会有数据恢复软件存在的根本原因。

对了,前面提到粉碎,如果你确实想把一些文件销毁掉,连FBI也查不到它是否曾经存在,那就要用文件粉碎软件将它彻底销毁,否则你看过的文档、图片、视频什么的,在数据恢复软件的面前就会一览无余。:)

好吧,我们就开始来学习FAT32文件系统吧。

FAT32文件系统是windows系列操作系统上广泛应用的文件系统,相对也比较简单,所以我们从它开始。

首先要理解的一个概念是引导扇区

其实就是分区的第0个扇区。为什么是第0个扇区而不是别的呢?因为计算机没有人类的智能,只会按照默认的位置去识别,当然最前面的一个扇区是首选了,所以以前总是听说有什么引导扇区病毒,其实就是修改了这第0个扇区,让计算机操作系统错误地去识别转而去执行病毒的代码,那么,引导扇区真的是很重要了啊!

我们知道磁盘的一个扇区一般是512个字节,那么,就是这512个字节里描述了整个分区的基本结构信息和相关参数。以下是c语言写的FAT32引导扇区的结构体:我们来逐个地理解其含义。

struct Fat32_BPB_BLOCK

{

//FAT32文件系统引导区数据结构

BYTE JMPCODE[3]       ;

BYTE OEM[8]           ;

WORD BYTESPERSECTOR   ;

BYTE SECTORPERCLUSTER ;

WORD RESERVEDSECTOR   ;

BYTE COUNTFAT         ;

WORD ALIGN1           ;

WORD ALIGN2           ;

BYTE MEDIATYPE        ;

WORD ALIGN3           ;

WORD SECTORPERTRACK   ;

WORD MAXHEAD          ;

DWORD HIDESECTOR      ;

DWORD TOTALSECTOR     ;

DWORD FATSIZE         ;

WORD FLAG             ;

WORD FATDRIVEVER      ;

DWORD ROOTSTARTCLUSTER;

WORD FILESYS          ;

WORD BACKUP      ;

BYTE RESERVED1[12]    ;

BYTE LOGICALDRV       ;

BYTE ALIGN4           ;

BYTE EXTFLAG          ;

DWORD SN              ;

BYTE NAME[11]         ;

BYTE FAT32[8]         ;

BYTE CODE[0x1FE-0x5A] ;

WORD SIGNATURE        ;

};

FAT32引导扇区描述

偏移说明

1    00H-02H一条跳转指令、指针指向后面的引导程序

2    03H-0AH厂商名和系统版本

3    0BH-0CH每扇字节数

4    0DH每簇扇区数

5    0EH-0FH保留扇区数

6    10H磁盘FAT的个数

7    11H-12H对于FAT16的磁盘为根目录的最大目录项,对于FAT32的磁盘,该值总为"00H00H"

8    13H-14H对于软盘或早期小硬盘,该处为分区总扇区数,对于硬盘一般此值为"00H00H"

9    15H介质描述

10  16H-17H对于软盘或早期小硬盘,该处为每个FAT占用的扇区数,对于硬盘,一般此值为"00H00H"

11  18H-19H每道扇区数

12  1AH-1BH磁头数

13  1CH-1FH隐含扇区数

14  20H-23H对于大硬盘来说,该处存放的是该分区占用的扇区数

15  24H-27H对于大硬盘来说,该处存放的是每个FAT占用的扇区数

16  28H标记

17  2AH版本

18  2CH-2FH引导目录的第一簇,即根目录的起始簇

19  30H-31HFS信息扇区,引导扇区本身占用的扇区数

20  32H-33H备份引导扇区的位置

21  34H-3FH保留不用,一般全为00H

22  40H该处为磁盘BIOS信息

23  41H保留未用

24  42H扩展引导标记

25  43H-46H序列号

26  47H-51H用户设置的卷标

27  52H-59H文件系统

28  1FEH-1FFH结束标志

好了,看看我们能从这里找到什么有用的东西, 20H-23H这四个字节存放了该分区占用的扇区数,0BH-0CH这两个字节存放着每扇区的字节数,两个相乘,不就是该分区的容量吗?

下面我们再来看看FAT32文件系统中的FAT表。

前面的引导扇区描述中,有几处有关FAT的地方,对于FAT32类型分区,我们能够用到的是10H偏移处:磁盘FAT的个数,这个数字一般都是2个了。24H-27H,磁盘每个FAT占用的扇区数。2CH-2FH引导目录的第一簇,即根目录的起始簇。根据引导扇区中提供的信息,我们可以获知该分区FAT表的存储空间大小了,只要知道FAT在分区中存储的起始扇区号,我们就可以将其读入内存,进而对分区数据进行分析了。

下面我们来看看FAT表的结构。

FAT32文件系统中,一个FAT表项为一个字节,八位

00000000H                               代表未用的空簇

00000001H~FFFFFFEFH      代表文件已使用的簇

FFFFFFF0H~FFFFFFF6H      代表系统保留簇

FFFFFFF7H                              代表坏簇

FFFFFFF8H~FFFFFFFFH     代表文件的最后一簇

下面我们介绍FAT32目录项的结构和FAT32长文件名目录项的结构。

FAT32短文件目录项32个字节的表示定义

字节偏移(16进制)

字节数

定义

0x0~0x7

8

文件名

0x8~0xA

3

扩展名

0xB*

1

属性字节

00000000(读写)

00000001(只读)

00000010(隐藏)

00000100(系统)

00001000(卷标)

00010000(子目录)

00100000(归档)

0xC

1

系统保留

0xD

1

创建时间的10毫秒位

0xE~0xF

2

文件创建时间

0x10~0x11

2

文件创建日期

0x12~0x13

2

文件最后访问日期

0x14~0x15

2

文件起始簇号的高16位

0x16~0x17

2

文件的最近修改时间

0x18~0x19

2

文件的最近修改日期

0x1A~0x1B

2

文件起始簇号的低16位

0x1C~0x1F

4

表示文件的长度

FAT32长文件目录项32个字节的表示定义

字节偏移

(16进制)

字节数

定义

0x0

1

属性字节位意义

7

保留未用

6

1表示长文件最后一个目录项

5

保留未用

4

顺序号数值

3

2

1

0

0x1~0xA

10

长文件名unicode码①

0xB

1

长文件名目录项标志,取值0FH

0xC

1

系统保留

0xD

1

校验值(根据短文件名计算得出)

0xE~0x19

12

长文件名unicode码②

0x1A~0x1B

2

文件起始簇号(目前常置0)

0x1C~0x1F

4

长文件名unicode码③

根据以上这些信息,我们就可以编程对FAT32文件系统进行分析了。

让我们来整理一下编程思路:

1、首先我们必须从磁盘中读入FAT32引导扇区,这样才能利用引导扇区提供的相关信息

2、我们需要从磁盘中读入FAT表,通过FAT表获得磁盘存储空间的分配情况和文件存储位置信息

3、逐个读取并分析FAT32目录项。

前两个步骤是建立基本信息,第三步才是文件系统分析的主要内容。

我们看到,FAT32引导扇区中提供了根目录的起始簇,并且每一个FAT32目录项的大小都是32个字节,这样就可以通过一个循环来每次读入32个字节来进行分析,直到最末的FAT32目录项。根据目录项的属性字节,目录项可以为一个子目录,也就是说目录项中所指的文件内容其实是子目录的目录项,那么,对于子目录的分析,其方法应该和对根目录的分析方法一致。我们很容易的想到这样的内容处理用递归函数很容易实现。

好了,基本的思路建立起来了,我们就来编程实现。

fat32源码c语言,FAT32文件系统基本原理与数据恢复编程相关推荐

  1. [iOS] 完整源码, Swift语言 - 账号保存工具

    代码地址如下: http://www.demodashi.com/demo/15017.html 1. 需求分析 作为一个开发者,平时肯定在各个平台,网站注册了各种账号:由于太多,很多时候都是注册之后 ...

  2. 阿里api网关接口客户端demo,java实现源码,其他语言可参考

    访问阿里api网关接口客户端demo,java实现源码,其他语言可参考 上一篇文章 <阿里api网关接口创建.发布.授权.调试> 中,介绍了3个典型接口的创建并在阿里控制台调试完成,地址: ...

  3. 会员管理系统源码 php语言开发

    会员管理系统源码 php语言开发 可用于美容店,理发店,服装店,美甲店,奢侈品店等等 功能介绍: 1.常用功能 会员登记,会员充值,会员充次,商品消费(会员),商品消费(散客),快速消费(会员),快速 ...

  4. 易语言局域网 php 控制,易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码...

    下面我们对易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码文件阐述相关使用资料和易语言控制端源码,易语言被控制源码,易语言局域网远程控制源码文件的更新信息. 易语言控制端源码,易语言被控制 ...

  5. 会员管理系统源码 php语言开发 可用于美容店,理发店,服装店

    会员管理系统源码 php语言开发 可用于美容店,理发店,服装店,美甲店,奢侈品店等等 功能介绍: 1.常用功能 会员登记,会员充值,会员充次,商品消费(会员),商品消费(散客),快速消费(会员),快速 ...

  6. 【VUE】源码分析 - 数据劫持的基本原理

    tips:本系列博客的代码部分(示例等除外),均出自vue源码内容,版本为2.6.14.但是为了增加易读性,会对不相关内容做选择性省略.如果大家想了解完整的源码,建议自行从官方下载.https://g ...

  7. c语言复制粘贴源码,c语言函数memccpy()如何复制内存中的内容实例源码介绍

    c语言函数memccpy()如何复制内存中的内容实例源码介绍.引入的头文件:#include memccpy()函数定义:void * memccpy(void *dest, const void * ...

  8. 算法c语言源码_C语言实现推箱子

    很多同学说C语言难学,不知道C语言学了能做什么,如果说不涉及嵌入式设备编程,我们可以用它来写游戏?是的,C语言能写的游戏有很多,推箱子,贪食蛇,等等 上学的时候老师说过,程序=数据结构+算法,真是这样 ...

  9. c语言案例朗读工具源码,C语言编写简单朗读小工具(有源码)

    原标题:C语言编写简单朗读小工具(有源码) 最近不少人在后台留言说学C都是面对枯燥的控制台程序,能不能体现一下C语言的实际用途,今天我们就理论结合实践一把:C语言结合VBS脚本编写一个简单的朗读小工具 ...

  10. 鸿蒙轻内核源码分析:虚拟文件系统 VFS

    本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二一 01 虚拟文件系统VFS>,作者:zhushy . VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际 ...

最新文章

  1. java流程控制图_Java流程控制
  2. docker的镜像创建与Dockefile的编写
  3. WPF 的 ElementName 在 ContextMenu 中无法绑定成功?试试使用 x:Reference!
  4. Android中的多种文件读写操作方法
  5. Java网络02基本Web概念
  6. 惠州交警携手高德地图 引导市民智慧出行
  7. 内存cookie与持久cookie
  8. OpenCV探索之路(十):图像修复技术
  9. 最难面试的IT公司之ThoughtWorks代码挑战——FizzBuzzWhizz游戏(C#解法)
  10. Vue项目npm run dev后 报错Cannot GET /
  11. 活用锚点解决的问题(由一个简单应用想到的许多)
  12. STM32-----TFTLCD驱动原理
  13. 【网易】网易2018实习生招聘笔试题-测试开发实习生
  14. 追根溯源之最好的Spring AOP解析
  15. gazebo中给机器人添加16线激光雷达跑LIO-SAM
  16. 完美实现Ubuntu系统迁移到另一台电脑/服务器
  17. 数据预测之BP神经网络具体应用以及matlab代码(转)
  18. Android设备上一张图片的显示过程
  19. mysql中常用动词_mysql常用sql语句总结
  20. 解决谷歌浏览器不能打开Axure原型的问题

热门文章

  1. ES index not_analyzed
  2. ftp免费空间,1种适合小白级别的搭建ftp免费空间的方法
  3. ad 原理图放置差分对_Altium Designer差分对设置方法
  4. 微信保存图片提示失败_微信保存图片失败怎么回事
  5. 数据看板是什么,怎么做?
  6. word方框怎么打勾?
  7. 一篇文章理清产品、运营、营销之间的概念和关系
  8. 机器人无人车项目开发学习 上下位机软硬结合python jetson nano ros
  9. JavaWeb 注解
  10. siv技嘉硬件Linux,Gigabyte技嘉System Information Viewer(SIV)风扇控制软件B20.0529.1版For Win10-64(2020年6月16日发布)...