资源描述:
《浅议探索ntfs》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、浅议探索NTFSNTFS是etadata)。以下列出FT1$MFTMirr2$LogFile3$Volume4$AttrDef5.6$Bitmap7$Boot8$BadClus9$Secure10$UpCase11$ExtendicrosoftFT2000-04-2719:314,096$MFTMirr2000-04-2719:31131,072$UpCase2000-04-2719:310$Volume9个文件40,961,960字节1个目录51,863,552可用字节需要指出的是ntfs.sys将元数据文件以一种非凡的方式打开,所以在打开NtfsPro
2、tectSystemFiles后,假如使用ReadFile等产生IRP_MJ_READ等IRP包时将会导致PageFault(详见GaryNebbett的《FT中的FileRecord(inode)讨论的。为更好的继续以下的讨论,这儿我列出FileRecordHeader的结构:typedefstruct{ULONGType;USHORTUsaOffset;USHORTUsaCount;USNUsn;}NTFS_RECORD_HEADER,*PNTFS_RECORD_HEADER;typedefstruct{NTFS_RECORD_HEADERNtfs;U
3、SHORTSequenceNumber;USHORTLinkCount;USHORTAttributesOffset;USHORTFlags;//0x0001=InUse,0x0002=DirectoryULONGBytesInUse;ULONGBytesAllocated;ULONGLONGBaseFileRecord;USHORTNextAttributeNumber;}FILE_RECORD_HEADER,*PFILE_RECORD_HEADER;下面我将讨论如何定位$MFT。稍微有点操纵系统知识的人都会知道引导扇区(BootSector),其物理位
4、置为卷中的第一个扇区。以下由dskprobe.exe(bz1;USHORTMbz2;USHORTReserved1;UCHARMediaType;USHORTMbz3;USHORTSectorsPerTrack;USHORTNumberOfHeads;ULONGPartitionOffset;ULONGReserved2[2;ULONGLONGTotalSectors;ULONGLONGMftStartL;ULONGLONGMft2StartL;ULONGClustersPerFileRecord;ULONGClustersPerIndexBlock;UL
5、ONGLONGVolumeSerialNumber;UCHARCode[0x1AE;USHORTBootSignature;}BOOT_BLOCK,*PBOOT_BLOCK;#pragmapack(pop)各个字段的具体意义从字段名中即可大致清楚。在linux-ntfs的GNU工程(projects/linux-ntfs)中也有具体的文档,限于篇幅我不将其列出。可以使用如下代码读出卷中的第一个扇区:hVolume=CreateFile(drive,GENERIC_READ,FILE_SHARE_READ
6、FILE_SHARE_WRITE,0,OPEN_EX
7、ISTING,0,0);ReadFile(hVolume,%26amp;bootb,sizeof(bootb),%26amp;n,0);bootb是一个BOOT_BLOCK结构,在我的卷中如下格式(请对应Sector00.bin分析):DumpBootBlockatbeloberOfHeads:F0PartitionOffset:3FTotalSectors:41C090MftStartL:4Mft2StartL:41C09ClustersPerFileRecord:F6ClustersPerIndexBlock:1VolumeSerialNumber:E
8、8319D04BootSignature:AA55以上的MftStartL实在是$MFT在卷中的簇(Cluster)号。簇是NTFS的基本单位,最小单位。一个只有1Byte的文件也要占用一簇的空间。NTFS使用L(LogicalClusterNumber)来代表NTFS卷中的物理位置,其简单的从0到卷中的总簇数减一进行编号。对于一个特定的文件NTFS则使用V(VirtualClusterNumber)来映射L实现文件的组织。从MftStartL的值4可以知道$MFT的L为4和SectorsPerCluster、BytesPerSector的大小即可定位$M
9、FT的位置。得到$MFT的位置后,假如遍历$MFT中所有的File