NTFS文件系统解析(一)

1、引言

说到Windows操作系统,就不可避免的要提及NTFS文件系统了。NTFS(New Technology File System)是微软1993年推出用于NT内核的文件系统,相较于原来的FAT文件系统,性能有了极大的提升。可以说,从NTFS文件系统诞生之初,就与Windows操作系统密不可分了。

但是,由于Windows操作系统的封闭性,我们无法准确得知NTFS文件系统的具体实现,因此,只能通过少量的官方文档和逆向分析的方式来推导NTFS文件系统的工作流程。

2、引导扇区

熟悉ext文件系统的同学们都知道,在ext文件系统的第一个扇区上存储着超级快。而NTFS文件系统也是一样,在卷的第一个的扇区中存储着NTFS文件系统的基本信息。

typedef struct {
  b16 bytes;            // The size of a hardware sector. 每个物理扇区的字节数
  b8 sectors;           // The number of sectors in a cluster. 每个簇的扇区数
  b8 resv1[7];          // unused
  b8 media_descriptor;  // Provides information about the media being used.
  b8 resv2[2];          // Value must be 0
  b16 resv3;            // The number of sectors in a track.
  b16 resv4;            // The number of heads
  b8 resv5[8];
} Bpb;

// LCN = Logical Cluster Number
typedef struct {
  b8 resv1[4];          // Usually 80 00 80 00
  b64 sectors;          // The total number of sectors on the hard disk. 磁盘的总扇区数
  b64 lcn_mft;          // LCN of the $MFT      $MFT的逻辑簇号
  b64 lcn_mft_mirr;     // LCN of the $MFTMirr  $MFTMirr的逻辑簇号
  b8 clusters_per_mft;  // The number of cluster of each record  每个文件记录的簇数
  b8 resv2[3];
  b8 clusters_per_idx;  // The number of cluster of each index   每个索引的簇数
  b8 resv3[3];
  b8 volume_serial_number[8];
  b8 resv4[4];
} ExtendBpb;

typedef struct {
  // jump instruction
  b8 jmp_code[3];  // 跳转指令

  // OEM ID
  b8 oem_id[8];    // 文件系统厂商的ID const char kNtfsSignature[] = "NTFS    ";

  // Bpb and extended Bpb
  Bpb bpb;               // BPB 
  ExtendBpb extend_bpb;  // 扩展BPB

  // boot code
  b8 boot_code[426]; // 引导代码

  // 0x55AA
  b8 mark_AA;        // 结束标志
  b8 mark_55;        // 结束标志
} BootSector;

3、文件记录

在NTFS文件系统中最基本的单位就是文件记录FileRecord。每个文件或者目录都对应一个或者多个文件记录。
而其中每一个记录都由文件记录头和多个文件属性组成,这些文件属性就构成了一个文件或者目录的主体。

为了方便操作系统的管理,NTFS预定义了16个文件记录作为文件系统的跟记录。

逻辑簇 名称 描述
0 $MFT 主文件表,包含所有文件的记录信息
1 $MFTMirr MFT前4个记录的备份数据
2 $LogFile 日志文件
3 $Volume 卷信息
4 $AttrDef 属性定义表,定义了NTFS支持的属性信息
5 . 根目录
6 $Bitmap 簇位图,记录当前簇的使用情况
7 $Boot 卷的引导记录
8 $BadClus 列出所有的坏簇
9 $Secure 存储卷的安全描述符
10 $UpCase 大小写字符转换表
11 $Extend 扩展元数据目录
12-15 保留记录 标识为使用实际为空的记录
16-23 保留记录 标识为未使用的记录

通常情况下,当需要从卷中读取文件时,只需要从根目录从查询出文件对应的逻辑簇号(LCN),再根据LCN从MFT记录读取出文件的记录即可。

4、属性

前面说过,文件记录由两部分构成,一部分是文件记录头,另一部分是属性列表。在NTFS系统中所有与文件相关的数据均被认为是属性,包括文件的内容。文件记录是一个与文件相对应的文件属性数据库,它记录了文件数据的所有属性。

每个文件记录中都有多个属性,它们相对独立,有各自的类型和名称。一个属性的偏移00H~03H处的4个字节,为该属性的类型标志,不同的属性其结构和含义各不相同。

属性类型 属性类型名 属性描述
10 00 00 00 $STANDARD_INFORMATION 标准信息:包括一些基本文件属性,如只读、系统、存档;时间属性,如文件的创建时间和最后修改时间;有多少目录指向该文件(即其硬连接数(hard link count))
20 00 00 00 $ATTRIBUTE_LIST 属性列表:当一个文件需要多个文件记录时,用来描述文件的属性列表
30 00 00 00 $FILE_NAME 文件名:用Unicode字符表示的文件名,由于MS-DOS不能识别长文件名,所以NTFS系统会自动生成一个8.3文件名
40 00 00 00 $VOLUME_VERSION 在早期的NTFS v1.2中为卷版本
40 00 00 00 $OBJECT_ID 对象ID:一个具有64字节的标识符,其中最低的16字节对卷来说是唯一的
50 00 00 00 $SECURITY_DESCRIPTOR 安全描述符:这是为向后兼容而保留的,主要用于保护文件以防止没有授权的访问,但Windows 2000/XP中已将安全描述符存放在$Secure元数据中,以便于共享
60 00 00 00 $VOLUME_NAME 卷名(卷标识):该属性仅存在于$Volume元文件中
70 00 00 00 $VOLUME_INFORMATION 卷信息:该属性仅存在于$Volume元文件中
80 00 00 00 $DATA 文件数据:该属性为文件的数据内容
90 00 00 00 $INDEX_ROOT 索引根
A0 00 00 00 $INDEX_ALLOCATION 索引分配
B0 00 00 00 $BITMAP 位图
C0 00 00 00 $SYMBOLIC_LINK 在早期的NTFS v1.2中为符号链接
C0 00 00 00 $REPARSE_POINT 重解析点
D0 00 00 00 $EA_INFORMATION 扩充属性信息
E0 00 00 00 $EA 扩充属性
F0 00 00 00 $PROPERTY_SET 早期的NTFS v1.2中才有
00 10 00 00 $LOGGED_UTILITY_STREAM EFS加密属性:该属性主要用于存储实现EFS加密的有关加密信息,如合法用户列表、解码密钥等

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