NTFS读取要点解析

目录

DBR

$MFT

$Root

文件记录

注意索引信息中除文件和mft序号其他都可能存在值不准情况,一切以MFT中信息为准


 

DBR

DBR中前3个字节一般为EB 52 90,EB在会汇编中为JMP,90为nop。合起来就是跳转52个字节,算上EB 52就是跳转到0x54H处开始执行。如果在此分区上没有安装操作系统,那么0x54H到0x200H无效。

文件系统ID(0x03)可用于判断文件系统。

一个簇大小为每簇扇区数(0x0d)*每扇区字节数(0x0b),不一定总是4K。如果出现解析出数据紊乱,无法识别先检查簇大小。

MFT大小(文件记录大小,0x40,1字节,类型int8)如果为正数,则单位为簇,文件记录大小(字节数)=MFT大小*簇大小。如果为负数,例如-4,文件记录大小(字节数)=2的4次方;例如-6,文件记录大小(字节数)=2的6次方。

$MFT起始簇号(0x30)此信息加上偏移能够准确获取以下文件记录:

  • 第1个记录就是MFT自身。由于MFT文件本身的重要性,为了确保文件系统结构的可靠性,系统专门为它准备了一个镜像文件($MftMirr),也就是MFT中的第2个记录。 
  • 第3个记录是日志文件($LogFile)。该文件是NTFS为实现可恢复性和安全性而设计的。当系统运行时,NTFS就会在日志文件中记录所有影响NTFS卷结构的操作,包括文件的创建和改变目录结构的命令,例如复制,从而在系统失败时能够恢复NTFS卷。 
  • 第4个记录是卷文件($Volume),它包含了卷名、被格式化的卷的NTFS版本和一个标明该磁盘是否损坏的标志位(NTFS系统以此决定是否需要调用Chkdsk程序来进行修复)。 
  • 第5个记录是属性定义表($AttrDef,attribute definition table),其中存放了卷所支持的所有文件属性,并指出它们是否可以被索引和恢复等。 
  • 第6个记录是根目录($Root),其中保存了存放于该卷根目录下所有文件和目录的索引。在访问了一个文件后,NTFS就保留该文件的MFT引用,第二次就能够直接进行对该文件的访问。 
  • 第7个记录是位图文件($Bitmap)。NTFS卷的分配状态都存放在位图文件中,其中每一位(bit)代表卷中的一簇,标识该簇是空闲的还是已被分配了的,由于该文件可以很容易的被扩大,所以NTFS的卷可以很方便的动态的扩大,而FAT格式的文件系统由于涉及到FAT表的变化,所以不能随意的对分区大小进行调整。 
  • 第8个记录是引导文件($Boot),它是另一个重要的系统文件,存放着Windows 2000/XP的引导程序代码。该文件必须位于特定的磁盘位置才能够正确地引导系统。该文件是在Format程序运行时创建的,这正体现了NTFS把磁盘上的所有事物都看成是文件的原则。这也意味着虽然该文件享受NTFS系统的各种安全保护,但还是可以通过普通的文件I/O操作来修改。 
  • 第9个记录是坏簇文件($BadClus),它记录了磁盘上该卷中所有的损坏的簇号,防止系统对其进行分配使用。 
  • 第10个记录是安全文件($Secure),它存储了整个卷的安全描述符数据库。NTFS文件和目录都有各自的安全描述符,为了节省空间,NTFS将具有相同描述符的文件和目录存放在一个公共文件中。 
  • 第11个记录为大写文件($UpCase,upper case file),该文件包含一个大小写字符转换表。 
  • 第12个记录是扩展元数据目录($Extended metadata directory)。 
  • 第13个记录是重解析点文件($Extend\$Reparse)。 
  • 第14个记录是变更日志文件($Extend\$UsnJrnl)。 
  • 第15个记录是配额管理文件($Extend\$Quota)。 
  • 第16个记录是对象ID文件($Extend\$ObjId)。 
  • 第17~23记录是是系统保留记录,用于将来扩展。 

注意:如果由$MFT起始簇号(0x30)计算除系统保留文件记录外的其他记录,如果遇上了MFT碎片必定出错。

MFT(文件记录)碎片:一开始系统会分配整个磁盘的12%(可在注册表控制)用于存放文件记录。如果文件过于零碎,会在数据区额外分配空间用于存放新的MFT,新的MFT如果通过$MFT起始簇号(0x30)+MFT序号*MFT大小必定无法取得。

$MFT

$MFT是一个文件记录,是MFT的第一个。

  • 更新序列号(0x30)、更新数组

如果文件记录跨扇区,扇区的最后2个字节为更新序列号,真正上的值是更新数组(0x32)中的值。

例如第一个扇区,那么实际上值为0x34,占2个字节。如果为第n个扇区,实际上值为0x34+2*n,占2个字节。

 

其中最需要注意的是80属性。

此MFT解析出来的LCN为MFT的位置,依据MFT序号*MFT大小在LCN中找对应MFT位置。

$Root

$Root为根目录,读取到MFT范围后读$Root

文件记录

更新序列、更新数组同$MFT中。

标准信息0x10属性为常驻;

属性列表0x20属性,可能存在多个,每个文件记录中只有1个,但一个文件可能有多个文件记录。注意,常驻时内容为属性内容,非常驻时为数据运行(DataRun或者Run List),数据运行里面才是属性内容

文件名0x30属性,常驻。文件名称可能有多个。

文件属性列表0x80属性。常驻时标准属性头后跟文件内容,非常驻时后面跟数据流Data Run。

索引根0x90属性,常驻。90属性可能存在多个,但做NTFS读取时只用读取命名空间为$I30的属性。$I30代表文件目录,里面是文件基本属性。

索引分配属性0xa0属性。可能存在多个,里面为Data Run。

位图属性0xB0属性。内容一个位代表一个簇是否有效。

0x90、0xA0属性中存储的索引根,里面排序方式是string简单排序。

解析Data Run需注意第一个LCN为绝对地址,第二个LCN为第一个的相对地址(可能为正数,也可能为负数)。

注意索引信息中除文件和mft序号其他都可能存在值不准情况,一切以MFT中信息为准

 

常驻属性
0x10
0x30
0x90

非常驻属性
0xa0

你可能感兴趣的:(c++,Windows,NTFS,windwos,文件系统)