建议先了解NTFS
MFT由一个个表项构成,每一个表项是一个文件记录,大小一般为1KB(两个扇区),记录着卷中每一个目录和文件的信息,每个文件记录的结构都是固定的,由文件记录头和若干属性构成。下面给一个截图:
数据读取为小端字节序
0xB~0xC: 每扇区字节数
0xD: 每簇的扇区数
0x30~0x37: MFT的偏移(单位簇)786432乘 8 等于 6291456个扇区,我们转到该分区 的第 6291456扇区,就是MFT文件的第一个扇区了
MFT由一个个表项构成,每一个表项是一个文件记录,大小一般为1KB(两个扇区),记录着卷中每一个目录和文件的信息,每个文件记录的结构都是固定的,由文件记录头和若干属性构成。
属性有常驻属性和非常驻属性之分,当一个属性的数据能够在1KB的文件记录中保存的时候,该属性为常驻属性;而当属性的数据无法在文件记录中存放,需要存放到MFT外的其他位置时,该属性为非常驻属性。
下面是一个90属性和A0属性的截图:
前面我们通过计算得到,MFT的偏移为6,291,456个扇区,而根目录的文件记录是MFT的第5项,一个MFT表项占2个扇区,所以根目录的文件记录的偏移为6,291,456 + 2 * 5 = 6,291,466个扇区。转到该扇区,可以看到根目录的文件记录如下:
A0属性的属性体即为Data Runs,指向若干个索引区域的簇流(若干个物理上连续的簇称为一个簇流)。以上图的Data Runs为例:【11012C00 00 00 00 00】第一个字节【11】中的第二个1,表示接下来占用“1”个字节,用来存储该簇流占用簇的个数,即紧随其后的一个字节【01】,表示这个簇流占了0X01个簇的空间。第一个字节【11】中的第一个1,表示接下再占用“1”个字节,用来存储该簇流的偏移,即字节【2C】,表示偏移量为0X2C个簇。再往后一个字节为【00】,是结束标志。也就是说,该Data Runs只有一个簇流,而这个簇流包含一个簇,簇流的起始偏移为0X2C个簇,一个簇为8个扇区,即根目录所指向的索引区的偏移为44 * 8 = 352个扇区。
我们计算出data runs指向的索引区的偏移为352个扇区,转到第352扇区,即索引区第一个扇区的位置,我们将看到如下数据
在标准索引头中,几个比较重要的数据如下: (1)索引项的偏移:即第一个标准索引项的偏移。在上图中为0X 00 00 00 40,这个偏移是相对于当前位置的偏移,即相对于字节【40】而言,偏移0X40个字节。 (2)索引项的大小:表示这个簇中,有效的索引项和索引头的总字节数。在上图中为0X 00 00 0A 80,即2688个字节,超出该范围的索引项为无效的索引项。
在索引中找到含hello的索引项,如下图:
标准索引项的结构已给出,其中几个重要的数据: (1)文件的MFT参考号:低6字节是目录或者文件对应的文件记录的编号,由于MFT是顺序存储的,根据该编号可以定位到该文件记录在MFT中的位置。在上图中,hello.txt的MFT参考号为0X 00 00 00 00 00 29,即hello.txt的文件记录是MFT的第0X29,即第41项。之前已计算出MFT的偏移为6,291,456扇区,每一项占用2个扇区,因此hello.txt的文件记录的偏移为6,291,456 + 2 * 41 = 6291538扇区。如下图:
或者在winhex的search里先打开MTF目录(减小查找范围),然后选择find text,查找hello,也可得到如下位置
删除文件后,只需将文件数据导出至新文件即可
常驻属性,文件数据在MTF中,
非常驻属性时,80属性体是一个data runs,指向存放该文件数据的簇,同样根据簇号定义到指定位置即可