天易loveWord文档下载推荐.docx
《天易loveWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《天易loveWord文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
以往仅仅通过在$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字符,用实心圆点表示。
由于笔者D盘的文件及目录较多,因此存在A0属性,这个索引分配属性可以帮助我们找到所需的文件记录,看一下这个A0属性,如图:
根目录的$A0属性
红色圈内的就是根目录的$A0属性,长$80字节,$01表示非常驻属性,$4是(Datarun)的属性内偏移。
内部圈中就是重要的Datarun数据。
1#$0088B903=8960259簇
$A7F65B因为它的最高二进制位为1,代表一个负数,即-($1000000-$A7F65B)=-5769637(10进制)
所以2#8960259-5769637=3190622簇
同理$FD22也代表一个负数,即-($10000-$FD22)=-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
这里就省去查找过程,我们直接跳转到3#3189888簇。
如图所示。
“手工恢复实例”目录的索引项
图中的字节05表示父目录的文件记录位置为5#;
字节$5C表示自身的文件记录号;
圈中的字节00000010($10000000)表示该索引为目录索引。
我们知道根目录是第5#记录,显然我们已经找到了“手工恢复实例”这个文件夹的目录索引项,而且它的文件记录号是5C#。
所以它位于:
786432*8+92*2=6291640扇区,跳转过去确实是“手工恢复实例”这个文件夹的文件记录,文件记录模板如图所示。
该目录只有$INDEX_ROOT($90)属性,没有$INDEX_ALLOCATION($A0)属性,显然是个小文件夹,事实也确实如此。
$INDEX_ROOT($90)属性总是常驻属性,它作为一棵B+tree的根节点。
该根节点中可能存放多个索引项,数目依文件记录剩余空间大小而定;
这些索引项可以提高NTFS系统访问文件、文件夹的效率,减少磁头读写硬盘的次数,加快定位文件记录的速度。
简单提一下,通常我们会发现$INDEX_ROOT($90)属性这个B+tree的根节点中并没有索引项,难道真就没有索引项了吗?
其实不然,由于文件记录的空间有限,当B+tree的根节点无法容纳所有的索引项时,NTFS系统会把它们放到B+tree的子节点中去,仅在根节点中留下这个特殊子节点的信息,方便查询。
在这个特殊的子节点中,存放着特殊的索引项;
这些索引项都是B+tree在节点分裂过程中产生的,它们携带着特殊的信息,把它们集中在一块,方便NTFS系统的查询和定位操作。
以下示意图会帮助你加深理解。
B+tree在NTFS中的运用
$INDEX_ALLOCATION($A0)属性即索引分配缓冲区属性,存放着B+tree所有子节点的信息,它总是非常驻属性。
“手工恢复实例”的文件记录模板
“手工恢复实例”的$90属性
USA数组
由于$90属性正好包含扇区尾部的USN,所以我们要到USA数组中把原来的数据找回来。
文件记录头部的30字节指示了USA数组在文件记录内部的偏移,而紧跟的03字节表示USA数组的大小(以word大小为单位),这里是3表示USA数组有3个WORD。
除去第一个USN(1100)和尾部结束标志(0000),实际的有效数据只有一个word(3456)。
我们把word(3456)替换掉$90属性中的USN(1100),得到一串Unicode编码:
“4696B65B34562E00720061007200”,这正是字符串“陆家嘴.rar”对应的16进制Unicode编码“4696B65B34562E00720061007200”。
圈中的字节B37A0200($27AB3)为“陆家嘴.rar”文件的实际大小162483字节;
字节20表示这是一个文件索引项;
字节5c是父目录的文件记录号;
第一处划线的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#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文件
图片正常显示