最近学习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]
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课