1. 背景
本文主要介绍$Root元文件属性的解析。先介绍元文件各属性的属性体构成,然后结合读取到的元文件内容,对测试磁盘中目标分区的根目录进行展示。
2. $Root元文件属性的解析
使用每个属性头偏移0x04-0x07处的值可以从第一个属性开始依次定位下一个属性,即30H属性的开始位置为10H属性的开始位置加上10H属性头偏移0x04-0x07处的值,40H属性的开始位置为30H属性的开始位置加上30H属性头偏移0x04-0x07处的值,依此类推。
(1)10H属性
10H属性体的偏移0x00-0x07表示文件创建时间;偏移0x08-0x0F表示文件最后修改时间;偏移0x10-0x17表示文件的MFT修改的时间;偏移0x18-0x1F表示文件的最后访问时间;偏移0x20-0x23表示DOS文件属性;偏移0x24-0x27表示文件可用的最大版本号;偏移0x28-0x2B表示文件版本号;偏移0x2C-0x2F表示类ID;偏移0x30-0x33表示文件所有者ID;偏移0x38-0x3F表示本文件所占用的字节数;偏移0x40-0x47表示更新序列号。
结合下图所示的$Root元文件内容,10H属性头偏移0x08处的值为00,表示该属性为常驻属性;属性头偏移0x14-0x15处的值为18 00(即0x0018),表示属性体开始于偏移0x18处;属性体偏移0x00-0x07处的值为06 67 3D 2E EC 41 CA 01;偏移0x08-0x0F处的值为EA D4 59 F8 76 64 DA 01;偏移0x10-0x17处的值为EA D4 59 F8 76 64 DA 01;偏移0x18-0x1F处的值为92 40 1A C8 73 64 DA 01;偏移0x20-0x23处的值为06 00 00 00(即0x00000006),表示本文件为隐藏的(0x02)系统(0x04)文件;偏移0x24-0x27处的值为00 00 00 00,表示禁用;偏移0x28-0x2B处的值为00 00 00 00;偏移0x2C-0x2F处的值为00 00 00 00,表示类ID为0。
(2)30H属性
30H属性体的偏移0x00-0x07表示父目录的MFT记录的索引;偏移0x08-0x0F表示文件的创建时间;偏移0x10-0x17表示文件的最后修改时间;偏移0x18-0x1F表示文件的MFT修改的时间;偏移0x20-0x27表示文件的最后访问时间;偏移0x28-0x2F表示文件的分配大小;偏移0x30-0x37表示文件的实际大小;偏移0x38-0x39表示DOS文件属性;偏移0x3C-0x3F表示文件的扩展属性;偏移0x40表示文件名的字符数;偏移0x41表示文件名命名空间;偏移0x42开始为文件名称。
结合下图所示的$Root元文件内容,30H属性头偏移0x08处的值为00,表示该属性为常驻属性;属性头偏移0x14-0x15处的值为18 00(即0x0018),表示属性体开始于偏移0x18处;属性体偏移0x00-0x07处的值为05 00 00 00 00 00 05 00;偏移0x28-0x2F处的值为00 00 00 00 00 00 00 00,表示文件的分配大小为0;偏移0x30-0x37处的值为00 00 00 00 00 00 00 00,表示文件的实际大小为0;偏移0x38-0x39处的值为06 00(即0x0006),表示本文件为隐藏的系统文件;偏移0x40处的值为01,表示该文件的文件名只有一个字符;偏移0x41处的值为03,表示文件名的命名空间为Win32 & DOS,即Win32和DOS文件名都存放在同一个文件名属性中;偏移0x42开始的值为2E 00 00 00 00 00,其中的文件名只有一个字符,即2E(对应字符点“.”,表示当前目录),后面的00都是无效数据。
(3)40H属性
40H属性体的偏移0x00-0x0F表示文件的GUID;偏移0x10-0x1F表示文件建立时所在卷的ID;偏移0x20-0x2F表示文件的原始ID;偏移0x30-0x3F表示对象创建时所在域的ID。结合下图可以解析40H属性体的各项内容。
(4)50H属性
50H属性体的各项内容可以结合下图进行解析。
(5)90H属性
90H属性体由索引根、索引头、索引项组成,其中的索引项可能不存在,也可能存在多个索引项。
索引根的偏移0x00-0x03表示属性的类型;偏移0x04-0x07表示整理规则;偏移0x08-0x0B表示目录项分配尺寸;偏移0x0C表示每个目录项占用的簇数。
索引头的偏移0x00-0x03表示第一个目录项的偏移;偏移0x04-0x07表示目录项的总尺寸;偏移0x08-0x0B表示目录项分配的尺寸;偏移0x0C处为标志位,值为00时表示小目录,值为01时表示大目录。
索引项的偏移0x00-0x07表示该文件的MFT参考号;偏移0x08-0x09表示索引项的大小;偏移0x0A-0x0B表示文件名属性体的大小;偏移0x0C-0x0D表示标志,值为00时表示普通文件项,值为01时表示有子项,值为02时表示当前项为结束项,值为03时表示包含子节点且为结束项;偏移0x10-0x17表示父目录的MFT文件参考号;偏移0x18-0x1F表示文件的创建时间;偏移0x20-0x27表示文件的最后修改时间;偏移0x28-0x2F表示文件记录的最后修改时间;偏移0x30-0x37表示文件的最后访问时间;偏移0x38-0x3F表示文件的分配大小;偏移0x40-0x47表示文件的实际大小;偏移0x48-0x4F表示文件标志,值为1时表示只读,值为2时表示隐藏,值为4时表示系统,值为20H时表示存档;偏移0x50表示文件名长度;偏移0x51表示文件命名空间;偏移0x52开始为文件名。
结合下图所示的$Root元文件内容,90H属性头偏移0x08处的值为00,表示该属性为常驻属性;偏移0x09处的值为04,表示属性名的长度为4;偏移0x0A-0x0B处的值为18 00(即0x0018),表示属性名开始于偏移0x18处;偏移0x10-0x13处的值为A8 00 00 00(即0x000000A8),表示属性体的长度为0xA8字节,即168字节;偏移0x14-0x15处的值为20 00(即0x0020),表示属性体开始于偏移0x20处;偏移0x18处开始的8个字节为24 00 49 00 33 00 30 00,将ASCII码转换成字符为“$I30”。偏移0x20处开始为索引根,16个字节之后的0x30处开始为索引头。
索引头的偏移0x00-0x03处的值为10 00 00 00(即0x00000010),表示第一个索引项的偏移为0x10;偏移0x04-0x07处的值为98 00 00 00(即0x00000098),表示索引项的总尺寸为0x98字节,即152字节。所以第一个索引项起始于索引头的偏移0x10处,总尺寸为152字节。
第一个索引项的偏移0x00-0x07处的值为9B 0D 00 00 00 00 01 00;偏移0x08-0x09处的值为70 00(即0x0070),表示索引项的大小为0x70;偏移0x0A-0x0B处的值为52 00(即0x0052),表示文件名属性体的大小为0x52;偏移0x0C-0x0D处的值为01 00(即0x0001),表示有子项;偏移0x50处的值为08,表示文件名的长度为8;偏移0x51处的值为02,表示文件名的命名空间为DOS;偏移0x52处开始的16字节值为44 00 4F 00 43 00 55 00 4D 00 45 00 7E 00 31 00,将ASCII码转换成字符为“DOCUME~1”,是目录Documents and Settings在DOS下的短文件名。文件名是UNICODE编码的,每个字符占2个字节,第一个字节为对应字符的ASCII码,第二个字节为00,文件名的长度为8个字符,即16个字节。
解析上图的90H属性,得到分区根目录下的第一个文件DOCUME~1,即Documents and Settings子目录。受限于空间,90H属性中只能存放一个文件的信息(即一个索引项),根目录下的其它文件和子目录存放于A0属性中。
(6)A0H属性
A0H属性体为Data Runs。结合下图所示的$Root元文件内容,A0H属性头偏移0x08处的值为01,表示该属性为非常驻属性;偏移0x09处的值为04,表示属性名的长度为4;偏移0x0A-0x0B处的值为40 00(即0x0040),表示属性名开始于偏移0x40处;偏移0x20-0x21处的值为48 00(即0x0048),表示Data RUN开始于偏移0x48处,即属性体开始于偏移0x48;偏移0x40处开始的8个字节为24 00 49 00 33 00 30 00,将这些ASCII码转换成字符为“$I30”,由于名称是UNICODE编码的,所以每个字符占用2个字节,第一个字节为对应字符的ASCII码,第二个字节为0;偏移0x48处开始的值为31 02 53 03 2F 00 01 00,根据Data RUN的编码规则,第一个字节31表示簇0x2F0353(3个字节53 03 2F)开始的2个簇(02)用于存放文件数据,之后的一个字节00表示Data RUNs结束,后续没有Data RUN了,即后续为无效数据。
(7)B0H属性
B0H属性体的各项内容可以结合下图进行解析。
3. 总结
本文介绍了$Root元文件各属性的属性体结构,然后结合读取的内容对$Root元文件的各个属性分别进行解析。重点解析了10H、30H、90H、A0H属性。
安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。