1.关于硬盘分区:
IDE接口硬盘中,不管什么操作系统,都有如下结构:
|
MBR(Master Boot Record)及基本分区表
|
|
分区1
|
|
分区2
|
|
......
|
|
分区n
|
MBR和基本分区表共用硬盘的第一个扇区(即0面0道1扇区,以后简称第一扇区MBR),分区表位于扇区的最后66字节,除了最后的2字节55AA外,为4条分区记录,每条分区记录16字节。
各字段含义如下:
|
偏移
|
意义
|
|
0
|
自举标志(80为活动分区,00为非活动分区)
|
|
1
|
起始磁头号H
|
|
2
|
起始扇区号S
|
|
3
|
起始柱面号CYL(CYL的高2位存放在S字节的高2位
|
|
4
|
分区格式标志(01:fat12;05:extended;06:fat16;07:hpfs/ntfs;0b,0d:win95 fat32;0e:win95 fat16;82:linux swap;83:linux;85:linux extended)
|
|
5
|
终止磁头号H
|
|
6
|
终止扇区号S
|
|
7
|
终止柱面号CYL
|
|
8-11
|
本分区之前已用扇区数(当分区表属于扩展分区中的记录时,该值为相对扩展分区首地址的位置)
|
|
12-15
|
本分区扇区总数
|
(
注意:C/H/S的编址从0/0/1开始)
可以看出,使用C/H/S三维地址时,磁盘的寻址空间最多只有224个扇区,即8GB的容量,当磁盘容量大于8GB时,C/H/S就无法寻址了。
于是采用LBA(logic block address)线性地址来寻址。在LBA方式下系统把所以的物理扇区都按某种方式或规则看做是一线性编号的扇区,即从0到某个最大值方式排列。
C/H/S到LBA:
LBA=(C-c)*PH*PS+(H-h)*PS+(S-s)
一般情况下c=0,h=0,s=1,PS=63,PH=255,PS表示每磁道多少扇区,PH表示每柱面多少磁道。
LBA到C/H/S:
C=LBA/(PH*PS)+c
H=(LBA/PS)MOD PH +h
S=LBA MOD PS + s
由于MBR只能记录4个分区的信息,windows通过扩展分区来记录多于4个分区的记录,称做虚拟MBR。
做法是:
让主MBR在定义分区时,将多余容量定义为扩展分区,指定该分区的起始位置,根据起始位置指向硬盘的某一扇区,作为下一个分区表,在该扇区继续定义分区。如果只有一个分区,就定义该分区,然后结束;如果不止一个分区,就定义一个基本分区和一个扩展分区,扩展分区再指向下一个分区表,在下一个分区表中继续定义分区,直至结束。这样就形成一个分区链,可以描述所有的分区。
一个分区表的例子:
|
MBR
|
80 01 01 00 0C FE FF FF 3F 00-00 00 FC 8A 38 01 00 00 C1 FF 83 FE FF FF 3B 8B-38 01 6E 9A F6 00 00 00 C1 FF 82 FE FF FF A9 25-2F 02 E1 16 08 00 00 00 C1 FF 0F FE FF FF 8A 3C-37 02 62 43 53 07 55 AA |
|
EXT-1:
|
00 01 C1 FF 0B FE FF FF 3F 00-00 00 37 16 71 02 00 00 C1 FF 05 FE FF FF 76 16-71 02 3B 8B 38 01 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA |
|
EXT-2:
|
00 01 C1 FF 0B FE FF FF 3F 00-00 00 FC 8A 38 01 00 00 C1 FF 05 FE FF FF B1 A1-A9 03 2C D5 FB 02 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA |
|
EXT-3:
|
00 01 C1 FF 0B FE FF FF 3F 00-00 00 ED D4 FB 02 00 00 C1 FF 05 FE FF FF DD 76-A5 06 3E 15 AC 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA |
|
EXT-4:
|
00 01 C1 FF 0B FE FF FF 3F 00-00 00 FF 14 AC 00 00 00 C1 FF 05 FE FF FF 1B 8C-51 07 47 B7 01 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA |
|
EXT-5:
|
00 01 C1 FF 07 FE FF FF 3F 00-00 00 08 B7 01 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA |
(注意:系统在启动时按照分区链的顺序查找分区,直到找出所有分区,如果分区链形成一个环,就形成所谓硬盘"逻辑锁",导致系统无法启动,软盘也无法启动。由于windows启动过程在io.sys中决定的,可以查找io.sys,将第一个55AA改成其他数值,程序还没开始查找分区表就结束,就避开了对分区表的检测)
2.关于INT 13
2.1通过int 13来读取物理扇区的例子:
a100 mov ax,201 mov bx,200 mov cx,1 mov dx,80 int 13 int 3 g=100 |
参数解释:
2.2扩展INT 13:
数据类型约定:
|
BYTE
|
1字节整型(8 位) |
|
WORD
|
2字节整型(16 位) |
|
DWORD
|
4字节整型(32 位) |
|
QWORD
|
8字节整型(64 位) |
磁盘地址数据包 Disk Address Packet (DAP):
DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾
越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.
DAP 的结构如下:
struct DiskAddressPacket
{
BYTE PacketSize; // 数据包尺寸(16字节)
BYTE Reserved; // ==0
WORD BlockCount; // 要传输的数据块个数(以扇区为单位)
DWORD BufferAddr; // 传输缓冲地址(segment:offset,在内存中为offset在低地址
如166b:400在内存中为:00 04 6b 16)
QWORD BlockNum; // 磁盘起始绝对块地址(即LBA地址)
};
驱动器参数数据包 Drive Parameters Packet:
驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中
使用的数据包. 格式如下:
struct DriveParametersPacket
{
WORD InfoSize; // 数据包尺寸 (26 字节)
WORD Flags; // 信息标志
DWORD Cylinders; // 磁盘柱面数
DWORD Heads; // 磁盘磁头数
DWORD SectorsPerTrack; // 每磁道扇区数
QWORD Sectors; // 磁盘总扇区数
WORD SectorSize; // 扇区尺寸 (以字节为单位)
};
2.2.1) 检验扩展功能是否存在
入口:
AH = 41h
BX = 55AAh
DL = 驱动器号
返回:
CF = 0
AH = 扩展功能的主版本号
AL = 内部使用
BX = AA55h
CX = API 子集支持位图
CF = 1
AH = 错误码 01h, 无效命令
这个调用检验对特定的驱动器是否存在扩展功能.如果进位标志置 1
则此驱动器不支持扩展功能. 如果进位标志为 0, 同时 BX = AA55h, 则
存在扩展功能. 此时 CX 的 0 位表示是否支持第一个子集,1位表示是否
支持第二个子集.
对于 1.x 版的扩展 Int13H 来说, 主版本号 AH = 1. AL是副版本号,
但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值.
2.2.2) 扩展读
入口:
AH = 42h
DL = 驱动器号
DS:SI = 磁盘地址数据包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将磁盘上的数据读入内存. 如果出现错误, DAP 的BlockCount
项中则记录了出错前实际读取的数据块个数.
2.2.3) 扩展写
入口:
AH = 43h
AL
0 位 = 0 关闭写校验
1 打开写校验
1 - 7 位保留, 置 0
DL = 驱动器号
DS:SI = 磁盘地址数据包(DAP)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将内存中的数据写入磁盘. 如果打开了写校验选项,但 BIOS
不支持, 则会返回错误码 AH = 01h, CF = 1. 功能 48h可以检测BIOS是否
支持写校验.
如果出现错误, DAP 的 BlockCount项中则记录了出错前实际写入的数
据块个数.
2.2.4) 校验扇区
入口:
AH = 44h
DL = 驱动器号
DS:SI = 磁盘地址数据包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用校验磁盘数据,但并不将数据读入内存.如果出现错误, DAP 的
BlockCount 项中则记录了出错前实际校验的数据块个数.
2.2.5) 锁定/解锁驱动器
入口:
AH = 45h
AL
= 0 锁定驱动器
= 1 驱动器解锁
= 02 返回锁定/解锁状态
= 03h-FFh - 保留
DL = 驱动器号
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用用来缩定指定驱动器中的介质.
所有标号大于等于 0x80 的可移动驱动器必须支持这个功能.如果
在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用,将
会成功返回.
驱动器必须支持最大255次锁定, 在所有锁定被解锁之前,不能在物理上
将驱动器解锁. 解锁一个未锁定的驱动器,将返回错误码 AH= B0h.如果锁定一
个已锁定了255次的驱动器, 将返回错误码 AH = B4h.
锁定一个没有介质的驱动器是合法的.
2.2.6) 弹出可移动驱动器中的介质
入口:
AH = 46h
AL = 0 保留
DL = 驱动器号
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用用来弹出指定的可移动驱动器中的介质.
所有标号大于等于 0x80 的可移动驱动器必须支持这个功能.如果
在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用,将
会返回错误码 AH = B2h (介质不可移动).如果试图弹出一个被锁定的介质
将返回错误码 AH = B1h (介质被锁定).
如果试图弹出一个没有介质的驱动器, 则返回错误码 Ah =31h (驱动器
中没有介质).
如果试图弹出一个未锁定的可移动驱动器中的介质,Int13h会调用 Int15h
(AH = 52h) 来检查弹出请求能否执行.如果弹出请求被拒绝则返回错误码(同
Int15h). 如果弹出请求被接受,但出现了其他错误, 则返回错误码 AH =B5h.
2.2.7) 扩展定位
入口:
AH = 47h
DL = 驱动器号
DS:SI = 磁盘地址数据包(Disk Address Packet)
返回:
CF = 0, AH = 0 成功
CF = 1, AH = 错误码
这个调用将磁头定位到指定扇区.
2.2.8) 取得驱动器参数
入口:
AH = 48h
DL = 驱动器号
DS:SI = 返回数据缓冲区地址
返回:
CF = 0, AH = 0 成功
DS:SI 驱动器参数数据包地址,(参见前面的文章)
CF = 1, AH = 错误码
这个调用返回指定驱动器的参数.
2.2.9) 取得扩展驱动器介质更换检测线状态
入口:
AH = 49h
DL = 驱动器号
返回:
CF = 0, AH = 0 介质未更换
CF = 1, AH = 06h 介质可能已更换
这个调用返回指定驱动器的介质更换状态.
这个调用与 Int13h AH = 16h 子功能调用相同,只是允许任何驱动器
标号.如果对一台支持可移动介质功能子集的固定驱动器使用此功能,则永远
返回 CF = 0, AH = 0.
简单地将可移动介质锁定再解锁就可以激活检测线,而无须真正更换介质.
2.2.10) Int 15h 可移动介质弹出支持
入口:
AH = 52h
DL = 驱动器号
返回:
CF = 0, AH = 0 弹出请求可能可以执行
CF = 1, AH = 错误码 B1h 或 B3h 弹出请求不能执行
这个调用是由 Int13h AH=46h弹出介质功能调用内部使用的
(注:MBR的分区表中,8-11字节——本分区之前已用扇区数,即该分区首扇区的LBA地址。通过扩展int 13即可访问磁盘的任意扇区)
3.FAT文件系统的结构:
3.1 FAT12,FAT16:
DBR--FAT1--FAT2--DFT--DATA
DBR只占1个扇区,DFT为根目录表,根目录下的DIR项数固定,一般为512项,每项占32字节,即DIR占32个扇区
则一个文件的逻辑扇区号:
| 逻辑扇区号=1+2*FAT占用的扇区数+DIR占用的扇区数+(起始簇号-2)*每簇扇区数 |
3.2FAT32:
DBR和其后的保留扇区--FAT1--FAT2-DATA
在DBR使用3个扇区,实际只使用第1个扇区,2,3扇区也写入55AA标志,之后有保留扇区,一般为20h或21h,其中第6扇区是DBR的备份。同时DIR当作文件处理,不在固定位置,也没有固定大小
则文件的逻辑扇区号:
| 逻辑扇区号=保留扇区数+2*FAT占用扇区数+(起始簇号-2)*每簇扇区数 |
此时因为DIR不固定,要在BPB中读出DIR的入口簇。
对于一个确定的分区,可通过逻辑地址来访问该分区中的扇区。逻辑地址从0开始。
在98和dos下可用debug的L命令来访问:
L [address] [drive] [firstsector] [number] 读逻辑盘的扇区,扇区号为逻辑地址,0为DBR即BOOT区 drive按A,B,C,D排序,对应0,1,2,3... 对应W命令: W [address] [drive] [firstsector] [number] W若不带参数,或只有地址参数,则按BX:CX寄存器指出的字节,从内 存向磁盘写入数据。此时的文件名是此命令前最后一个使用过的文件名 ,或者是N命令中指定的文件,如果没有使用过N命令,则使用Debug命 令行中指定的文件。 |
DBR(dos boot record)操作系统可访问的第一个扇区。包括一个引导程序和BPB(bios parameter block)的本分区参数记录表。
FAT(file allocation table)fat中的记录和磁盘上的簇对应。FAT2为FAT1的备份。FAT的格式有多种,其中FAT16是指文件分配表使用16位表示一个簇,FAT12,FAT32同理。可知FAT16最多能管理65536个簇,而每簇最大32kb,所以FAT16每个分区最大2GB。
(注:FAT的0,1簇保留,0字节表示磁盘类型,簇号从2开始。)
DFT(文件目录表)根目录区,只存在FAT12和FAT16中,紧跟在FAT2后。根目录下的文件和子目录在DFT中都有一个‘目录登记项'每个项占32字节,项数在BPB中说明。FAT32中DFT无固定位置,把DFT当作一个普通文件处理,在BPB中指出DFT首簇地址。
长文件名规则:
目录项保存该文件的短文件名,长文件名用若干个长文件名目录向保存,长文件名目录项倒序排列在文件短目录项前面,采用双字节unicode内码保存,每项最多13个内码,首字节是顺序字节,指明是长文件名的第几项,11字节为0F,12字节指明类型,13字节为校验和,26,27字节为0。
--------------------------------------------------------------------------
3.3 FAT文件系统的的一些参数:
3.3.1 FAT16的BPB:
|
偏移
|
长度
|
说明
|
|
00
|
3
|
JMP指令;跳转到引导程序。后随一个空操作。(不属BPB)
|
|
03
|
8
|
OEM标志(FAT16为MSWIN4.0)
|
|
0B
|
2
|
每扇区字节数
|
|
0D
|
1
|
每簇扇区数
|
|
0E
|
2
|
dos保留扇区数
|
|
10
|
1
|
FAT数
|
|
11
|
2
|
根目录项数,如512
|
|
13
|
2
|
扇区数(小于32M的分区) |
|
15
|
1
|
介质描述符
|
|
16
|
2
|
每FAT扇区数 |
|
18
|
2
|
每磁道扇区数(逻辑参数)
|
|
1A
|
2
|
磁头数(逻辑参数 |
|
1C
|
4
|
隐含扇区(即分区表中的8-11字节——本分区之前已用扇区数)***
|
|
20
|
4
|
扇区数(即分区表中的12-15字节)
|
|
24
|
1
|
BIOS设备号(hex:HD=8x)
|
|
25
|
1
|
未使用
|
|
26
|
1
|
扩展引导标记
|
|
27
|
4
|
卷序列号(随机)
|
|
2B
|
11
|
卷标,分区标识,如:WIN98
|
|
36
|
8
|
文件系统格式:FAT16
|
3.3.2 FAT32的BPB:
| 偏移 |
长度 |
说明 |
|
00
|
3
|
JMP指令
|
|
03
|
8
|
OEM标志(FAT32为MSWIN4.1)
|
|
0B
|
2
|
每字节扇区数
|
|
0D
|
1
|
每簇扇区数
|
|
0E
|
2
|
dos保留扇区数,FAT32中一般是32
|
|
10
|
1
|
FAT数
|
|
11
|
2
|
根目录项数,一般为0,未使用
|
|
13
|
2
|
扇区数(小于32M的分区,FAT32中不再使用)
|
|
15
|
1
|
介质描述符
|
|
16
|
2
|
每FAT扇区数(FAT32下不用)
|
|
18
|
2
|
每磁道扇区数(逻辑参数)
|
|
1A
|
2
|
磁头数(逻辑参数)
|
|
1C
|
4
|
隐含扇区(即分区表中的8-11字节——本分区之前已用扇区数)***
|
|
20
|
4
|
扇区数(即分区表中的12-15字节)
|
|
24
|
4
|
每FAT扇区数
|
|
28
|
2
|
标记
|
|
2A
|
2
|
版本
|
|
2C
|
4
|
根目录首簇地址
|
|
30
|
2
|
DBR占用的扇区数
|
|
32
|
2
|
备份DBR地址
|
|
34
|
12
|
保留
|
|
40
|
1
|
BIOS设备号(hex:HD=8x)
|
|
41
|
1
|
未使用
|
|
42
|
1
|
扩展引导标记
|
|
43
|
4
|
卷序列号(随机)
|
|
47
|
11
|
卷标,分区标识,如:WIN2000
|
|
52
|
8
|
文件系统格式:FAT32 |
3.3.3 磁介质描述符:
| 十六进制 |
说明 |
|
F8
|
硬盘 |
|
F9
|
双面5in软盘(15扇区高密度)双面3in软盘 |
|
FA
|
双面3in RAM虚拟盘 |
|
FC
|
单面5in软盘(9扇区高密度) 双面8in盘 |
|
FD
|
双面5in盘(9扇区低密度) |
|
FE
|
单面8in盘(单、双密度)单面5in盘(8扇区低密度) |
|
FF
|
双面5in盘(8扇区低密) |
3.3.4 FAT中每个簇号可取的表项值及含义:
|
表项值(12位)
|
表项值(16位)
|
表项值(32位)
|
簇描述含义
|
|
000H
|
0000H
|
00000000H
|
未使用的簇
|
|
002H-FEFH
|
0002H-FFEFH
|
00000002H-FFFFFFEFH
|
已分配的簇(可见簇号从2开始)
|
|
FF0H-FF6H
|
FFF0H-FFF6H
|
FFFFFFF0H-FFFFFFF6H
|
保留
|
|
FF7H
|
FFF7H
|
FFFFFFF7H
|
坏簇
|
|
FF8H-FFFH
|
FFF8H-FFFFH
|
FFFFFFF8H-FFFFFFFFH
|
文件结束簇
|
3.3.5 FAT16的FDT字段含义:
|
偏移
|
长度
|
说明
|
|
0-7
|
8
|
文件名
|
|
8-10
|
3
|
扩展名
|
|
11
|
1
|
属性字节(00000000读写,00000001只读,00000010隐藏,00000100系统,00001000卷标,00010000子目录,00100000档案)
|
|
12-21
|
10
|
保留未用
|
|
22-23
|
2
|
文件创建时间(hhhhh mmmmmm sssss)
|
|
24-25
|
2
|
文件创建时间(yyyyyyy mmmm ddddd)
|
|
26-27
|
2
|
表示文件的首簇号
|
|
28-31
|
4
|
文件长度 |
3.3.6 FAT32的FDT字段含义:
|
偏移
|
长度
|
说明
|
|
0-7
|
8
|
文件名
|
|
8-10
|
3
|
扩展名
|
|
11
|
1
|
属性字节(同FAT16,但为0FH时,表示该项为长文件名记录项)
|
|
12-13
|
2
|
种类、校验和
|
|
13-15
|
3
|
文件创建时间(hhhhh mmmmmm sssss,后8位为毫秒数)
|
|
16-17
|
2
|
文件创建时间(yyyyyyy mmmm ddddd)
|
|
18-19
|
2
|
最新访问日期,定义同16-17
|
|
20-21
|
2
|
起始簇的高16位
|
|
22-23
|
2
|
最新修改时间(hhhhh mmmmmm sssss)
|
|
24-25
|
2
|
最新修改日期,定义同16-17
|
|
26-27
|
2
|
起始簇的低16位
|
|
28-31
|
4
|
文件长度
|
通过以上信息,经过debug的L命令即可读出FAT系统中任意文件的内容。
--------------------------------------------------------------------------
4.NTFS文件系统的结构:
分区引导扇区——MFT(主文件表)——系统文件——文件区域
在NTFS中,磁盘上的任何事物都为文件。
文件通过MFT来确定其在磁盘上的存储位置。主文件表是一个与文件相对应的数据库,由一系列文件记录组成——卷中每个文件都有一个文件记录(对于大型文件可能有多个记录与之对应)。主文件表自身也有它自己的记录。MFT的文件记录大小一般是固定的,不管簇的大小是多少,均为1k。MFT仅供系统本身组织架构文件系统使用,被称为元数据,不能被应用程序访问。其中最基本的前16个记录是操作系统使用的非常重要的元数据文件。这些文件都以‘$'开始,是隐藏文件,不能用dir命令列出。不过有个工具nfi.exe可以转储重要的元数据文件。
NTFS使用逻辑簇号LCN和虚拟簇号VCN来对簇进行定位。LCN是对整个卷从头到尾的编号,相当于FAT系统的逻辑簇号。VCN是对特定文件的簇从头到尾进行编号。VCN可以映射成LCN。

NTFS把磁盘分成两大部分,大约12%分配给MFT,余下的用来存储文件。
NTFS通过MFT访问卷的过程如下:
-
首先必须装载该卷——查看引导文件($Boot元数据文件),找到MFT的物理地址;
-
然后从文件记录的数据属性中获得VCN到LCN的映射信息,并存储在内存中。这个映射信息定位了MFT的运行(run或extent,见常驻属性与非常驻属性)在磁盘上的位置;
-
接着再打开几个元数据文件的MFT记录,并打开这些文件。此后,用户就可以访问该卷了。
NTFS将文件作为‘属性/属性值'的集合来处理。文件数据就是未命名属性的值。一个文件通常占用一个文件记录。但当一个文件具有很多项属性值或很零碎的时候,就可能需要占用一个以上的文件记录。这种情况下,第一个文件记录是其基本的文件记录,存储有该文件需要的其他文件记录的位置。小文件和文件夹将全部存储在文件的MFT记录里。
NTFS的文件夹只是一个简单的文件名和文件引用号的索引,如果目录列表小于一个记录的长度,那么,该文件夹的所有信息都存储在主文件表的记录中。对于大于记录的文件夹则使用B+树进行管理,并用一个指针指向一个外部簇,该簇用来存储那些MFT内存储不了的文件夹的属性。

当一个文件很小时,其所有属性和属性值都可以存放在MFT的文件记录中。当属性值能直接存放在MFT中时,该属性就称为常驻属性(resident attribute)。有些属性总是常驻的,这样NTFS才可以确定其他非常驻属性。
大文件或大目录的所有属性,就不可能常驻在MFT中。如果一个属性太大而不能存放在只有1KB大小的MFT文件记录中,那么NTFS将从MFT之外为之分配区域。这些区域通常称为一个运行(run)或一个盘区(extent),它们可用来存储属性值,如文件数据。如果以后属性值又增加,那么,NTFS将回再分配一个运行,以便用来存储额外的数据。值存储在运行中而不是在MFT文件记录中的属性称为非常驻属性。
在标准属性中,只有可以增长的属性才是非常驻的。对文件来说,可增长属性有数据、属性列表等。

4.1 NTFS的BPB:
|
偏移
|
长度
|
说明
|
|
00
|
3
|
JMP指令
|
|
03
|
8
|
OEM标志 |
|
0B
|
2
|
每扇区字节数 |
|
0D
|
1
|
每簇扇区数
|
|
0E
|
2
|
保留扇区
|
|
10
|
3
|
总为0 |
|
13
|
2
|
NTFS未使用,总为0
|
|
15
|
1
|
介质描述
|
|
16
|
2
|
总为0
|
|
18
|
2
|
每磁道扇区数
|
|
1A
|
2
|
磁头数
|
|
1C
|
4
|
隐含扇区
|
|
20
|
4
|
NTFS未使用,总为0 |
|
24
|
4
|
NTFS未使用,总为0 |
|
28
|
8
|
扇区总数
|
|
30
|
8
|
$MFT的逻辑簇号
|
|
38
|
3
|
$MFTMirr的逻辑簇号
|
|
40
|
4
|
每MFT记录簇数
|
|
44
|
4
|
每索引簇数
|
|
48
|
8
|
卷标
|
|
50
|
4
|
校验和
|
4.2 NTFS元文件:
|
序号
|
元文件
|
功能
|
|
0
|
$MFT
|
主文件表本身
|
|
1
|
$MFTMirr
|
主文件表的部分镜像(内容就是前16个文件记录)
|
|
2
|
$LogFile
|
日志文件
|
|
3
|
$Volume
|
卷文件
|
|
4
|
$AttrDef
|
属性定义列表
|
|
5
|
$Root
|
根目录
|
|
6
|
$Bitmap
|
位图文件
|
|
7
|
$Boot
|
引导文件
|
|
8
|
$BadClus
|
坏簇文件
|
|
9
|
$Secure
|
安全文件
|
|
10
|
$UpCase
|
大写文件
|
|
11
|
$Extend metadata directory
|
扩展元数据目录
|
|
12
|
$Extend\$Reparse
|
重解析点文件
|
|
13
|
$Extend\$UsnJrnl
|
变更日志文件
|
|
14
|
$Extend\Quota
|
配额管理文件
|
|
15
|
$Extend\$ObjId
|
对象ID文件
|
|
16-23
|
|
保留
|
|
23+
|
|
用户文件和目录
|
4.3 MFT的结构:
|
偏移
|
长度
|
属性
|
|
00
|
4
|
标志,一定是‘FILE'
|
|
04
|
2
|
更新序列US的偏移 |
|
06
|
2
|
更新序列号USN的大小与数组,包括第一个字节
|
|
08
|
8
|
日志文件序列号
|
|
10
|
2
|
序列号(SN)
|
|
12
|
2
|
硬连接数
|
|
14
|
2
|
第一个属性的偏移地址
|
|
16
|
2
|
标志,1表示记录正在使用,2表示该记录为目录
|
|
18
|
4
|
记录头和属性的总长度,即文件记录的实际长度 |
|
1C
|
4
|
总共分配给记录的长度 |
|
20
|
8
|
基本文件记录中的文件索引号 |
|
28
|
2
|
下一属性ID |
|
2A
|
2
|
Windows XP中使用,边界
|
|
2C
|
4
|
Windows XP中使用,文件记录号
|
4.4 标准索引头结构:
|
偏移
|
长度
|
属性
|
|
00
|
4
|
总是‘INDEX'
|
|
04
|
2
|
更新序号偏移
|
|
06
|
2
|
更新序列号USN的大小与排列,包括第一个字节
|
|
08
|
8
|
日志文件序列号LSN
|
|
10
|
8
|
该索引缓冲在索引分配中的索引VCN
|
|
18
|
4
|
索引入口偏移(相对18)
|
|
1C
|
4
|
索引入口的大小(相对18) |
|
20
|
4
|
索引入口的分配大小(相对18)
|
|
24
|
1
|
非页级接点为1(有子索引)
|
|
25
|
3
|
总是0 |
|
28
|
2
|
更新序列号 |
|
2A
|
2S-2
|
更新序列排列
|
4.5 常用索引表:
|
名称
|
索引
|
说明
|
|
$I30
|
文件名
|
目录使用
|
|
$SDH
|
安全描述
|
$Secure
|
|
$SII
|
安全IDS
|
$Secure
|
|
$O
|
对象Ids
|
$ObjId
|
|
$O
|
所有者
|
$Quota
|
|
$Q
|
配额
|
$Quota
|
|
$R
|
重解析点
|
$Reparse
|
4.6 NTFS卷上常用的属性说明:
|
属性名
|
属性描述 |
|
$VOLUME_INFORMATION
|
卷信息,仅存在于$Volume元数据文件中 |
|
$VOLUME_NAME
|
卷名称或标识,仅存在于$Volume元数据文件中 |
|
$STANDARD_INFORMATION
|
标准信息,包括基本文件属性,如只读、存档;时间标记;有多少目录指向本文件(即硬连接数) |
|
$FILE_NAME
|
文件名,以Unicode表示 |
|
$SECURITY_DESCRIPTOR
|
安全描述符。(2000/XP将所有的文件安全描述符放在$Secure元数据文件中,早期版本将它与文件目录放在一起) |
|
$DATA
|
文件数据 |
|
$INDEX_ROOT
|
索引根 |
|
$INDEX_ALLOCATION
|
索引分配 |
|
$BITMAP
|
位图 |
|
$ATTRIBUTE_LIST
|
属性列表 |
|
$OBJECT_ID
|
对象ID:一个具有64个字节的标识符,其中最低16字节对卷来说是唯一的 |
|
$REPARSE_POINT
|
重解析点 |
|
$EA
|
扩充属性 |
|
$EA_INFORMATION
|
扩充属性信息 |
|
$LOGGED_UTILITY_STREAM
|
EFS加密属性 |