首页
论坛
课程
招聘
[原创]NTFS学习笔记
2010-12-8 16:43 15381

[原创]NTFS学习笔记

2010-12-8 16:43
15381
最近学习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]

看雪招聘平台创建简历并且简历完整度达到90%及以上可获得500看雪币~

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (15)
雪    币: 2081
活跃值: 活跃值 (183)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
exile 活跃值 1 2010-12-8 16:48
2
0
收藏 慢慢看
雪    币: 643
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
StudyRush 活跃值 3 2010-12-8 16:53
3
0
NTFS文件搜索的索引建立好像是用B+树建立的,但有的说不是,lz有没有了解这方面的。
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
whitefirer 活跃值 1 2010-12-8 17:57
4
0
收藏 慢慢看
雪    币: 2509
活跃值: 活跃值 (632)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
zhouws 活跃值 2 2010-12-8 18:14
5
0
我也觉得不像是。。
雪    币: 336
活跃值: 活跃值 (21)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
microdebug 活跃值 6 2010-12-8 18:31
6
0
是B+树
雪    币: 104
活跃值: 活跃值 (372)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
njxxdx 活跃值 2010-12-9 09:17
7
0
B+树结构没研究过,这应该是NTFS驱动搜索时采用的方式吧,我这个只是底层分区结构,和NTFS的解析还有一段距离。。。。
雪    币: 516
活跃值: 活跃值 (268)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
guxinyi 活跃值 5 2010-12-10 00:40
8
0
NTFS文件格式,标记备查
雪    币: 288
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
周zhou周 活跃值 2010-12-10 02:04
9
0
楼主行啊!我现在想分析一下pdg格式的文件,不知道和你这个关系有多远。加密了的。自己技术又不过关。碰到骨头了。。。。
雪    币: 4318
活跃值: 活跃值 (333)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scientist 活跃值 2010-12-10 10:25
10
0
Quite complex.  There was an article named "NTFS: A File System with Integrity and Complexity" recently from OS News.  It is worth reading, too.
雪    币: 4103
活跃值: 活跃值 (867)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
kagayaki 活跃值 2010-12-10 10:31
11
0
收藏 慢慢看............
雪    币: 230
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
llw 活跃值 2010-12-14 09:30
12
0
谢谢!收藏了慢慢看!!!
雪    币: 1259
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu 活跃值 2010-12-14 23:01
13
0
留个记号,用的时候再来看。
雪    币: 135
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
低调flying 活跃值 2010-12-22 11:24
14
0
谢谢分享,有时间好好学习一下!
雪    币: 31
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
legendwind 活跃值 2011-1-1 11:52
15
0
谢谢楼主的资料,正在找ntfs方面的资料呢。。。
雪    币: 15
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
守望千年 活跃值 2011-1-1 15:35
16
0
牛人啊     膜拜
游客
登录 | 注册 方可回帖
返回