1、以往仅仅通过在$MFT内部搜索指定文件的文件记录,而后分析其中的$DATA属性的办法,这种方法涉及到的NTFS知识点还不是很多。 首先在WinHex中打开文件所在的逻辑磁盘,如图所示。图x-x选择磁盘分区打开后找出以下几处数据,如图所示。分区开始处的数据$200*$08=$1000=4096字节/簇(10进制)$000C0000=786432 簇这样$MFT的位置就确定了。转到$MFT根目录的文件记录我们知道根目录是第5#记录,且每个文件记录占用2个扇区,所以根目录位于:786432*8+5*2=6291466扇区图中的字节03表示根目录的命名符合Win32 &DOS规则,仅一个unicode
2、字符,用实心圆点表示。由于笔者D盘的文件及目录较多,因此存在A0属性,这个索引分配属性可以帮助我们找到所需的文件记录,看一下这个A0属性,如图:根目录的$A0属性红色圈内的就是根目录的$A0属性,长$80字节,$01表示非常驻属性,$4是(Data run)的属性内偏移。内部圈中就是重要的Data run数据。1# $0088B903=8960259簇$A7F65B 因为它的最高二进制位为1,代表一个负数,即-($1000000- $A7F65B)= -5769637(10进制)所以2# 8960259-5769637=3190622簇同理$FD22也代表一个负数,即-($10000- $FD
3、22)= -734 (10进制)所以3# 3190622-734=3189888簇依次类推,所有簇分布如下: 1# 8960259簇 2# 3190622簇 3# 3189888簇 4# 3822487簇 5# 10704273-10704274 (2簇) 6# 10693948簇 7# 10683941簇 8# 13267096簇 9# 15336964簇 10# 13125728簇在这些簇中存放着根目录下的文件、目录的相关索引,现在要做的就是到这些簇中找“手工恢复实例”这个目录的索引项,纯体力活。“手工恢复实例”对应的Unicode编码为:4B62E55D62600D599E5B8B4F这
4、里就省去查找过程,我们直接跳转到3# 3189888簇。如图所示。“手工恢复实例”目录的索引项图中的字节05表示父目录的文件记录位置为5#;字节$5C表示自身的文件记录号;圈中的字节00 00 00 10($10000000)表示该索引为目录索引。我们知道根目录是第5#记录,显然我们已经找到了“手工恢复实例”这个文件夹的目录索引项,而且它的文件记录号是5C#。所以它位于:786432*8+92 *2=6291640扇区,跳转过去确实是“手工恢复实例”这个文件夹的文件记录,文件记录模板如图所示。该目录只有$INDEX_ROOT ($90)属性,没有$INDEX_ALLOCATION ($A0)
5、属性,显然是个小文件夹,事实也确实如此。$INDEX_ROOT ($90)属性总是常驻属性,它作为一棵B+ tree的根节点。该根节点中可能存放多个索引项,数目依文件记录剩余空间大小而定;这些索引项可以提高NTFS系统访问文件、文件夹的效率,减少磁头读写硬盘的次数,加快定位文件记录的速度。简单提一下,通常我们会发现$INDEX_ROOT ($90)属性这个B+ tree的根节点中并没有索引项,难道真就没有索引项了吗?其实不然,由于文件记录的空间有限,当B+ tree的根节点无法容纳所有的索引项时,NTFS系统会把它们放到B+ tree的子节点中去,仅在根节点中留下这个特殊子节点的信息,方便查询
6、。在这个特殊的子节点中,存放着特殊的索引项;这些索引项都是B+ tree在节点分裂过程中产生的,它们携带着特殊的信息,把它们集中在一块,方便NTFS系统的查询和定位操作。以下示意图会帮助你加深理解。B+ tree在NTFS中的运用$INDEX_ALLOCATION ($A0)属性即索引分配缓冲区属性,存放着B+ tree所有子节点的信息,它总是非常驻属性。“手工恢复实例”的文件记录模板“手工恢复实例”的$90属性USA数组 由于$90属性正好包含扇区尾部的USN,所以我们要到USA数组中把原来的数据找回来。文件记录头部的30字节指示了USA数组在文件记录内部的偏移,而紧跟的03字节表示USA数
7、组的大小(以word大小为单位),这里是3表示USA数组有3个WORD。除去第一个USN(11 00)和尾部结束标志(0000),实际的有效数据只有一个word(34 56)。 我们把word(34 56)替换掉$90属性中的USN(11 00),得到一串Unicode编码:“4696B65B34562E00720061007200”,这正是字符串“陆家嘴.rar”对应的16进制Unicode编码“4696B65B34562E00720061007200”。圈中的字节B3 7A 02 00($27AB3)为“陆家嘴.rar”文件的实际大小162483字节;字节20表示这是一个文件索引项;字节5
8、c是父目录的文件记录号;第一处划线的00是常驻属性标志;我们需要的是字节63(16进制),它就是“陆家嘴.rar”这个压缩文件的文件记录号。“陆家嘴.rar”的文件记录模板 它位于:786432*8+99 *2=6291654扇区,跳转过去取得文件记录模板如图所示。“陆家嘴.rar”的文件记录模板提取出datarun字节:“3101F0013041278C809700”计算如下:1# $3001F0=3146224簇因为$0097808C最高二进制位为0,代表一个正数,即9928844 (10进制)所以2# 3146224+9928844=13075068簇综上: 1# 3146224簇 2#
9、 13075068-13075106 (39簇)刚才得到文件的实际大小为:162483字节,除去1#占用4096,那么2#占用了158387字节。可以算出2#碎片第39簇占用的有效字节数:158387-38*4096=2739字节。现在就可以直接提取这两部分的数据,再组合成一个文件即可。具体操作可以这样:先新建一个大小为162483字节的空白文件;新建一个空白文件接着跳转到1# 3146224簇,复制出该簇数据共4096字节写入空白文件;写入空白文件选择剪贴板格式继续复制2# 13075068-13075106 (39簇)处的数据,注意最后一簇仅有2739字节的有效数据,复制出来后,追加到刚才写入数据的后面;最后保存为“data.rar”,并放置到到其他分区,这样可以确保不覆盖掉当前卷中的其他有用数据。提取出的压缩文件数据完好,包含图片可以正常显示。提取出的rar文件图片正常显示
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1