基于Windows的磁盘数据清除技术
一个目录的MFT将其目录中的文件名与子目录名进行排序,并保存在索引根属性中。所以可以通过访问根目录的索引分配找到磁盘上面的一级目录,并记录下其MFT参考号,然后在通过该参考号获取MFT文件,进而再找到其索引分配,就可以将一级目录下的子目录全部及找到,直到不再有子目录为止。可建立出整个磁盘的目录树,每项MFT文件中都记录了该文件是被删除或正在被使用的目录。通过解析以上分析的属性就能获取这些信息,该算法流程如图1所示。本文引用地址://m.amcfsurvey.com/article/202325.htm
图中每一步操作都是根据MFT表的属性进行编码。
第一步从分区信息表即中可以获得这些有用的信息。读取特定扇区的信息可以调用CreateFile与ReadFile来实现。读取某个MFT元文件的具体方法是:通过BPB参数获取$MFT的位置,然后根据源文件的MFT记录号,移动句柄,就可以顺利读取MFT元文件。由于每个MFT文件的大小是1 kB,所以句柄的偏移dwStartSector=MFT文件记录号×2+$MFT所在的扇区号。即可访问任何一个磁盘的MFT元数据文件信息。
第二步根据根目录的MFT文件信息,解析索引A0H属性从而找出索引信息,这涉及到解码二进制文件。
第三步根据索引中的信息找出根目录的子目录的MFT编号,再根据这个编号打开MFT文件内容,找出30H属性与MFT属性头,解析文件名,以及标记文件是否为目录,是否被删除的信息。
第四步如果该文件是目录,则继续查找它下面的子目录,否则转第五步。
第五步 如果该文件已删除,则返回第一步;否则,打开它对应的MFT文件,然后解析80H属性,找到文件数据段开始的簇号,并记录下来。
2.2 建立磁盘对应的文件树
建立一个N叉树来表示每一个磁盘中的文件存放,只是它的数据信息就是上面获取的文件数据段开始的簇的编号。遍历文件树的过程,即是获取簇号以及对相应簇的信息进行清除的过程。每个磁盘中MFT表的数量巨大,所以在遍历完根目录下子目录的所有文件时,要删除该子树,便于释放内存,从而减少算法的空间开销。而且N叉树的数据结构本身对遍历效率也有很大提升,笔者采用深度优先递归搜索,并对此进行优化,取得了良好效果。
评论