探索NTFS
unsigned short NextAttributeNumber = 0x6, "\0\x06"
file参数我传入的是$MFT,从$MFT的LCN=4可以得到其在卷中的物理地址,这在上面已说明。你也可以使用dskprobe(我机子中为第LCN*SectorsPerCluster=4*8扇区)得到底下SoftICE的输出结果:
:dd @file //以下的注释可对照文中开头列出的FILE_RECORD_HEADER定义。
0023:00344D38 454C4946 0003002A 6D4AC04D 00000000 FILE*...M.Jm....
0023:00344D48 00010001 00010030 000002D8 00000400 ....0...........
----
|__AttributeOffset
0023:00344D58 00000000 00000000 04340006 0000FA0D ..........4.....
0023:00344D68 00000010 00000060 00180000 00000000 ....`...........
-------- --------
| |_指出这个Attribute的长度。定义如下。
|_根据AttributeOffset得到的Attribute头,定义如下。00000010指出这个Attribute为StandardInformation
0023:00344D78 00000048 00000018 2C1761D0 01BFB03C H........a.,<...
Attribute头如下定义:
typedef struct {
ATTRIBUTE_TYPE AttributeType;
ULONG Length;
BOOLEAN Nonresident;
UCHAR NameLength;
USHORT NameOffset;
USHORT Flags; // 0x0001 = Compressed
USHORT AttributeNumber;
} ATTRIBUTE, *PATTRIBUTE;
typedef struct {
ATTRIBUTE Attribute;
ULONG ValueLength;
USHORT ValueOffset;
USHORT Flags; // 0x0001 = Indexed
} RESIDENT_ATTRIBUTE, *PRESIDENT_ATTRIBUTE;
typedef struct {
ULONGLONG DirectoryFileReferenceNumber;
ULONGLONG CreationTime; // Saved when filename last changed
ULONGLONG ChangeTime; // ditto
ULONGLONG LastWriteTime; // ditto
ULONGLONG LastAccessTime; // ditto
ULONGLONG AllocatedSize; // ditto
ULONGLONG DataSize; // ditto
ULONG FileAttributes; // ditto
ULONG AlignmentOrReserved;
UCHAR NameLength;
UCHAR NameType; // 0x01 = Long, 0x02 = Short
WCHAR Name[1];
} FILENAME_ATTRIBUTE, *PFILENAME_ATTRIBUTE;
ATTRIBUTE_TYPE是一个Enum型定义。其中00000010为StandardInformation。30为FileName。因为FileNameAttribute总是一个常驻Attribute,所以我将RESIDENT_ATTRIBUTE定义也给出。OK,现在可以继续Dump下一个Attribute:
// dd @file+file->AttributeOffset+length(StandardInformationAttribute)
:dd @file+30+60
0023:00344DC8 00000030 00000068 00180000 00030000 0...h...........
-------- ------
| |___这里的NameLength与NameOffset指FileNameAttribute名。不要与$MFT FileName混谣。
|_指出这是一个FileNameAttribute。
0023:00344DD8 0000004A 00010018 00000005 00050000 J...............
-------- ---- --------
| | |_根据ValueOffset的值,得到FILENAME_ATTRIBUTE的具体位置。
| |_ValueOffset值
|_ValueLength值
0023:00344DE8 2C1761D0 01BFB03C 2C1761D0 01BFB03C .a.,<....a.,<...
0023:00344DF8 2C1761D0 01BFB03C 2C1761D0 01BFB03C .a.,<....a.,<...
0023:00344E08 00004000 00000000 00004000 00000000 .@.......@...... |