我的位置:首页 > 学习资料 > 论文中心 > 计算机论文 > 计算机通信 > 探索NTFS
文章搜索
热门文章
最新更新

探索NTFS

日期:2007-05-09 10:41     点击:

NTFS是Windows NT引入的新型文件系统,它具有许多新特性。本文旨在探索NTFS的底层结构,所叙述的也仅是文件在NTFS卷上的分布。NTFS中,卷中所有存放的数据均在一个叫$MFT的文件中,叫主文件表(Master File Table)。而$MFT则由文件记录(File Record)数组构成。File Record的大小一般是固定的,通常情况下均为1KB,这个概念相当于Linux中的inode。File Record在$MFT文件中物理上是连续的,且从0开始编号。$MFT仅供File System本身组织、架构文件系统使用,这在NTFS中称为元数据(Metadata)。以下列出Windows 2000 Release出的NTFS的元数据文件(我将要给出的示例代码的部分输出结果)。
    File Record(inode) FileName
    ------------------ --------
          0             $MFT
          1             $MFTMirr
          2             $LogFile
          3             $Volume
          4             $AttrDef
          5             .
          6             $Bitmap
          7             $Boot
          8             $BadClus
          9             $Secure
         10             $UpCase
         11             $Extend

    Windows 2000中不能使用dir命令(甚至加上/ah参数)像普通文件一样列出这些元数据文件。实际上File System Driver(ntfs.sys)维护了一个系统变量NtfsProtectSystemFiles用于隐藏这些元数据。默认情况下,这个变量被设为TRUE,所以使用dir /ah将得不到任何文件。知道这个行为后使用i386kd修改NtfsProtectSystemFiles后即可以列出元数据文件:

    kd> x ntfs!NtfsProtect*
    fe213498  Ntfs!NtfsProtectSystemFiles
    fe21349c  Ntfs!NtfsProtectSystemAttributes
    kd> dd ntfs!NtfsProtectSystemFiles l 2
    fe213498  00000001 00000001
    kd> ed ntfs!NtfsProtectSystemFiles 0
    kd> dd ntfs!NtfsProtectSystemFiles l 2
    fe213498  00000000 00000001
    kd>

    D:\>ver

    Microsoft Windows 2000 [Version 5.00.2195]

    D:\>dir /ah $*
     驱动器 D 中的卷是 W2KNTFS
     卷的序列号是 E831-9D04

     D:\ 的目录

    2000-04-27  19:31               36,000 $AttrDef
    2000-04-27  19:31                    0 $BadClus
    2000-04-27  19:31               67,336 $Bitmap
    2000-04-27  19:31                8,192 $Boot
    2000-04-27  19:31       <DIR>          $Extend
    2000-04-27  19:31           13,139,968 $LogFile
    2000-04-27  19:31           27,575,296 $MFT
    2000-04-27  19:31                4,096 $MFTMirr
    2000-04-27  19:31              131,072 $UpCase
    2000-04-27  19:31                    0 $Volume
                   9 个文件     40,961,960 字节
                   1 个目录     51,863,552 可用字节

    需要指出的是ntfs.sys将元数据文件以一种特殊的方式打开,所以在打开NtfsProtectSystemFiles后,如果使用ReadFile等产生IRP_MJ_READ等IRP包时将会导致Page Fault(详见Gary Nebbett的《Windows NT/2000 Native API Reference》)。

    以上的讨论均是基于$MFT文件而讨论的,即基于$MFT中的File Record(inode)讨论的。为更好的继续以下的讨论,这儿我列出File Record Header的结构:

    typedef struct {
        ULONG Type;
        USHORT UsaOffset;
        USHORT UsaCount;
        USN Usn;
    } NTFS_RECORD_HEADER, *PNTFS_RECORD_HEADER;

    typedef struct {
        NTFS_RECORD_HEADER Ntfs;
        USHORT SequenceNumber;
        USHORT LinkCount;
        USHORT AttributesOffset;
        USHORT Flags;               // 0x0001 = InUse, 0x0002 = Directory
        ULONG BytesInUse;
        ULONG BytesAllocated;
        ULONGLONG BaseFileRecord;
        USHORT NextAttributeNumber;
    } FILE_RECORD_HEADER, *PFILE_RECORD_HEADER;

    下面我将讨论如何定位$MFT。稍微有点操作系统知识的人都会知道引导扇区(Boot Sector),其物理位置为卷中的第一个扇区。以下由dskprobe.exe(Windows 2000 Resource Kit中的一个小工具)分析的第一个扇区(当然也可以使用WinHex等其他应用程序):

    File: d:\Sector00.bin
    Size: 0x00000200 (512)

    Address  | 00 01 02 03-04 05 06 07 : 08 09 0A 0B-0C 0D 0E 0F | 0123456789ABCDEF
    ---------|-------------------------:-------------------------|-----------------
    00000000 | EB 52 90 4E-54 46 53 20 : 20 20 20 00-02 08 00 00 | ?R?NTFS    .....
    00000010 | 00 00 00 00-00 F8 00 00 : 3F 00 F0 00-3F 00 00 00 | .....?..?.e.?...
    00000020 | 00 00 00 00-80 00 80 00 : 90 C0 41 00-00 00 00 00 | ....

其他文章 相关文章