NTFS 文件系统的主要数据结构
- 格式:pdf
- 大小:222.22 KB
- 文档页数:4
上一页下一页2 Windows NT的文件系统1. 概述(1)NTFS为多级目录结构,支持文件别名(符号链接方式);(2)NTFS文件由多个文件属性构成,每个属性由属性名和属性流(stream, 简单字节队列)组成;用户可自定义属性;(3)NTFS支持用户权限管理:有5种权限划分:读、写、运行、删除和修改权限;支持按用户、用户组分配权限;(4)NTFS文件支持数据压缩功能;(5)NTFS卷结构支持容错功能.2. NTFS结构NTFS的结构以卷为单位,卷与磁盘分区相关;卷由一组文件和未分配空间组成.NTFS以簇为基本硬盘分配单位,簇的大小为物理扇区的整数倍,通常为2K倍。
NTFS卷上的所有数据(包括用于引导、定位、空间分配等文件系统管理数据)都以文件的形式保存.NTFS结构由一组元文件构成:(1)主文件表($MFT):文件记录数组,每个记录为1KB;每个文件对应一个或多个文件记录;(2)主文件表副本($MFTMirr):是主文件表中前几项的副本,用于在主文件表不能读取时的元文件定位;(3)卷结构日志($LogFile):记录所有影响NTFS卷结构的操作,用于系统失败后的卷恢复;(4)空间分配位图($Bitmap):标识卷中每个簇的分配状态,即:空闲和已被分配;(5)引导文件($Boot):引导程序代码;(6)坏簇文件($BadClus):记录卷中据有损坏位置;(7)卷文件($V olume):卷名、文件系统版本、卷状态(卷是否被损坏);(8)属性定义表($AttrDef):卷中支持的属性类型列表.文件引用号:在主文件表中每个文件记录有一个64位的文件引用号;它由文件号和顺序号组成,文件号(48位:47~0)是文件在主文件表中的位置序号,顺序号(16位:63~48)在每次重复使用该文件记录时加1;NTFS文件是属性的集合,通常所说的文件内容是指未命名数据属性流.例:我们定义两个数据属性:ntfile(数据)和ntfile:data(自定义数据)。
NTFS文件系统NTFS(New Technology File System,新技术文件系统),是以MFT(Master File Table,主文件表或主索引记录)为核心,将整个分区的系统文件和用户文件有机地组织起来的文件系统。
NTFS最基本的原则:·磁盘上任何对象包括目录都是一种文件,都使用文件记录进行管理。
·所有与文件相关的项目,包括数据都被认为是属性。
·属性分常驻(在记录中)和非常驻两种,非常驻的大文件夹使用B+树结构进行管理。
·簇是NTFS最小的基本单位,一个1字节的文件也要占用一簇的空间。
·流是NTFS最基本的存储单元,是文件属性和属性值的集合。
●MFT文件◇MFT的位置和作用:MFT文件和它的备份,位于NTFS分区中部,前后都是数据区,能更好地受到保护。
与FAT 系统先放文件分配表,后接数据区的做法不同。
XP系统的NTFS分区,大致布局如下图:分区所有的文件,其相关的文件信息都保存在MFT中。
小于1K的小文件(目录),其整个内容都保存在MFT中。
大于1K的大文件(目录),只有它的起始信息保存在MFT中。
在NTFS中,文件通过主文件表MFT定位。
MFT是组织、架构NTFS文件系统最主要的数据库文件,对NTFS分区的性能有着至关重要的影响。
◇ID编号(MFT Entry Value,文件号):分区中的所有文件和目录(包括MFT文件自身),都被系统ID编号(编号0为MFT文件),并将它们的各类属性、起始信息或全部内容,以文件记录的形式,保存在MFT中。
分区高级格式化成NTFS文件系统时,首先建立了一个主文件表MFT。
在MFT文件中,会预先建立16个重要的文件(MFT记录的ID编号固定为0-15)和8个保留文件(MFT记录的ID编号固定为16-23),这24个文件是被称为元文件(Metafiles)或元数据(metadata)的系统文件(具体内容见后面),供系统本身组织、架构文件系统使用。
解读NTFSNTFS是一个比FAT复杂的多的文件系统,我们一起努力来把它完整的解读出来NTFS的引导扇区也是完成引导和定义分区参数,和FAT分区不同,FAT分区的B OOT记录正常,就显示分区没有错误,即使文件不正确,而NTFS分区的BOOT不是分区的充分条件,它要求必须MFT中的系统记录如$MFT等正常该分区才能正常访问。
其BPB参数如下表所示。
字节偏移长度常用值意义0x0B 字 0x0002 每扇区字节数0x0D 字节 0x08 每簇扇区数0x0E 字 0x0000 保留扇区0x10 3字节 0x000000 总为00x13 字 0x0000 NTFS未使用,为00x15 字节 0xF8 介质描述0x16 字 0x0000 总为00x18 字 0x3F00 每磁盘扇区数0x1A 字 0xFF00 磁头数0x1C 双字 0x3F000000 隐含扇区0x20 双字 0x00000000 NTFS未使用,为00x28 8字节 0x4AF57F0000000000 扇区总数0x30 8字节 0x0 $MFT的逻辑簇号0x38 8字节 0x54FF0000 $MFTMirr的逻辑簇号0x40 双字 0xF6000000 每MFT记录簇数0x44 双字 0x01000000 每索引簇数0x48 8字节 0x14A51B74C91B741C 卷标0x50 双字 0x00000000 检验和MFT中的文件记录大小一般是固定的,不管簇的大小是多少,均为1KB。
文件记录在MFT文件记录数组中物理上是连续的,且从0开始编号,所以,NTFS是预定义文件系统。
MFT仅供系统本身组织、架构文件系统使用,这在NTFS中称为元数据(metadata,是存储在卷上支持文件系统格式管理的数据。
它不能被应用程序访问,只能为系统提供服务)。
其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。
这些元数据文件的名字都以“$”开始,所以是隐藏文件,在Windows 2000/XP中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出。
NTFS文件解析系统的简单分析正如我们所知道的,目前主流anti-rootkit检测隐藏文件主要有两种方法,一种是文件系统层的检测(像IceSword自己构造irp包发到文件系统驱动),另一种就是磁盘级别的低级检测,直接对磁盘的数据进行分析,比如SnipeSword、filereg和unhooker.最近对第二种方法的一部分(及NTFS文件系统的解析)做了一些学习,于是就写点学习的东西与大家分享,其中有很多错误和不足希望大牛们指出。
(1)准备工作――获取分区的一些基本参数我们可以用CreateFile打开某个盘,读取偏移为0的扇区的数据。
具体的数据结构为:typedef struct tag_NTFSBPB{BYTE bJmp[3];//跳转指令BYTE bNTFlags[4]; // 文件系统NTFS的为"NTFS"BYTE bReserve1[4]; //一般为四个空格WORD wBytePerSector;//每扇区字节数BYTE bSectorPerCluster//;每簇扇区数WORD wReserveSectors;//保留扇区数BYTE bFatNum; // 总是0WORD wRootDirNum; //总是0WORD wSectorOfParti; //总是0BYTE bMedium;//WORD wSectorPerFat; //总是0WORD wSectorPerTrack;//WORD wHeadNum;//DWORD dwHideSector;//DWORD dwSectoOfParti; //总是0BYTE bDeviceFlag;//BYTE bReserve2;//WORD wReserve3;//ULONGLONG ullSectorsOfParti; //扇区总数ULONGLONG ullMFTAddr;//$MFT的起始逻辑簇号ULONGLONG ullMFTMirrAddr;// $MFT的起始逻辑簇号BYTE bClusterPerFile;//BYTE bReserve4[3];//DWORD dwClusterPerINDX;//BYTE bSerialID[8];//} NTFSBPB, *LPNTFSBPB;其中最重要的应该就是通过ullMFTAddr获得$MFT的起始逻辑簇号进而找到根图(1)目录的位置在进行分析。
NTFS文件系统结构分析在NTFS文件系统中,文件存取是按簇进行分配,一个簇必需是物理扇区的整数倍,而且总是2的整数次方。
NTFS文件系统并不去关心什么是扇区,也不会去关心扇区到底有多大(如是不是512字节),而簇大小在使用格式化程序时则会由格式化程序根据卷大小自动的进行分配。
文件通过主文件表(MFT)来确定其在磁盘上的存储位置。
主文件表是一个对应的数据库,由一系列的文件记录组成--卷中每一个文件都有一个文件记录(对于大型文件还可能有多个记录与之相对应)。
主文件表本身也有它自己的文件记录。
NTFS卷上的每个文件都有一个64位(bit)称为文件引用号(File Reference Number,也称文件索引号)的唯一标识。
文件引用号由两部分组成:一是文件号,二是文件顺序号。
文件号为48位,对应于该文件在MFT中的位置。
文件顺序号随着每次文件记录的重用而增加,这是为NTFS进行内部一致性检查而设计的。
NTFS使用逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)来进行簇的定位。
LCN是对整个卷中所有的簇从头到尾所进行的简单编号。
卷因子乘以LCN,NTFS就能够得到卷上的物理字节偏移量,从而得到物理磁盘地址。
VCN则是对属于特定文件的簇从头到尾进行编号,以便于引用文件中的数据。
VCN可以映射成LCN,而不必要求在物理上连续。
NTFS的目录只是一个简单的文件名和文件引用号的索引,如果目录的属性列表小于一个记录的长度,那么该目录的所有信息都存储在主文件表的记录中,对于大于记录的目录则使用B+树进行管理。
主文件表中的基本文件记录中有一个指针指向一个存储非常驻索引缓冲--包括该目录下所有下一级子目录和文件的外部簇,而B+树结构便于大型目录中文件和子目录的快速查找。
在NTFS中,所有存储在卷上的数据都包含在文件中,包括用来定位和获取文件的数据结构,引导程序和记录这个卷的记录(NTFS元数据)的位图,这体现了NTFS的原则:磁盘上的任何事物都为文件。
NTFS⽂件系统详细分析第⼀部分什么是NTFS⽂件系统想要了解NTFS,我们⾸先应该认识⼀下FAT。
FAT(File Allocation Table)是“⽂件分配表”的意思。
对我们来说,它的意义在于对硬盘分区的管理。
FAT16、FAT32、NTFS是⽬前最常见的三种⽂件系统。
FAT16:我们以前⽤的DOS、Windows 95都使⽤FAT16⽂件系统,现在常⽤的Windows 98/2000/XP等系统均⽀持FAT16⽂件系统。
它最⼤可以管理⼤到2GB的分区,但每个分区最多只能有65525个簇(簇是磁盘空间的配置单位)。
随着硬盘或分区容量的增⼤,每个簇所占的空间将越来越⼤,从⽽导致硬盘空间的浪费。
FAT32:随着⼤容量硬盘的出现,从Windows 98开始,FAT32开始流⾏。
它是FAT16的增强版本,可以⽀持⼤到2TB(2048GB)的分区。
FAT32使⽤的簇⽐FAT16⼩,从⽽有效地节约了硬盘空间。
NTFS:微软Windows NT内核的系列操作系统⽀持的、⼀个特别为⽹络和磁盘配额、⽂件加密等管理安全特性设计的磁盘格式。
随着以NT为内核的Windows 2000/XP的普及,很多个⼈⽤户开始⽤到了NTFS。
NTFS也是以簇为单位来存储数据⽂件,但NTFS中簇的⼤⼩并不依赖于磁盘或分区的⼤⼩。
簇尺⼨的缩⼩不但降低了磁盘空间的浪费,还减少了产⽣磁盘碎⽚的可能。
NTFS⽀持⽂件加密管理功能,可为⽤户提供更⾼层次的安全保证。
在NTFS⽂件系统中,⽂件存取是按簇进⾏分配,⼀个簇必需是物理扇区的整数倍,⽽且总是2的整数次⽅。
NTFS⽂件系统并不去关⼼什么是扇区,也不会去关⼼扇区到底有多⼤(如是不是512字节),⽽簇⼤⼩在使⽤格式化程序时则会由格式化程序根据卷⼤⼩⾃动的进⾏分配。
⽂件通过主⽂件表(MFT)来确定其在磁盘上的存储位置。
主⽂件表是⼀个对应的数据库,由⼀系列的⽂件记录组成--卷中每⼀个⽂件都有⼀个⽂件记录(对于⼤型⽂件还可能有多个记录与之相对应)。
NTFS文件系统结构总览数据恢复迷当用户将硬盘的一个分区格式化为NTFS分区时,就建立了一个NTFS文件系统结构。
NTFS文件系统与FAT文件系统一样,也是用簇为基本单位对磁盘空间和文件存储进行管理的。
一个文件总是占有若干个簇,即使在最后一个簇没有完全放满的情况下,也是占用了整个簇的空间,这也是造成磁盘空间浪费的主要原因。
文件系统通过簇来管理磁盘,并不需要知道磁盘扇区的大小,这样就使NTFS保持了与磁盘扇区大小的独立性,从而使不同大小的磁盘选择合适的簇。
NTFS分区也被称为NTFS卷,卷上簇的大小,又称为卷因子,其大小是用户在创建NTFS卷时确定的。
和FAT文件系统一样,卷因子的大小和文件系统的性能有着非常直接的关系。
当一个簇占用的空间太小时,会出现太多的磁盘碎片,这样在空间和文件访问时间上会造成浪费;而相反的当一个簇占用的空间太大时,直接造成了磁盘空间的浪费。
因此,最大限度地优化系统对文件的访问速度和最大限度地减少磁盘空间的浪费是确定簇的大小的主要因素。
簇的大小一定是扇区大小的整数倍,通常是2n(n为整数)。
表4-28是NTFS文件系统中不同卷大小和簇的一般关系。
当然这并不是完全一定的,只是系统格式化磁盘时的默认情况,这个默认的簇的值一般被认为是最能优化系统的值。
表4-28 NTFS卷大小和簇大小关系表卷大小(MB)每簇的扇区默认的簇大小≤512 1 512个字节513~1024 2 1024个字节(1KB)1025~2048 4 2048个字节(2KB)≥20498 4KB当一个分区由FAT卷转变成为一个NTFS卷时,卷因子的大小总是占用一个扇区。
NTFS文件系统使用了逻辑簇号(Logical Cluster Number,LCN)和虚拟簇号(Virtual Cluster Number,VCN)对卷进行管理。
其中LCN是对卷的第一个簇到最后一个簇进行编号,只要知道LCN号和簇的大小以及NTFS卷在物理磁盘中的起始扇区(绝对扇区)就可以对簇进行定位,而这些信息在NTFS卷的引导扇区中可以找到(BPB参数),在系统底层也是用这种方法对文件的簇进行定位的。