玩玩ntfs之新建文件

作 者: ProgmBoy

by:ProgrammeBoy http://hi.baidu.com/programmeboy
环境:首先新建一个512M的文件.然后用filedisk使用这个文件创建一个volume。然后格式化为ntfs格式。我是按每簇512字节格式化的。
目标:在根目录下添加一个名为777.txt的空文件
工具:filedisk、 Runtime's DiskExplorer for NTFS、winhex
1,先找到$mft,保存重要数据
(根据bootsector中数据找)例如我的bootsector如下图所示
 名称:  1.JPG
查看次数: 240
文件大小:  120.4 KB
这里我们用到的有偏移为B、D、30处这里说明下,显示结果都是10进制的,我们计算下$mft的偏移就是(349525)d *( 512)d* 1= (178956800)d 化成16进制就是(AAAAA00)x。注意这里(数字)d是指10进制的数
而(数字)x是指16进制的数.下同
我们来到这个地方
如下图:
 名称:  2.JPG
查看次数: 241
文件大小:  90.4 KB
2,找到并设置$mft的bitmap
先根据$mft中的bitmap属性(B0)找到run再根据run找到其数据区。
 名称:  3.JPG
查看次数: 240
文件大小:  101.5 KB
选中的那个就是B0属性。这里我们用到的就是紫色那个run,根据run我们知道其数据在55554簇处,即偏移(55554)x*(512)d(我的这个盘一个簇就一个扇区) = (AAAA800)x
我们来到这里:
 名称:  4.JPG
查看次数: 240
文件大小:  66.9 KB
看紫色部分。$mft中的bitmap属性数据中的每一位代表这个mft号的使用情况。比如上面第一二字节16位分别代表$MFT、$MftMirr、$LogFile、$volume、…..$Extend下面的一字节就是系统预留的8个mft号
.再接下来就是0F,化成2进制是00001111,这里得说明一下在bitmap中高位代表低的mft号。
例如:

字节序:            1F
二进制:             0 0 0 1   1 1 1 1 
所代表的mft序号:        8 7 6 5   4 3 2 1  (也就是说第12345正在使用78为空闲)
我们就可以找到空闲位写入我们的MFT了就向上图紫色所示第17位为空闲的,但是这是系统预留的我们不能用。接着往下找29位为空闲。那么我们就可以在第29个MFT中写入我们的MFT。我们设置第29位后bitmap数据由FF FF 00 0F 变成了 FF FF FF 1F
3, 创建新的MFT,写入磁盘
我们来到第29号mft处就是: (AAAA800)x (第一个mft的偏移) + (29 – 1) *(1024)d (每个FILERECORD的大小) = (AAB1A00)x
接下来我们就来手动填充这个MFT,这里我添加了3个最基本的属性, 10, 30, 80。
 名称:  5.JPG
查看次数: 242
文件大小:  186.9 KB
这样不好看,这样
 名称:  6.JPG
查看次数: 243
文件大小:  234.5 KB
额,比直接看数据好多了。。。。。
上面那几个带颜色的时必须填对的…还有那个USA你得在这个MFT的每个扇区的末尾都得设置.例如我这里的是01 00 (看上面偏移AAB1A30处),那么我们就得在这个MFT的两个扇区的末尾都设置成这个.如图:
第一个扇区
 名称:  7.JPG
查看次数: 240
文件大小:  18.3 KB
第二个扇区:
 名称:  8.JPG
查看次数: 240
文件大小:  10.1 KB
就是这样了…
唉,..我这里得atributeID忘加了…日志记录也没加。不过对于我们的目标来说无所谓
4,添加index_entry
Mft添加完了我们得到再到索引中添加….
我们先到第五个MFT也就是root中找到其A0属性,找到索引根
 名称:  9.JPG
查看次数: 240
文件大小:  108.4 KB
其run就是上图紫色部分.我们来到其数据处
 名称:  10.JPG
查看次数: 240
文件大小:  64.1 KB
上面紫色是index_entry的总长度,我们在添加index_entry后也要修改这个值。
我添加的index_entry如下图所示:
 名称:  11.JPG
查看次数: 236
文件大小:  84.3 KB
注意最后这个表示末尾的这一行必须得有呀…别的按照结构体格式直接加就行了。
5,就是在$Bitmap中设置这个扇区为正在使用(注意这个不是$mft中的那个bitmap属性)
   $mft中的bitmap表示哪个mft号在使用
   $Bitmap是表示整个盘中每个扇区的使用情况
这里我们得算下我们的mft在哪个扇区? (AAAB1A00)x / (512)d = (5558D)x
         再算下是第几个字节 (558D)x / 8 = AAB1
我们去第AAB1字节去设置去,$bitmap的数据区在1000BE00(就是在mft中找到$bitmap的FILERECORD然后再找到run就能找到数据区了)
 名称:  12.JPG
查看次数: 238
文件大小:  142.2 KB
我们的MFT的扇区是(AAB1)x + (1000BE00)x = (100168B1)x
 名称:  13.JPG
查看次数: 237
文件大小:  66.1 KB
已经使用了….
基本就是这样了…
我不会刷新缓存,但是重启很麻烦.。这里就体现出用filedisk的方便之处了.首先卸载磁盘,然后重新创建这个磁盘.缓存就会自动刷新了。新建的文件也就会显示出来了。
 名称:  14.JPG
查看次数: 235
文件大小:  99.3 KB

要想加data的话在其FILERECORD得80中加就行了。。
切记。这个程序只对上面说的环境有效。不可在真实磁盘中做实验呀。。。用filedisk创建个虚拟磁盘玩玩还是可以的。。。

下面是添加文件的程序的源代码和doc文件。。本来想写成cmd形式的了,还没写完。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NTFS文件系统中,每一个文件或目录都拥有一个MFT记录,MFT记录中记录了文件或目录的基本信息,对于普通文件来说,一般拥有文件序号,文件名,创建时间,文件大小,文件属性,文件数据地址索引等基本文件信息,而一个目录除了拥有基本文件信息,还拥有其目录下的文件索引项信息,文件与其父目录之间通过该文件的MFT记录中的父目录信息和目录中的索引项来建立隶属关系,这两种信息唯一地确定了文件与父目录之间的对应关系,由此可知,要在一个指定目录下生成一个文件,除了要创建目标文件本身的MFT记录,还需在其父目录的MFT记录或者其索引分配中建立目标文件的索引。在NTFS系统中,文件索引是一个比较复杂的内容,文件的索引采用了树型结构,这给NTFS系统带来了查找文件速度快的优点,但却给当索引结点增加或减少时,如何维护树的平衡带来了难题。在NTFS系统中,小目录的索引直接存放在目录本身MFT记录的90H属性中,而大目录的索引则需另外开辟新的索引分配区来存放相关的索引。原程序中只考虑了小目录的情况,即将文件的索引直接存放在90H属性中,并不考虑大目录的索引情况。除此之外,NTFS系统对于每一个文件操作都会写入日志文件中,以便一致性检查,但由于这方面的内容尚未研究清楚,本程序中也未涉及这方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值