软件安全的实验,记录一下,首先需要对NTFS文件系统有了解,有时间的推荐先看这篇博客
一、NTFS需要的基础
1、MFT:磁盘上的所有数据都是以文件的形式存储,其中包括元文件。 每个文件都有一个或多个文件记录,每个文件记录占用两个扇区 $MFT元文件就是专门记录每个文件的文件记录。 其中第五个目录是根目录的文件记录。 第一个目录是MFT本身的文件记录。
2、簇号: NTFS文件系统使用逻辑簇号(LCN)和虚拟簇号(VCN)对分区进行管理。 逻辑簇号:既对分区内的第一个簇到最后一个簇进行编号,NTFS使用逻辑簇号对簇进行定位。 虚拟簇号:既将文件所占用的簇从开头到尾进行编号的,虚拟簇号不要求在物理上是连续的。
3、索引项:每个文件在目录中有其索引项。结构如图:其中文件的MFT索引号(3个字节)是我们需要的,是虚拟索引号,是相对的。
4、属性(具体可以看博客):
文件记录由两部分构成,一部分是文件记录头,另一部分是属性列表
10H类型属性它包含文件的一些基本信息
20H类型属性既属性列表,当一个文件需要好几个文件记录时,才会用到20H属性。
30H类型属,该属性用于存储文件名 ,它总是常驻属性。
80H属性 80H属性是文件数据属性,该属性容纳着文件的内容
5、runlist(在80或者A0属性里面可以找到):
当属性不能存放完数据,系统就会在NTFS数据区域开辟一个空间存放,这个区域是以簇为单位的。
Run List就是记录这个数据区域的起始簇号和大小
举个栗子 31 0C 2C 22 45 其中3表示有3个字节表示这个数据流的开始簇号即 2C 22 45 1表示有1个字节描述这个数据流的大小即0C
当有多个Run List 的时候,都需要计算,并且相加,得到多个数据流。
二、具体实现(为了计算方便(懒),举例本机E盘上的一个140M左右的文件)
(1)选取的是文件12345aa.pdf,大小约140M:
(2)首先借助winhex工具打开可以直接得到其簇号,并且知道它直接位于E盘根目录之下(作为我们定位的验证)如下图:
(3)大概的流程:
(MFT的结构一般第五个目录就是根目录,并且其一个目录一般都是2个扇区即一个字节,MFT逻辑簇号不是连续的,根目录也是,需要runlist来计算出,它到底有几个数据流,数据流的起始位置和大小分别是多少!)
算出MFT中第五个目录即根目录的扇区位置,转到该扇区得到根目录的runlist
计算出根目录所在的扇区,打开根目录,即可以找到我们的文件pdf
根据它在根目录中的数据找到它在MTF中的索引号,得到MTF中的记录
在MTF中找到它真正的数据流,即可以看到真正的文件内容。(因为大于100M,肯定是非常驻)
(4)用winhex打开我们的磁盘E盘(每个偏移的具体含义参见更加详细的博客)
分析boot文件可以在0DH中得到一个簇有8个扇区的大小。
030-037H是MFT的开始簇号0x00 00 00 00 00 0C 00 00
040-043H是每个MFT记录的大小为0x00 00 00 F6个簇
1C-1FH是隐藏扇区(MBR到DBR) 0x 00 00 10 00簇
(5)计算MFT本身的数据流情况
跳转到MFT的第一个扇区即6291456扇区,在80h属性处得到rundate
33 80 D1 00 00 00 0C 起始簇号786432 大小为53632簇 包括214528个目录项
33 0B C8 00 F5 7E 6F 起始簇号786432+(6F 7E F5)即7306997=8093429 大小为51211簇 包括204844个目录项
33 35 92 00 15 62 38 起始簇号 8093429+(38 62 15)即3695125=11788554 大小为 37429簇 包括149716个目录项
(一个簇8个扇区,2个扇区一个目录项,即一个簇4个目录项)
(6)可以计算得到MFT第五个记录(根目录)所在扇区为6291456+1*5*2=6291466 跳到这个扇区 找到其中的索引属性A0x,得到两个run data 41 05 62 C1 81 01 和 41 01
计算的第一个起始簇号为25280866,第二个起始簇号为1
(7)转到扇区25280866*8扇区得到根目录的扇区:利用winhex验证正确
(8)在根目录下找到我们的文件12345aa.pdf 如下(查找文件名)
(9)根据下图,计算出文件的MFT索引号为085EC4,为548548项。
(10)下面有两种方式找到MFT中的目录项:
(1)使用虚拟簇号,打开MFT,计算偏移为217B1000,跳转得到12345aa.pdf的目录
(2)使用逻辑簇号,根据上面分析的,可知MFT分为了3块,
因为548548>214528+204844 个目录项 ,所以我们的文件在第三块MFT表中
其簇号=(548548-214528-204844)/4+11788554(第三块MFT起始簇号)=11820848号
(11)读其80H属性得到其run date为43 20 87 00 3C 7A C0 00 数据流起始位置为12614204簇,与我们直接用工具在右侧看到的簇号相同,转到该簇得到文件内容
(12)定位成功,有子文件夹的参考上门步骤重复计算到最后一个子文件夹就可以。