分析NTFS文件系统得到特定文件的内容

找某一个文件的内容(如要读取文件D:\dir\dir2\text.txt,具体步骤如下:

(1)读取分区表/分区链表信息,找到磁盘F的起始扇区。

(2)读取D盘的第一个扇区(分区的BOOTSETOR)取得分区的每簇大小,MFT表起始簇号等信息。

(3)读取MFT表的第五个记录(根目录)找到目录索引所在簇号。

(4)读取根目录索引,查找dir目录所在的MFT记录号

(5)读取dir目录的MFT记录,找到目录索引所在簇号。

(6)读取dir目录的索引,查找dir2目录所在MFT记录号

(7)读取dir2目录的MFT记录,找到目录索引所在簇号。

(8)读取dir2目录的索引,查找test.txt 所在MFT记录号

(9)读取test.txt文件的MFT记录,找到它的DATA属性。

(10)根据DATA属性中指定的文件数据存放位置读取出test.txt文件的数据。

下面我们借助工具Winhex来找到D:\dir\dir2\text.txt的内容

1.读取分区表/分区链表信息,找到磁盘F的起始扇区。

打开磁盘0号扇区

红线部分是D分区的信息,蓝色方框内是D分区的物理起始扇区 0XEA58BC。

2.读取D盘的第一个扇区(分区的BOOTSETOR)取得分区的每簇大小,MFT表起始簇号等信息。

打开物理扇区号为0XEA58BC的扇区,如下图,红线是每簇的扇区数(0X1,每簇一个扇区);

蓝线部分是$MFT的逻辑簇号(0X00 00 00 00 02 0A F3,是相对于D分区开始的簇号)

紫线部分是一个MFT记录所占的簇数(0X00 00 00 02)

3.读取MFT表的第五个记录(根目录)找到目录索引所在簇号。

打开$MFT表,相对于D分区的簇号是0X00 00 00 00 02 0A F3,相对于整个磁盘的簇号是 0XEA58BC + 0X00 00 00 00 02 0A F3 = 0XEC63AF。

因为从D分区第一个扇区得到每簇扇区数是1,所以$MFT在D分区的偏移是0X020AF3扇区。

每个MFT记录所占簇数是2,根目录是MFT中的第5个记录(记录从0开始的),根目录的MFT记录项所在的簇数是 0X020AF3 + 5 * 2 = 0X20AFD,

所在扇区数是 0X20AFD *每簇扇区数1 = 0X20AFD

4.读取根目录索引,查找dir目录所在的MFT记录号

打开D分区偏移扇区0X20AFD,找到属性0X90,在0415FB80一行,偏移0X08是0X01,说明是非常驻属性,得到Data run, 31 08 BB 10 03,即在D分区偏移簇数0X0310BB,长度是0X8簇。

查看D分区偏移簇号0X0310BB,会看到根目录下的索引项,其中可看到$AttrDef,$BadClus,$Bitmap,$Boot等系统文件的索引项。

找到dir的索引项,如下图,红框部分是本索引项的名称dir。前8字节是文件的MFT索引记录号(好像只用到前4个字节,0X0375)

5.读取dir目录的MFT记录,找到目录索引所在簇号。

下面计算dir 的MFT表项在$MFT中的簇号:

一个MFT表项占两个簇,第0X0375项是相对于$MFT的第0X0375*2= 0X6EA簇,也就是相对于D分区的第 0X02 0A F3 + 0X6EA = 0X211DD簇(扇区是0X211DD)

6.读取dir目录的索引,查找dir2目录所在MFT记录号

打开扇区0X211DD,如下图,

0423BB00一行,偏移0位置是0X00,说明是常驻属性,从紫色框中得到dir2的MFT记录项的记录号是0X0376

7.读取dir2目录的MFT记录,找到目录索引所在簇号。

现在来确定dir2的MFT记录项所在的簇数

$MFT开始簇数 + 0X0376*每记录簇数

0X020AF3 + 0X0376 *2 = 0X211DF

8.读取dir2目录的索引,查找test.txt 所在MFT记录号

打开D分区偏移 0X211DF 簇

可看到test.txt 的MFT记录号是 0X0377

9.读取test.txt文件的MFT记录,找到它的DATA属性。

得到test.txt 的MFT记录项在D分区的偏移簇号

=$MFT表的偏移簇数 + test.txt记录号*每MFT记录簇数

=0X020AF3 + 0X0377 *2

= 0X211E1(簇号)

= 0X211E1(扇区号)

打开0X211E1(扇区号):

从0x30文件名属性可以看到test.txt的文件名。

0X80数据属性中可以得到文件内容

10.根据DATA属性中指定的文件数据存放位置读取出test.txt文件的数据。

从0X80数据属性中可以知道此属性是常驻属性,直接看到test.txt的文件内容,“This is test for NTFS!”.

另外,如果我继续向test.txt 写入数据,DATA属性中的数据会增加,下图中红线之间的数据是后来增加的。

但是当文件内容在增多时,0X80数据属性从常驻属性改为非常驻属性,文件内容不会直接存储在此属性中,而是其他簇中,根据Data run可以定位到。

OX80数据属性;0X01说明是非常驻属性;

Data run,31 02 4C 0D 01;说明内容从分区偏移簇号0X010D4C开始,长度是0X02个簇。

打开簇号是0X010D4C的扇区,可以看到test.txt的文件内容:

(本文如有错误,请指正,多谢!)

时间: 2024-10-28 02:09:38

分析NTFS文件系统得到特定文件的内容的相关文章

NTFS文件系统的单个文件最大到底有多大?

于NTFS文件系统的单个文件最大到底有多大? 闲来无事突然想到这个问题,到网上搜索了一下也没有一个固定的解释. 于是到微软官方知识库去寻找答案: 可以看到NTFS单个最大文件是受卷大小的限制,我们平时使用的硬盘采用MBR分区方案,所以只能支持最大2TB的分区(硬盘).大于2TB的硬盘需要采用GUID分区方案. 所以在现阶段,NTFS文件系统的单个文件最大理论可以达到2TB,当然不考虑到NTFS自身带的来空间开销. 文档地址:http://support.microsoft.com/kb/1001

在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world

一.题目 编写一个内核模块,在/proc文件系统中增加一个目录hello,并在这个目录中增加一个文件world,文件的内容为hello world.内核版本要求2.6.18 ? 二.实验环境 物理主机:win7 64bit, i5双核,8G内存 虚拟机:Vmware Workstation 10.0.2 虚拟主机: CentOs-5.11,内核2.6.18 ? 三.实验思路 在着手解决问题之前,我在网上查阅了一些资料,大多是关于模块的介绍.linux内核采用的是模块化编程,这样可以很容易的添加或

无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)

简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此,本文中的“文件”一词可能指文件,也可能指文件夹. 原因 1:文件使用了 ACL 如果某个文件使用了访问控制列表 (ACL),您可能无法删除该文件.要解决此问题,请更改该文件上的权限.您可能需要拥有这些文件的所有权才能更改权限. 管理员具有取得任何文件所有权的隐含能力,即使未明确向他们授予针对此文件的

NTFS文件系统简介(转载)

原文地址:http://www.cnblogs.com/watertao/archive/2011/11/28/2266595.html 1.简介 NTFS(New Technology File System)是Windows NT以及之后的Windows 2000.Windows XP.Windows Server 2003.Windows Server 2008.Windows Vista和Windows 7的标准文件系统. NTFS取代了文件分配表(FAT)文件系统,为Microsoft

linux内核分析之文件系统

linux内核分析之文件系统 linux内核分析之文件系统 一文件系统的安装和卸载分析 1 文件系统的安装 11 总领提纲 12 代码分析 13 实例考察path_walk 2 文件系统的卸载 21 提纲 22 代码分析 二问答归纳 1 问题 2 回答 三文件的打开 1打开文件的本质 2打开文件的过程 四文件创建 1 文件创建的过程 2 关于文件创建的理解 一.文件系统的安装和卸载分析 1.1 文件系统的安装 1.1.1 总领提纲 文件系统的安装过程中,有几个重要的数据结构: file_syst

取得文件夹内容信息

翻译自MSDN 2005 -> Win32 和 COM 开发 -> User Interface -> Windows User Experience -> Windows Shell -> Shell Programmer's Guide -> Shell Basics -> Shell Basics: Programming the Shell -> Getting Information About the Contents of a Folder G

1-18 编译安装内核支持ntfs文件系统

大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =================================================================== 一.源码编译Linux内核 通常我们想对内核进行升级时,可通过下载源码包,编译内核的方式,对内核进行升级 源码包的下载地址在:www.kernel.org 我们可以直接在linux系统中直接下载,如下命令: wget http

linux中Makefile文件相关内容

第一章.概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional(专业)的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefile关系到了整个

NTFS 文件系统小秘密

NTFS 系统中有一个特性,那就是它支持 HardLink 技术.所谓 HardLink 其实就是给一个文件创建一个硬链接,这两个文件享有同一份文件内容.删除其中任一个,别一个仍然保护着原来的数据存在着.这显然是一个有趣的特性.那么怎么来创建一个文件的 HardLink 呢? 首先在 C 盘根目录下创建一个文件 test.txt,  在命令控制台中输入 fsutil hardlink create c:\1.txt c:\test.txt.然后输入回车,即会为 test.txt 文件创建一个硬链