文件系统解析(一)"/>
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]; // unusedb8 media_descriptor; // Provides information about the media being used.b8 resv2[2]; // Value must be 0b16 resv3; // The number of sectors in a track.b16 resv4; // The number of headsb8 resv5[8];
} Bpb;// LCN = Logical Cluster Number
typedef struct {b8 resv1[4]; // Usually 80 00 80 00b64 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 instructionb8 jmp_code[3]; // 跳转指令// OEM IDb8 oem_id[8]; // 文件系统厂商的ID const char kNtfsSignature[] = "NTFS ";// Bpb and extended BpbBpb bpb; // BPB ExtendBpb extend_bpb; // 扩展BPB// boot codeb8 boot_code[426]; // 引导代码// 0x55AAb8 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文件系统解析(一)
发布评论