NTFS文件系统解析
Posted bcbobo21cn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NTFS文件系统解析相关的知识,希望对你有一定的参考价值。
主文件表 (Master File Table, MFT)
MFT 是由一条条 MFT 项(记录)所组成的,而且每项大小是固定的(一般为1KB),MFT保留了前16项用于特殊文件记录,称为元数据,
元数据在磁盘上是物理连续的,编号为0~15;如果$MFT的偏移为0x0C0000000, 那么下一项的偏移就是0x0C0000400,在下一项就是
0x0C0000800等等;
MFT记录了整个卷的所有文件 (包括MFT本身、数据文件、文件夹等等) 信息,包括空间占用,文件基本属性,文件位置索引,创建时
间用户权限,加密信息等等,每一个文件在 MFT 中都有一个或多个 MFT 项记录文件属性信息,这里的属性包括数据,如果这个文件很小
在 MFT 项中就可以放下,那么这条属性就定义为常驻属性,常驻标志位记为1,如果是非常驻,则有一个索引指向另一条记录(称为一个运行)。
第一条 MFT 项: $MFT
MFT 的第一项记录$MFT描述的是主分区表MFT本身,它的编号为0,MFT项的头部都是如下结构:
typedef struct MFT_HEADER
......
......
Mft_Header, *pMft_Header;
上面的头部结构体在扇区的数据偏移 0x00 ~0x38;
在0x38之后是4条属性,描述名称,时间,索引等等信息,最后以"FF FF FF FF"结束。它们分别以0x10,0x30,
0x80, 0xB0作为标志;这里的四种属性所描述的的信息类型见后;
//------------------ 属性头通用结构 ----
typedef struct NTFSAttribute //所有偏移量均为相对于属性类型 Type 的偏移量
UCHAR Type[4]; // 属性类型 0x10, 0x20, 0x30, 0x40,...,0xF0,0x100
UCHAR Length[4]; // 属性的长度
......
//-------- 常驻属性和非常驻属性的公共部分 ----
union CCommon
//---- 如果该属性为 常驻 属性时使用该结构 ----
struct CResident
UCHAR StreamLength[4]; // 属性值的长度, 即属性具体内容的长度。"48 00 00 00"
......
;
//------- 如果该属性为 非常驻 属性时使用该结构 ----
struct CNonResident
UCHAR StartVCN[8]; // 起始的 VCN 值(虚拟簇号:在一个文件中的内部簇编号,0起)
UCHAR LastVCN[8]; // 最后的 VCN 值
......
;
;
;
由这个结构体可以知道,属性头的长度取决于是否有属性名,属性名长度是多少;是否常驻,如果常驻,属性内容长度是多少,如果非常驻,运行列表有多长。
(0x08)日志文件序列号,它又叫文件参考号、文件引用号,一共 8Byte,前6个字节是文件称为文件号;后2个字节是文件顺序号,文件顺序号随重用而增加。
10H 类型:10H属性$STANDART_INFORMATION,描述的是文件的创建、访问、修改时间,传统属性,以及版本信息等等。
20H类型 $ATTRIBUTE_LIST
30H 类型 $FILE_NAME
30H 类型属性描述的是文件或文件夹的名字和创建基本信息,
40H 属性 $OBJECT_ID
50H 属性 $SECURITY_DESCRIPTOR ( 安全描述符) 略。
60H 属性 $VOLUME_NAME 卷名属性
70H 属性 $VOLUME_INFORMATION 卷版本、状态
80H 属性 $DATA 容纳文件数据(未命名数据流),文件的大小一般指是未命名数据流的大小,没有长度限制,当它为常驻时,数据
长度最小。它的结构为属性头加上数据流,如果数据流太大,则标记为非常驻,以运行的方式索引到外部。例如找一个MP3文件,从它的MFT
项中0x80属性中可以看到它一定是非常驻,它的运行所指向的一系列簇就是音乐文件数据流;
90H 属性 $INDEX_ROOT 索引根。实现NTFS的B+树索引的根节点,总是常驻。索引根属性由属性头、索引根和索引项组成。属性头是通用
属性头的常驻部分。
A0H 属性 $INDEX_ALLOCATION 索引分配属性,也是索引,由属性头和运行列表组成,一般指向一个或多个目录文件(INDX文件,即4K缓存);
A0H属性和90H属性共同描述了磁盘文件和目录的 MFT 记录的位置。第5项MFT的A0H属性记录根目录的位置。
B0H 属性 $BITMAP 位图属性,虚拟簇使用(占用)情况,这条属性用在$MFT和索引中;在Bitmap文件中,每一个 Bit 代表分区的一个簇,置1代表其已使用;
第0个字节的第0位表示分区第0簇,之后依次递增。
C0H 属性 $REPARSE_POINT 重解析点。使应用程序为文件或目录关联一个应用程序数据块,详细略。
D0H $EA_INFORMATION 扩充信息属性。为在NTFS下实现HPFS的OS/2子系统信息,及WinNT服务器的OS/2客户端应用而设置的,一般为非常驻;
E0H $EA 扩充属性 也是为了实现NTFS下的 HPFS,一般为非常驻;
100H $LOGGED_UTILITY_STREAM,EFS加密属性,存储用于实现EFS加密有关的信息,合法用户列表,解密密钥等等;
以上是关于NTFS文件系统解析的主要内容,如果未能解决你的问题,请参考以下文章