Windows文件系统以及文件粉碎原理

1.1硬盘揭秘:

物理存储方式:

目前的存储方式有磁存储,电存储,光存储。U盘就是电存储,VCD,DVD光盘用的是光存储,我们计算机用的硬盘就是用的磁存储。各种存储方式在物理存储介质不同外,在逻辑层面上都是基于文件系统结构的方式,也就是用户看到的任何文件数据都是已文件和目录的形式展现在我们面前。

 

小小历史

   1956年9月蓝色巨人IBM想世界展示了第一套磁盘系统IBM350 RAMAC Random,当时这涛系统存储容量只有5M,使用50个直径值24英寸磁盘。1968年IBM有提出Winchster磁盘技术,现在我们使用的磁盘都是采用这种技术。

 

 

磁盘逻辑结构示意图



盘片:

磁盘是由很多盘片组成,每个盘片上都覆盖有磁性物质。当电机带动主轴转动,磁头就能读取盘片上的数据。

磁道:

每个盘片被划分成若干个同心圆,磁盘上的信息就是便是按照这样的同心圆存放。每个以主轴为圆心的圆之间是有一定距离的,只是这样的距离我们肉眼是看不出来。

扇区:

   对每一个同心圆也就是磁道在进行等分,每个被等分的部分叫做扇区,数据就是按扇区为单位存储在上面。在windows文件系统里是以簇这样的单位来管理数据的读取的,然而一个簇是连续的若干个扇区。每个扇区一般是512个字节。

 

看到上面的几个对磁盘的概念我们知道,文件数据是存储在1-N个扇区上的,对文件的读写其实就是对文件存放的扇区进行读写。

 

 

Windows文件系统之FAT32

 

什么是文件系统:

文件系统是对数据存取和管理的一种方式,为了长久的存储和访问数据而为用户提供的一种基于目录和文件的存储机制。我们都知道,在使用硬盘存储数据前,必须要先进行分区,然后在对分区格式化,格式化就是建立文件系统的过程。一个文件系统有系统结构和按一定规则的存放的用户数据组成,以使计算机可以找到边访问它们。

上面是windows对文件系统的定义,是不是看的有点晕。嘿嘿。我们的数据是以二进制存储在硬盘上的,对于硬盘来讲,它并不知道有文件这目录这样的概念,也不知道一个文件存储在那些扇区上。但我们使用windows的时候看到的数据都是以文件和目录的形式展现,那这个展现和管理是谁来做了,对就是文件系统帮我们做了,让我们能透明的读写硬盘上的数据,而不用关系数据的存储位置和方式。

 

二种windows文件系统FAT和NTFS

 

文件系统的相关概念

数据单元:

        数据在写入和读取的时候每次操作的数据量称为数据单元,也就是如果是读那么每一次的读会是数据单元这么大,对于文件写,会先把文件按数据单元分割,然后写入硬盘。

Windos文件系统的数据单元我们叫“簇”。一个簇是一个连续的扇区空间。一般一个簇是

8个扇区,每个扇区是512个字节。这样我们可以算出一个簇的字节数 8 * 512 这么多个字节。

 

逻辑文件地址:

            对于每个文件来讲,讲他们按照数据单元大小分割成若干个簇大小,然后对每个部分进行编号,从0开始。每一个部分存储在硬盘的一个簇里,每个部分在硬盘上存储是不连续的。每个编号我们叫做逻辑文件地址。

 

 

FAT文件系统概述

 FAT文件系统名字就是应为他使用了文件分配表来描述文件系统内存储单元簇的分配情况和文件内容的前后连接关系而得名。FAT经历了3个阶段FAT12,FAT16,FAT32。

 

FAT整体布局

 



可以看到FAT分为3个部分,保留区,2个等大的FAT区,和数据区。下面我们来看看每个区的作用。顺便说一下,这几个区就是在对硬盘分区后然后格式化创建的。

 

保留区:

     保留区中包含一个重要的数据结构DBR系统引导扇区,DBR中存储的文件系统重要的参数,通常DBR就是硬盘上的第一个扇区。下面来看看DBR具体的信息



FAT区概述

 FAT去主要用来分配表来描述文件系统内存储单元簇的分配情况和文件内容的前后连接关系。FAT32区会被安4字节大小来划分,每个部分有一个编号从0开始。那每个部分的地址编号,和这4字节空间里存储的值有什么用了?

编号的作用:FAT表的地址编号与数据区的簇编号一一对应,也就是加入数据区的3号簇被使用,那么对用的FAT区地址编号为3的空间会被标记使用状态。

值的作用:假如一个文件需要2个簇来存储,假定为2,3二个簇。那么FAT去编号为2,3的空间都会被标记为使用,2号空间里存储的值为3表示该文件数据存储的下一个簇标号。这样我们只用知道文件或者目录的起始簇,然后通过链表试的跟踪,就可以获得文件的是有数据。

 

引用一本书中的一个游戏来讲解这个查找过程



FAT数据区

数据区是真在存储用户文件和目录数据的区域,在文件系统被创建的时候第一个在数据区被创建的是“根目录”这个根目录不是我们说的逻辑盘符C:盘D盘等等,而是我们的逻辑盘挂节点。或者说是逻辑盘的父目录。我们在创建逻辑盘的时候,逻辑盘的信息比如大小,创建时间,就存储在根目录下。每一个存储项我们叫“目录项”

 

NTFS文件系统




MFT为主文件表,在创建NTFS文件系统的时候创建MFT,MFT有一个个MFT项组成,每个MFT项其实就是一个文件记录,其中保存这各种文件和目录的信息。

NTFS跟FAT主要的区别在于,NTFS除引导区外都可以看作为数据区,用户数据先存储在用户数据区,当该区域不够的时候,在使用MFT的区域来存储数据。

 

 

文件粉碎原理

文件粉碎主要包含2方面的功能,一是能安全删除文件,并且被删除的文件无法使用数据恢复工具恢复。二是对硬盘上为使用的空间填充垃圾数据,这样可以让以前未用粉碎删除的文件数据不能被恢复。

安全的删除没有特殊属性(不是windows的压缩,加密,稀疏文件类型)的文件相对来说比较简单,只用打开文件api获得文件句柄, 然后对文件的存储空间填充垃圾数据, 一般对文件的每个簇填充3次垃圾数据如填充0,1,和随机数据。然后对文件重命名N次,在安全删除文件即可。

备注:上面指的windows的压缩文件不是我们平常使用的winrar,zip这类压缩文件,这类使用第三方压缩工具压缩的文件对文件粉碎来说都是普通文件。那什么是windows压缩文件了,

在NTFS文件系统里,可以对文件进行压缩,在使用的时候是不需要解压的,解压的过程对用户不可见。

现在来看看如何来压缩一个文件

1.      第一步选中要压缩的文件,右键属性,点击“高级”按钮








1.      选中压缩节省空间,这时文件就是windows压缩文件。文件名会变成蓝色。可以明显看到文件在被压缩后使用的存储空间变小了许多。

 

 

对windows压缩、加密和稀疏文件由 NTFS 以 簇方式管理。如果某个程序向此类文件的现有部分写入数据,则 NTFS 会分配磁盘上的新空间来存储新数据,并在写入新数据后取消分配该文件先前占用的簇。NTFS 采取此保守方法的原因与数据完整性有关,而且对于压缩和稀疏文件,这样可以在出现新分配大于现有分配(新的压缩数据大于旧的压缩数据)的情况下正确应对。因此,覆盖此类文件时将不能成功地从磁盘中删除文件的内容。所以说直接对这类特殊文件写,其实是对新分配的空间在读写,而老的存储区域并没有被填充垃圾数据,导致数据有被回复的可能。在对于这类文件我们该如果处理了?

 

依赖碎片整理 API

GetDiskFreeSpace获得一个簇为多少个字节,在win下一般是8*512个字节,假设为M。然后在获得要删除文件的逻辑簇编号,假设为A1,A2。这样我们就可以计算每个簇在硬盘上的起始位置。

簇的起始位置 A1 *M 在通过SetFilePointer 可以直接定位到写的位置。

 

 

空间的清理问

 可用空间的清理问题提出了另一项挑战。由于 FAT 和 NTFS 没有为应用程序提供直接寻址可用空间的方法,因此具有以下两个选择之一。第一个选择是它可以像处理压缩、稀疏和加密文件那样,打开磁盘以进行原始访问并覆盖可用空间。此方法面临一个很大的问题:即使完全能够计算 NTFS 和 FAT 驱动器的可用空间部分(这并非微不足道),它也会遭遇与系统上发生的活动文件操作发生冲突的风险。例如,假设确定某个簇可用,而就在此时文件系统驱动程序(FAT、NTFS)决定为另一应用程序正在修改的文件分配该簇。文件系统驱动程序会将新数据写入该簇,然后跟随而来并覆盖了刚刚写入的数据:该文件的新数据丢失了。如果为文件系统元数据分配该簇,则问题会更糟,因为会破坏文件系统的磁盘结构。

第二种方法即所采用的方法是间接覆盖可用空间。首先,分配它所能分配的最大文件。使用非缓存文件 I/O 完成此任务,这样就不会将 NT 文件系统缓存的内容扔掉,也不会用与 的占用大量空间的文件相关联的无用数据替代这些内容。因为非缓存文件 I/O 必须是扇区(512 字节)对齐的,所以可能存在一些不能为文件分配的剩余空间(即使无法进一步扩大该文件)。为了获取任何剩余空间,接下来会分配它能够分配的最大缓存文件。对于这两个文件,都执行安全覆盖,并且确保所有以前可用的磁盘空间都被安全地清理。 在 NTFS 驱动器上,分配和覆盖这两个文件并非的全部工作。还必须用适合 MFT 记录的文件填充 NTFS MFT(主文件表)的任何现有可用部分。一个 MFT 记录的大小通常为 1KB,而磁盘上的每个文件或目录都至少需要一个 MFT 记录。小文件都整个存储在各自的 MFT 记录中,而对于不适合一个记录的文件,则会为其分配 MFT 外部的簇。为处理可用 MFT 空间而必须完成的全部工作就是分配它能够分配的最大文件 - 当该文件占用 MFT 记录中的所有可用空间时,NTFS 将防止该文件增大,因为磁盘中没有剩余的可用簇(它们正被先前分配的两个文件占用)。然后 将重复此过程。当无法再创建新文件时,它会知道 MFT 中所有先前可用的记录都已完全被安全覆盖文件填充。

 

下一篇会结合实际代码来讲解文件粉碎具体实现和细节。 大家也可以参考下sdelte的实现。




在这个系列课程中,来自微软的权威技术专家将向您解释Windows操作系统的内部工作原理,从系统架构的大局观出发,逐步展示进程、线程、安全机制、内存管理和存储管理等子系统的工作方式。通过对底层原理的揭示,使您更进一步的理解Windows上各类程序的工作方式和如何进行错误诊断及性能优化。 本次课程的内容编排得到了国内知名技术作家,《Windows Internals》一书的中文译者,潘爱民先生的大力支持,同时TechNet也邀请到了众多微软一线技术专家进行讲解。这是一个为IT专业人员量身定做的Windows内部知识课程,在介绍原理的同时,也紧密地围绕实际案例和常见的故障进行分析点评。这是一个系统的学习Windows底层工作机制的好机会,课程内容深入浅出,精彩纷呈,绝对不容错过。 深入研究Windows内部原理系列之一:Windows的昨天、今天和明天 讲师信息:潘爱民 2007年01月25日 14:00-15:30 Level: 300 著名技术作家、微软亚洲研究院研究员潘爱民老师将在这次课程中跟听众分享Windows的发展历程和技术精萃,描绘操作系统的体系架构、Vista的内核变更以及今后版本Windows的发展趋势。 深入研究Windows内部原理系列之二:Windows体系结构-从操作系统的角度 讲师信息:张银奎 2007年01月26日 14:00-15:30 Level: 400 操作系统是计算机系统的灵魂和管理中心,也是软件系统中最复杂的部分。本讲座将以生动的讲解和丰富的演示带您领略Windows操作系统的核心架构和主要组件,包括HAL、内核、执行体、系统进程(IDLE、SMSS.EXE、WinLogon.EXE)和Windows子系统(CSRSS.EXE、WIN32K.SYS以及子系统DLL)等。并讨论中断管理、对象管理、和异常分发等系统机制和实现这些机制的基本数据结构。 深入研究Windows内部原理系列之三:Windows体系结构-从应用程序的角度 讲师信息:曾震宇 2007年01月29日 14:00-15:30 Level: 400 从服务器软件到Office办公应用,从联网游戏到即时消息,不管这些应用的复杂程度如何,他们都是一个个在操作系统控制和管理之下的可执行程序。本次课程邀请微软全球技术中心专家级工程师,为各位讲解一个程序是如何经历从启动、分配资源、运行、结束这一连串的过程,并且介绍其中的重要概念和排错诊断技巧。 深入研究Windows内部原理系列之四:Windows操作系统中的重要基本概念 讲师信息:高宇 2007年01月30日 14:00-15:30 Level: 400 进程、线程、资源分配、内存管理、Win32 API、服务、安全,这些是工作中常常提及但是又无法深入理解的神秘概念。在这次课程中,讲师将介绍Windows中最常见与最重要的一些基本概念. 使大家能够顺利地参与到本系列之后的讨论中去。 深入研究Windows内部原理系列之五:Windows Sysinternals工具集介绍 讲师信息:彭爱华 2007年01月31日 14:00-15:30 Level: 400 Sysinternals Suite(Windows Sysinternals工具集)包含一系列免费的系统工具,其中有大名鼎鼎的Process Explorer、FileMon、RegMon等(在Windows Vista下,FileMon和RegMon则被Process Monitor所代替),如果把系统管理员比喻成战士的话,那么Sysinternals Suite就是我们手中的良兵利器。熟悉和掌握这些工具,并且对Windows的体系有一定的了解,将大幅度的提高日常的诊断和排错能力。本课程将以任务驱动的模式,介绍几个经典的应用案例,来介绍Sysinternals Suite的强大功能。 深入研究Windows内部原理系列之六:Vista新特性底层揭秘 讲师信息:彭爱华 2007年02月01日 14:00-15:30 Level: 400 Windows Vista绝非仅仅是具有诸如3D切换、毛玻璃等炫目的界面效果,花钱购买了Windows Vista,而仅仅为了使用其界面效果,难免有点“买椟还珠”的感觉。实际上Windows Vista值得称道的是它具有很多全新的安全特性,例如用户帐户控制、IE保护模式、服务隔离和Windows资源保护等等。有了这些全新的安全特性,我们就可以在相当的程度上摆脱恶意软件的滋扰。Windows之父Jim Allchin曾经说过不要满足于只知道How-to、小技巧之类的知识,而是应该深入底层了解其内部原理。只有了解了这些安全特性的内在原理,才
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值