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$MFTMirrMFT前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_STREAMEFS加密属性:该属性主要用于存储实现EFS加密的有关加密信息,如合法用户列表、解码密钥等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值