当前位置:0101部落 >> 技术文档 >> Windows >> 浏览文章 【字体:
解析NTFS底层结构
作者:晏植 日期:2007年08月02日 阅读次数: 来源:本站原创
 

0X60 2L 24004d004600 以Unicode方式标识的文件名 
表7 文件名属性说明

 
标志 意义 描述   
0 POSIX 这是最大的命名空间。它大小写敏感,并允许使用除NULL(0)和左斜框(/)以外的所有Unicode字符作为文件名,文件名最大长度为255个字符。有一些字符,如冒号(:),在NTFS下有效,但WINDOWS不让使用。   
1 WIN32 WIN32和POSIX命名空间的一个子集,不区分大小写,可以使用除“*/:<>?\|”以外的所有Unicode字符。另外,文件不能以句点和空格结束。   
2 DOS DOS是WIN32命名空间的一个子集,要求比空格的ASC||码要大,且不能使用* + / , : ; < > ? \ | 等字符,另外其格式是1-8个字符的文件名,然后是句点分隔,然后是1-3个字符的扩展名。   
3 Win32 & DOS 该命名空间要求文件名对Win32和DOS命名空间都有效,这样,文件名就可以在文件记录中只保存一个文件名 
表8 常见命名空间

(3)数据流属性
 
偏移 大小 值 意义   
0X00 4 0X80 属性类型(0X80,数据流属性)   
0X04 4 0X48 属性长度(包括本头部的总大小)   
0X08 1 0X01 非常驻标志(0X00:常驻属性;0X01:非常驻属性)   
0X09 1 0X00 名称长度,$AttrDef中定义,所以名称长度为0   
0X0A 2 0X0040 名称偏移   
0X0C 2 0X00 标志,0X0001为压缩标志,0X4000为加密标志,0X8000为系数文件标志   
0X0E 2 0X0001 标识   
0X10 8 0X00 其实VCN   
0X18 8 0X1FF1 结束VCN   
0X20 2 0X40 数据运行的偏移   
0X22 2 0X00 压缩引擎   
0X24 4 0X00 填充   
0X28 8 0X1FF2000 为属性值分配大小(按分配的簇的字节数计算)   
0X30 8 0X1FF1C00 属性值实际大小   
0X38 8 0X1FF1C00 属性压缩大小   
0X40 … 2148062431… 数据运行④ 
表9 数据流属性说明
(4) 位图属性
位图属性在NTFS的属性中是一个很灵活的属性。当它位于不同的文件下有不同的含义。比如:例子中的MFT是文件$MFT自身的记录。这里的位图属性有特殊的含义。它在此处为非常驻属性,标志MFT文件的使用情况(类似$BITMAP的作用)。例子中31 01 40 4b 0f为数据运行,起始簇为0x0f4b40,占用一个簇。该簇中以每一位代表一个MFT记录的使用情况(占用为1,未使用为0)。实际操作中,可以根据文件的ID号查找与该文件的MFT对应的位。具体方法为,首先在$MFT的记录中读取0xB0属性运行,根据运行找到$MFT:bitmap位置。对于文件file,根据MFT记录的顺序记录文件file位于第几个,假设记录号为ID,ID/8=A, ID%8=B。表明该文件的MFT记录的位图位从$MFT:bitmap的首字节偏移A个字节,之后的第B个位。
2.3关于文件属性的说明
现在说明几点在数据恢复中很重要的几个属性标志(已用颜色标出)
① 第一处标志代表的是文件的状态:
1表示普通文件;
0表示文件被删除;
3表示普通目录;
2表示目录被删除。
当然,对于系统的文件可能有除此以外的标志符。

② 第二处为文件记录的实际大小。虽然每一个MFT记录都分配1K的空间,但实际使用的字节数并相同。因此,这里记录的是实际使用的字节数。

③ 第三处为MFT的使用标记,它在MFT记录的两个扇区中与每扇区的最末4个字节相对应,如若不然,系统将示此记录为非法记录。

④ 第四处为数据运行,是在数据流属性为非常驻的状况下索引到数据流的关键。其具体计算方式如下:
这是例子中的80H属性,其中蓝色部分为该80H属性(数据属性)的运行:
80  00  00  00  68  00  00  00   01  04  40  00  00  00  08  00
00  00  00  00  00  00  00  00   4b  00  00  00  00  00  00  00
48  00  00  00  00  00  00  00   00  c0  04  00  00  00  00  00
88  bc  04  00  00  00  00  00   88  bc  04  00  00  00  00  00
24  00  53  00  44  00  53  00   21  48  06  24  31  01  f3  aa
02  31  01  0d  7a  fd  31  01    f3  38  02  31  01  c3  4b  05
00  a2  6b  81  d0  50  3d  e1

该运行分为
子运行1:21  48  06  24
子运行2:31  01  f3  aa  02
子运行3:31  01  0d  7a  fd
子运行4:31  01  f3  38  02
子运行5:31  01  c3  4b  05

以子运行1:“21  48  06  24”为例,“2”表示后面4个字节中后面2个字节是子运行的起始簇号,即子运行的起始簇号为“24 06”,“1”表示前面的1个字节表示子运行的大小,即该子运行的大小为“48”。所以该文件数据实际是从起始扇区号为0x2406的地方,占用0x48个簇。接下来是子运行2,运行2的簇号的起始位置为0x2406 + 0x02aaf3 = 0x2cef9。占用0x01个簇。接下来是子运行3,按照前面的理论,子运行3的起始簇号应该是0x2cef9+0xfd0a0d。但是0xfd0a0d的第一个字节为1(fd的首字节),证明此数为负数,所以不能简单的做加法,而应该取该数的补数来计算。既,0xfd7a0d取反加1,得到0x2F5F2,所以运行3的起始扇区号为0x2cef9 - 0x285f3 = 0x4096。占用0x01个簇。依此类推直到子运行之后为“00”时结束。
在程序中,一个Run代表整个运行,每一个子运行以链表的方式链接在一起。

⑤ 此处由一个字节标识文件名的长度,故NTFS磁盘格式下的文件名长度不能超过256个字节,但是文件名的存储格式是以Unicode的形式存储的,所以,文件名在磁盘中占用的真实字节数是该值的两倍。

除此以外,关于数据属性的还有几个方面需要说明
(1) 关于文件名属性。在MFT中,可能有多个文件名属性。这可能是因为文件的命名空间不同。例如:一个DOS命名空间下是8+3的短文件名格式。而WINDOWS下是Unicode的命名空间。

上一页      下一页
本文共 6 页,第  [1]  [2]  [3]  [4]  [5]  [6]  页

相关文章:
 
 
  ·关于我们 ·访客留言 ·友情链接 ·
粤ICP备08022036号
站长:ds1010 站长信箱:0101ds@gmail.com

0101部落开发 @ www.ds0101.net 2007-2008