其实在上个月写完FAT32之后,我就有想写NTFS中文件定位的冲动,但是迟迟没有敢动笔,一方面是因为将近考试,没有足够的时间来理清NTFS庞大的结构,另一方面就向前面所说,NTFS的复杂度是FAT系列文件系统无法比拟的,正因为如此,对于依旧无法认识它全貌的我来说,写NTFS是需要很大勇气的,一旦写错,完全是误人子弟啊,虽然如此,我还是想在我这部分知识没有风化之前写下点什么,因为我对C++只是一知半解,代码可能写的很糟糕,但是下面我所写的思路流程,绝对是没问题的!
关于实现文件在NTFS中的绝对定位,我们需要了解NTFS文件系统的2个主要结构: DBR与MFT,关于DBR,和FAT32一样,通常为0号逻辑扇区,为引导扇区,如果您对DBR不明白,请参考相关资料。关于MFT,是NTFS文件系统的”特有专利”,NTFS文件系统中的所有目录与文件,都会形成一个或多个MFT(不知道这算不算多个MFT,时间有点长了..但是在文件定位中,基本不可能出现一个目录多个MFT的情况),一个MFT占2个扇区.
如果您对MFT不明白,请参考相关资料,网上讲解MFT的资料很多,google一下,比我权威多了,所以定位NTFS的文件,就是找到这个文件的MFT的首扇区,再根据MFT的参数,找到这个文件DATA区的详细地址(这部分您可以去阅读MFT的相关参数,这里不详细介绍)。
好,现在进入正题,因为每个目录都有一个MFT,而子目录的MFT的首地址正是根据他的父目录的MFT来定位的,所以NTFS的文件系统中MFT正好形成了一棵树(是不是和FDT差不多,但是复杂多了),所以大家可以想到,要定位树上叶子的位置,你必须知道ROOT(根)的位置吧,自然而然,我们就必须得到根目录的MFT的首扇子区号。大家看到这里,想必都MFT有个大概的了解了吧,通过查阅MFT的相关资料,我们可以得知:5号MFT,遍是根目录的MFT区!!那么如何得到5号MFT的首扇区号呢.?我们可以通过DBR,通过DBR的参数(具体请自己查阅)我们可以获得0号MFT的首簇号,因为一个MFT占用2个扇区,我们可以轻松得知5号MFT的首扇区号(这个都不会算的话,那我也没办法了…),好现在知道了根目录的MFT…那我们就可以通过这个MFT寻找他所有直接子结点的MFT,好,现在基本方法大家都知道了吧,比如我们要定位D:\\a\\b\\c.txt这个c.txt文件,那么通过根目录的MFT我们可以定位到a的MFT,再由a的MFT获取b的MFT,由b的MFT获取c.txt的MFT,最后由c.txt的MFT分析可得这个TXT文件的DATA扇区号。这样大家的思路是不是清楚了,但是最大的问题还没开始呢。
其实上面的思路一点都不复杂,最复杂的地方就在于这个MFT的分析,如何由父目录的MFT得知子目录的MFT!!!这里是代码最复杂,也是NTFS最让人恶心的地方,下面我们慢慢分析:(我也要休息一下,我不知道该怎么说了…)
(顺便说一下,这套定位方法对使用过NTFS自带的压缩或加密后的文件是无法适用的,至少我没试验过,所以还是不冒这个险了)
我们用winhex打开任意磁盘的任何MFT(为什么用winhex呢,方便理解)大家有没有发现一个问题:颜色怎么不一样。
不错,这就是MFT的结构,这里我还是说一下吧,除去MFT的基本头结构外,MFT还有10H,20H,30H,40H …… B0H当中的某几个块,那些块代表的含义是不一样的,作用当然也不一样,大家可以详细看下,一个块基本有2个颜色组成,你们的鼠标放在上面可以得到提示,分别由Header和Body两部分组成,再仔细观察每个块是不是以10H,20H,30H,40H …… B0H中的一个开头的,那就对了,这个MFT的重要结构,我们定位文件必须分析90H和A0H这2个块,那第一个问题出现了,如何定位这个块?因为各个文件的MFT是不同的,可能这个MFT有40H块,那个MFT没有,相同的块在不同的MFT中长度可能是不一样的,所以那些块是没有固定的地址的,那么如何定位呢?可能大家已经知道了,就是一个个往下分析!!!下面我来详细介绍下如何分析。首先我们知道,MFT的头结构长度是不变的,查表或直接数长度就可以得知MFT的头结构的长度,我们来模拟下用C实现,比如头结构长度为64个16进制数,那我们现在的指针指向0,我们跳过64位,我们指向65,我们来匹配下,他到底是10H呢,还是20H呢,还是30H呢……我们发现居然是10H(事实证明却是如此),我们又可以通过之前的学习和自己的发现得知,不同MFT相同块的Header长度是不变的,变的只是他的body长度,如何计算10H的body长度呢,通过前面的学习得知…(晕,大家好好看看基础)header中有个数值专门表示body的长度(具体哪个不记得了,大家还是去查查吧,查不到留言问我,我来找找),这样我们终于计算出了10H的长度,假设为30个16进制数,我们的指针再次跳过30,来到了95….下面不用我教了吧,直到我们可爱的指针发现了90H与A0H块,我们就停手….下面我来介绍下为什么我们要90H与AOH块….(上面还有个问题,有时候会发现有2个A0H或者B0H,这时候大家通过winhex得知,第2个A0H后面有显示[in slack …… ]的英文字母,我不太记得了,大家请放心,这个A0H无需理会,我们只理会第一个A0H,所以大家在查到第一个A0H后就可以直接return了)。
一个MFT只有2个扇区…所以大家不要天真的以为如果一个目录的有1000+个子目录,我们可爱的2个扇区放得下…所以,他必须放在外面!!说通俗的解释就是,家里的钱太多了,放不下了,我们就存在银行,而A0H就是银行卡,只有通过分析A0H的数据我们才能找到存进去的钱….但是值得高兴的是,我们分析一个MFT通常只需要分析90H或A0H,不需要同时分析的。还是那个例子,当我们的钱太多了,放在银行了,我们必须找A0H,那么我们家本来就没钱,几毛钱放抽屉就可以了,不需要放银行,放银行里银行也要收是不是…那么90H就是你放几毛钱的抽屉号 ….事实证明(非官方统计,是我的统计,大家可以自己去统计下是不是如此,可能因为操作系统的不同导致不一样吧),当目录下的文件(包括目录)小于等于2个时候,就没有A0H,因为MFT中就可以放得下…好我们来整理下:
1. 当子目录(文件)数量小于等于2个时候…那么目录的信息就存放在90H的body中。没有A0H这个块在此MFT中。
2. 当子目录(文件)数量大于2个时候…那么目录的信息就存放在其他簇中(可能有N个不连续的簇存放),对此我们就需要分析A0H的body(就是DATA RUN)来获得那些不连续簇的簇号,而90H此时存放的只是其中2个目录或文件的信息,我们完全忽略,因为在”银行”里,这些信息还有,90H就可以完全忽视,我们去”银行”找正版的……
友情提醒 : 如果你到这看不明白了,请别往下看了。
前面我们说到子目录或子文件是存放在其他的簇中,这些簇称为Index,下面一直用这种说法,要得到这些index,必须分析A0H的body,我们称之为分析 data run,下面也一直用这种说法,关于分析data run,明天吧…我会发个帖子专门详细介绍分析data run,因为有些复杂,我得去重新整理整理, 那我们现在就假设我们已经获得了index的所有簇号,由簇号我们也计算出了扇区号,那么如何看懂index就是我们的第三个问题了,第2个问题是分析data run,这个问题我们先搁置….
关于第三个问题,大家别看这个index怎么那么复杂,其实这是非常简单的,首先我们要检索我们需要检索的目录(文件)名,在index中,如果一个文件名是abc.txt 那么他是这样显示的: 文件全部名的大小(这里是07H)+03H+abc.txt 文件名的每一个字符占2个字节,所以他显示的是 07H 03H 61H 00H 62H 00H 63H 00H 2EH 00H 8AH 00H 8EH 00H 8AH 00H (自己心算的 可能在字母上有点错 但就是这个意思)所以我们只要寻找这一段代码就可以了,那有的人就开始问了,一个个匹配,这算法效率也太那个了吧…这里细心的人就会发现,一个文件的开头,我们还是用上面的例子,首偏移就是07H,他总是放在00H 或08H这两个偏移其中之一上的,(这里可能有点说不清,不懂自己用winhex看看吧),就算某个文件是用10个16进制数表示的,那么表示下个文件的时候,绝对是跳到下面某个00H或08H偏移开始表示的,空出来的空间用乱七八糟的东西填满,用这种方法,逐个搜索index 指导匹配成功,我们定位到文件的头偏移。那么他的MFT的地址在哪里呢??资料可得..(又是资料),在头偏移往前80个16进制的地方,有几个数,这几个数就是这个目录或文件的MFT号…现在我们知道MFT号,知道了0号MFT的簇号,我们还有什么理由得不出此MFT所在的首扇区号呢?(恶心一次)…90H的body也是用此方法分析,但是相比起来,这就简单多了,因为不需要考虑跨簇,跨扇区的问题。
除了data run的问题,所有的问题都一一为你们解答了,最后再罗嗦一句,得到一个文件的MFT后,他的90H与A0H其实就是记录的DATA区的地址,分析方法一样,不过这里要考虑多个MFT的情况,相当变态,我自己也没有分析过,希望有兴趣的人自己去分析分析,还是那句话,有问题留言,一定解答,没有问题麻烦也顶个,那么多字,手都酸了…
我还上传了点我学习过的资料,希望对你们有好处,但是版权不是我的,请大家切勿用做商业用途,仅做学术讨论,一经下载,概不负责(其实我也是下载的..没事啦..哈哈)
- 大小: 7.1 KB
- 大小: 31.3 KB
- 大小: 15.1 KB
- 大小: 19.7 KB
- 大小: 23.4 KB
- 大小: 23.4 KB
分享到:
相关推荐
* 这是修改过后的fis.c模糊推理系统库函数,可以移植C/C++环境使用,在VS2010的MFC环境经过测试 * 1、将fis.c文件拷贝到项目中; * 2、修改VS2010的配置属性,项目->属性->C/C++->预处理器->预处理器定义,添加 ...
在学C的时候碰到了麻烦,TurboC的.h文件好多VC没有,就上网找了一个这个工具。用这个来学习C参加二级考试挺实用的,是共享版,35块,比考试报名费便宜多了,不贵。机器码注册。官方介绍:原名《Turbo C/C++ for ...
C/C++实现linux和Windows查看系统、进程、服务的内存和CPU使用情况的源代码,生成的是静态链接库,Windows和Linux下经测试都可用,查看系统、指定名称的服务、指定名称的进程占用CPU和内存,查看方式不是通过程序中...
由于该技术需要直接读写对内存中的机器码,所以多采用汇编语言实现,这使得很多想在自己的程序中使用SMC技术进行软件加密的C/C++程序员望而却步。针对这种现状,本文提出了几种基于C/C++语言的机器指令定位方法,...
基于C/C++模拟处理机调度、存储管理(动态分区分配、分页存储地址转换)和文件系统 基于C/C++模拟处理机调度、存储管理(动态分区分配、分页存储地址转换)和文件系统 基于C/C++模拟处理机调度、存储管理...
1. 熟悉 C/C++ 的人员 2. 正在做关于 Qt 可视化却无从下手的人员 3. 希望做一个小项目,但没有合适的框架的人员 我主要能学到什么: 1. 该项目包含 鼠标点击响应与绘图相关的算法 2. 该项目包含 创建、删除、编辑 ...
- **使用 `mcc` 命令**:这是最为推荐的方法之一,因为它可以直接将 `.m` 文件编译成 C/C++ 代码或 DLL 和 LIB 文件,便于在 C/C++ 程序中集成。 #### 4. 编译过程 - 使用 `mcc` 命令时,需要指定一系列参数来控制...
在C++中实现一个类UNIX文件系统是一项复杂的任务,它涉及到对操作系统内核级功能的模拟,主要包括文件和目录管理。以下是对这个项目的关键知识点的详细说明: **1. 文件系统基础** 首先,理解文件系统的基本概念至...
通过这个项目,你可以学习到如何在C/C++环境中实现RSA算法,以及如何将它应用于文件的加解密操作。这对于理解非对称加密原理和提高信息安全编程能力非常有帮助。同时,这也是一个基础的密码学实践,有助于进一步研究...
C/C++是两种广泛使用的编程语言,特别是在系统级编程、游戏开发和高性能计算等领域。C++是C语言的扩展,引入了面向对象编程的概念。在编程过程中,理解并有效地使用库函数是至关重要的,因为它们提供了标准功能,...
在C++中实现文件系统,开发者需要理解文件I/O操作、目录结构和文件权限等基本概念。C++标准库提供了一系列的文件操作函数,如fstream库,用于读写文件,以及dirent库,用于处理目录操作。 在这个模拟器中,文件被...
本项目名为“C语言/C++信息管理系统——考勤管理系统”,它是一个适合课程设计或程序实训的实践项目,旨在帮助学习者掌握C语言和C++编程技能,同时理解信息管理系统的基本原理。 首先,我们来了解一下C语言和C++这...
c / c++ / cpp / stl 中文帮助文档手册chm格式下载 C/C++ 语言参考 基本C/C++ 预处理命令 操作符优先级 转义字符 ASCII码表 基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String...
C++是一种强大的、通用的编程语言,它在C语言的基础上增加了面向对象的特性,同时也支持泛型编程和底层系统级编程。C++ API通常包括标准库(如STL,Standard Template Library)、Boost库和其他第三方库提供的接口。...
这个文档压缩包包含普通C/C++中文文档和蓝桥杯比赛时用的文档,C/C++中文文档是最新版,支持到C++20和C18,且包含以前版本的内容。蓝桥杯蓝桥杯C/C++组用的文档比正常文档更简略,但包含了ASCII码表。
在本项目中,"C/C++仿真实现Linux文件系统"是一个旨在理解和模拟Linux操作系统核心功能的实践项目,特别是关注于文件系统相关的部分。通过这个项目,开发者可以深入理解文件系统的内部工作原理,包括文件的创建、...
在本项目中,"基于C/C++实现的宿舍管理系统可做小型课设"是一个适合大学学生作为课程设计任务的实践项目。它展示了如何利用C/C++编程语言来开发一个简单的管理系统,尤其是对于学习C语言的学生来说,这是一个很好的...
在这个项目中,C/C++被用来实现文件的逆向转换,这需要深入理解语言特性,如指针操作、内存管理以及文件I/O。 2. **文件操作**:在C/C++中,文件操作通过标准库中的`<fstream>`头文件实现。逆向转换可能包括读取...
在 C/C++ 中,需要把 JAVA 中 JNI 的系统函数放到 VC 中,例如,在 JDK 中我的 JDK 装在 C 盘路径是”C:\Program Files\Java\jdk1.5.0_01\include”,把 include 下所有 .h 文件和 include\win32 下的 .h 文件复制到...
根据sublime text3 界面为模板,配置keil界面。 使用方法: 下载文件,进入keil安装目录,使用下载的文件替换安装目录中的global.prop,然后就可以正常使用的