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如下图所示
 
这里我们用到的有偏移为B、D、30处这里说明下,显示结果都是10进制的,我们计算下$mft的偏移就是(349525)d *( 512)d* 1= (178956800)d 化成16进制就是(AAAAA00)x。注意这里(数字)d是指10进制的数
而(数字)x是指16进制的数.下同
我们来到这个地方
如下图:
 

2,找到并设置$mft的bitmap

先根据$mft中的bitmap属性(B0)找到run再根据run找到其数据区。
 
选中的那个就是B0属性。这里我们用到的就是紫色那个run,根据run我们知道其数据在55554簇处,即偏移(55554)x*(512)d(我的这个盘一个簇就一个扇区) = (AAAA800)x
我们来到这里:
 
看紫色部分。$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。
 
这样不好看,这样

 

额,比直接看数据好多了。。。。。
上面那几个带颜色的时必须填对的…还有那个USA你得在这个MFT的每个扇区的末尾都得设置.例如我这里的是01 00 (看上面偏移AAB1A30处),那么我们就得在这个MFT的两个扇区的末尾都设置成这个.如图:
第一个扇区
 

第二个扇区:
 
就是这样了…
唉,..我这里得atributeID忘加了…日志记录也没加。不过对于我们的目标来说无所谓

4,添加index_entry

Mft添加完了我们得到再到索引中添加….
我们先到第五个MFT也就是root中找到其A0属性,找到索引根

 

其run就是上图紫色部分.我们来到其数据处

 

上面紫色是index_entry的总长度,我们在添加index_entry后也要修改这个值。
我添加的index_entry如下图所示:
 

注意最后这个表示末尾的这一行必须得有呀…别的按照结构体格式直接加就行了。

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就能找到数据区了)

 

我们的MFT的扇区是(AAB1)x + (1000BE00)x = (100168B1)x

 

已经使用了….
基本就是这样了…
我不会刷新缓存,但是重启很麻烦.。这里就体现出用filedisk的方便之处了.首先卸载磁盘,然后重新创建这个磁盘.缓存就会自动刷新了。新建的文件也就会显示出来了。
 

要想加data的话在其FILERECORD得80中加就行了。。

切记。这个程序只对上面说的环境有效。不可在真实磁盘中做实验呀。。。用filedisk创建个虚拟磁盘玩玩还是可以的。。。

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

上传的附件 ntfs_cmd.rar