分享

NTFS学习笔记

 tianht 2015-12-22

最近学习NTFS分区格式,学的很郁闷,看了一天没看懂,今天又看了半天终于看懂了,完全可以手工去定位文件。附件中是我搜集到的资料,看雪上也有几个。
为了总结自己学习的东西,也为了检验自己,把过程贴出来。

以下是我自己总结的内容
NTFS与FAT有着很大的区别,首先它有一个MFT表(MasterFileTable),这个表中都是一个个的文件记录结构  每个文件记录是1KB(400H),每个文件记录或者多个文件记录来描述一个文件的信息,MFT中有16个系统使用的文件记录和8个保留的记录,每个文件记录是采用属性-属性的值来描述这个文件的,并且所有的属性分为了很多类型。
类型  操作系统  描述
0x10    STANDARD_INFORMATION
0x20    ATTRIBUTE_LIST
0x30    FILE_NAME
0x40  NT  VOLUME_VERSION
0x40  2K  OBJECT_ID
0x50    SECURITY_DESCRIPTOR
0x60    VOLUME_NAME
0x70    VOLUME_INFORMATION
0x80    DATA
0x90    INDEX_ROOT
0xA0    INDEX_ALLOCATION
0xB0    BITMAP
0xC0  NT  SYMBOL_LINK
0xC0  2K  REPARSE_POINT
0xD0    EA_INFORMATION
0xE0    EA
0xF0  NT  PROPERTY_SET
0x100  2K  LOGGED_UNTILITY_STREAM

这些属性就像类一样,可以建立有名字的属性也可以是无名字的属性。要描述一个属性,要有一个属性头,属性头有2种,非常驻属性头和常驻属性头对应着2种不同的属性,常驻属性是数据在文件记录中的,非常驻属性是数据在别的地方,非常驻属性的数据要借助于一种叫流的东西来实现,流其实是描述的一组簇。

在虚拟机中添加一块硬盘,格式化为NTFS 盘符为E  建立文件E:\dir\123456789.txt
写入”liutong”数据
因为只分了一个分区,所以很容易通过MBR找到DBR   截图如下:

通过DBR中的BPB得到每簇的大小为8扇区(1000H),MFT的簇号为40000H,这个簇号是逻辑簇号,从DBR开始算,所以计算出MFT的偏移是:7E00+40000*1000=40007E00h
 MFT截图如下


每个文件记录都是以一个"FILE”开始的。
要想找到我们的文件先要找到dir目录在哪里,可以先通过$root这个文件记录来查找
$root在MFT中偏移为5,可以计算它的实际偏移为:5*400h+40007e00 = 40009200

$root文件记录截图

然后可以通过root文件的INDEX_ALLOCATION属性来得到dir目录的信息, INDEX_ALLOCATION属性的结构是  属性头+IA索引块+索引项,由于是非常驻属性(在属性头中表明),所以后面的IA索引块和索引项在外部,不是紧随其后。

INDEX_ALLOCATION截图


通过图片得这个属性它还有个名字 $I30  ,名字后面是数据流描述了,31 01 09 FD 09   代表流的起始虚拟簇为09FD09  大小为1个簇 因为最后一个09后面为0  所以就只描述了一个流   虚拟簇是相对于属性头中的ATTR_StartVCN这个字段来讲的  因为ATTR_StartVCN为0  所以09FD09  也就是逻辑簇   可以计算出偏移为
9FD09*1000+7e00 = 9fd10e00   这个地址就是IA索引块+索引项的地址截图如下


每个流只有一个IA索引块 每个索引项 索引一个文件或目录,索引项中记录了文件或者目录的名称  ,所以直接搜索“dir”  Unicode形式的

DIR目录的索引项如下


可以得到dir这个文件在MFT中对应的索引号为1E
计算偏移为40007E00h+1E*400 = 4000F600  通过这个文件记录的Index_Root属性,也可以通过Index_Allocation属性来获得123456789.txt的信息,通过Index_Root是在目录或者文件不大的情况下才能获得。所以Index_Root它是一个常驻属性,属性和属性的值都在文件记录中。


Index_Root:


可以看到这个属性有130H的大小,有个名字  $I30  ,名字后面就是属性的实体,后面是16字节的信息头+16字节的索引块头+索引项(如果存在的话) ,可以看到有2个索引项  一个是 长文件名,一个是短文件名  ,无论如何  这2个都是一样的  得到文件对应MFT的索引是22

计算偏移得40007E00h+22*400 = 40010600h ,可以通过这个文件记录的DATA属性来得到数据
DATA属性截图


80是DATA属性的代码,这是个常驻属性,也就是说数据在文件记录中,属性头后面就是数据了 ,即”liutong” ,如果数据量过大,这个属性就会变成非常驻属性,数据在别处.

我把文件扩展到2870个字节    DATA属性如下
非常驻DATA属性截图:

400107f0处就为数据流描述  ,只有一个 虚拟簇号为09FD07  ATTR_StartVCN为0   所以09FD07  是逻辑簇号
计算偏移可以得到9FD07*1000+7e00 = 9FD0EE00   是数据的偏移

数据截图

[ATTACH][ATTACH][ATTACH][ATTACH][ATTACH]WINDOWS平台下磁盘逻辑扇区的直接读写.doc[/ATTACH][/ATTACH][/ATTACH][/ATTACH][/ATTACH]

上传的附件 NTFS and boot code.doc
 NTFS 白皮书.doc
 NTFS 文件系统剖析.pdf
 NTFS系统存储介质上文件操作痕迹分析.pdf
 解析NTFS底层结构.doc

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多