cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:1467回复:3

硬盘结构及其分区简介

楼主#
更多 发布于:2007-05-20 02:04
[转载]硬盘结构及其分区简介
信息来源:http://et.cqyzedu.com/show.aspx?id=43&cid=17


硬盘结构简介:
      很久以前, 硬盘的容量还非常小的时候,人们采用与软盘类似的结构生产硬盘. 也就是硬盘盘片的每一条磁道都具有相同的扇区数. 由此人们定义硬盘参数为(CHS)参数,即磁头数(Heads),柱面数(Cylinders),扇区数(Sectors),以及相应的寻址方式。

  

其中:

    磁头数表示硬盘总共有几个磁头,也就是有几面盘片,最大为255 (用8个二进制位存储);

        柱面数表示硬盘每一面盘片上有几条磁道, 最大为1023(用10个二进制位存储);

        扇区数(Sectors) 表示每一条磁道上有几个扇区, 最大为63 (用6个二进制位存储);

        每个扇区一般是 512个字节, 理论上讲这不是必须的, 但好象没有取别的值的;

        所以磁盘最大容量为:

              255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes )

        或硬盘厂商常用的单位:

255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes )

在 CHS 寻址方式中, 磁头, 柱面, 扇区的取值范围分别为 0 到 Heads – 1,0 到 Cylinders - 1,1

到 Sectors (注意是从 1 开始)



在老式硬盘中,由于每个磁道的扇区数相等,所以外道的记录密度要远低于内道,因此会浪费

很多磁盘空间 (与软盘一样)。为了解决这一问题,进一步提高硬盘容量,人们改用等密度结构生产

硬盘。也就是说,外圈磁道的扇区比内圈磁道多。采用这种结构后,硬盘不再具有实际的3D参数,

寻址方式也改为线性寻址,即以扇区为单位进行寻址。为了与使用3D寻址的老软件兼容在硬盘控

制器内部安装了一个地址翻译器。由它负责将老式3D参数翻译成新的线性参数。这也是为什么现

在硬盘的3D参数可以有多种选择的原因 (不同的工作模式, 对应不同的3D参数, 如 LBA, LARGE, NORMAL)。

基本INT 13H 调用简介:
BIOS INT 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用, 它可以完成磁盘(包括硬盘和

软盘)的复位, 读写, 校验, 定位, 诊断, 格式化等功能.它使用的就是 CHS 寻址方式, 因此最大识能访问 8 GB 左右的硬盘

INT13H调用中

            AH=功能号

              AL=扇区数

              CH,CL=磁头号,扇区号

              DH,DL=磁头号,驱动器号

              ES:BX=数据缓冲区地址

功能号AH :0软盘系统复位

              1读软盘状态 只有AH有效 返回AL=状态字节

2读磁盘     成功AH=0   失败 AH=错误代码

              3写磁盘     成功AH=0   失败 AH=错误代码

              4检验磁盘扇区(ES:BX不设置)   成功AH=0   失败 AH=错误代码

              5格式化磁道 (ES:BX=磁道地址CH,CL不设置)成功AH=0     失败 AH=错误代码

8取磁盘参数 (只需设置AH,DL返回值方在CH,CL,DH中) 成功 AH=0    

失败 AH=错误代码

扩展INT 13H 调用简介:
    为了支持大于8G的硬盘,现在的主板BIOS提供了扩展INT 13H调用,它使用的是线性寻址方

式。

功能号AH:   41H 检测是否支持扩展INT 13H调用 BX=55AAH AH=0支持

42H 读磁盘扇区

DL=磁盘号

DS:SI=调用结构的地址

调用结构:

disk_addr_pkt     struc

packet_size   db   16 ; 结构长度通常为16 1字节

reserved       db   0   ; 保留 必须为0 1字节

block_count   dw   ?     ; 读取扇区数目 2字节

buffer_addr   dd   ?   ; 缓冲区地址 4字节 高2字节段址低2

节字偏移

block_num   dq   ?     ; 读取的绝对扇区起始号8字节

disk_addr_pkt     ends

成功     AH=0 失败AH=错误代码。

43H 写磁盘扇区

DL=磁盘号

DS:SI=调用结构的地址

    调用结构与读磁盘相同

成功 AH=0 失败AH=错误代码。

                  48H 取得磁盘参数    

DL=磁盘号

DS:SI= 结果缓冲区

                      结构如下

info_size   dw 26缓冲区长度 26

flags       dw ? 磁盘状态标志字

cylinders   dd   ? 磁盘逻辑柱面数

heads     dd ?   磁盘逻辑磁头数

sec_per_track dd ? 磁盘逻辑每道扇区数

sectors     dq ? 磁盘总扇区数

sector_size   dw ? 磁盘每扇区字节数

                                AH=0 失败AH=错误代码



硬盘结构及其分区简介_2

磁盘分区简介:
BOOTSECTOR简介
Boot Sector 也就是硬盘的第一个扇区, 它由 MBR (Master Boot Record), DPT (Disk Partition

Table) 和 Boot Record ID 三部分组成。

MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ), 存放系统主引导程序

(它负责从活动分区中装载并运行系统引导程序).

  DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区信息,主分区

表分为四个分区项,,每项 16 字节,分别记录了每个主分区的信息(因此最多可以有四个主分区).

Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法引导区,它等于 0xAA55

,这是判别引导区是否合法的标志。

BOOTSECTOR的具体结构如下图所示:  

 

                BOOTSECTOR结构图



分区表结构简介
分区表由四个分区项构成, 每一项长度为16个字节,分区表结构如下图所示:

 



                            分区表结构图



扩展分区简介
由于主分区表中只能分四个分区, 无法满足需求, 因此设计了一种扩展分区格式. 基本上说,

扩展分区的信息是以链表形式存放的, 但也有一些特别的地方.

首先, 主分区表中要有一个基本扩展分区项, 所有扩展分区都隶属于它,也就是说其他所有扩展

分区的空间都必须包括在这个基本扩展分区中. 对于DOS / Windows 来说, 扩展分区的类型为 0x05(EXTENDX). 除基本扩展分区以外的其他所有扩展分区则以链表的形式级联存放,后一个扩展分区的数据项记录在前一个扩展分区的分区表中, 但两个扩展分区的空间并不重叠.扩展分区类似于一个完整的硬盘, 必须进一步分区才能使用. 但每个扩展分区中只能存在一个其他分区. 此分区在 DOS/Windows 环境中即为逻辑盘. 因此每一个扩展分区的分区表 (同样存储在扩展分区的第一个扇区中)中最多只能有两个分区数据项(包括下一个扩展分区的数据项).

    扩展分区的分区表存放在该分区的第一个扇区中它的结构与硬盘的BOOTSETOR基本相同,

只是没有主引导纪录,即该扇区的0-0X1BD的数据是无效的,另外它的分区表只有前面两项是有效

的。他的最后两个字节也是合法性检测标志即55AA

    下面是扩展分区的结构示意图

    

                      扩展分区的结构示意图

硬盘分区类型
0   未使用分区项

1       DOS12一种fat表为12位的分区主要用于早期小硬盘和部分软盘

2       xenix一种linux分区

4   D0S16早期硬盘分区方法,分区表项为16位,最大支持32M分区大小

5       EXTEND扩展分区的一种该分区的 起始扇区为前面的第一个EXTENDX分区起始扇区+该分

区的相对偏移

6       BIGDOS即FAT16分区 分区表为16位,每簇最大为32K,最大分区为2G

7       NTFS分区

B   FAT32分区 分区表为32位

C   FAT32X分区与FAT32基本相同

E   BIGDOSX即FAT16分区扩展 分区表为16位,每簇最大可以超过32K

F   EXTENDX扩展分区的一种,起始扇区为该分区的相对偏移或者 前面的前面的第一个

EXTENDX分区起始扇区+该分区的相对偏移;

如何找到一个逻辑分区
    前面介绍了硬盘的分区结构,下面主要讲解如何找到一个硬盘的逻辑分区

首先读取硬盘BOOTSECTOR,读取该硬盘的分区表例如下面是一个15G硬盘

的BOOTSECTOR

0X000 33 C0 8E D0 BC 00 7C FB-50 07 50 1F FC BE 1B 7C   3.....|.P.P....|

0X010   BF 1B 06 50 57 B9 E5 01-F3 A4 CB BD BE 07 B1 04   ...PW...........

0X020   30 38 6E 00 7C 09 75 13 83-C5 10 E2 F4 CD 18 8B F5   8n.|.u..........

0X030   83 C6 10 49 74 19 38 2C-74 F6 A0 B5 07 B4 07 8B   ...It.8,t.......

0X040   F0 AC 3C 00 74 FC BB 07-00 B4 0E CD 10 EB F2 88   ..<.t...........

0X050   4E 10 E8 46 00 73 2A FE-46 10 80 7E 04 0B 74 0B   N..F.s*.F..~..t.

0X060   80 7E 04 0C 74 05 A0 B6-07 75 D2 80 46 02 06 83   .~..t....u..F...

0X070   46 08 06 83 56 0A 00 E8-21 00 73 05 A0 B6 07 EB   F...V...!.s.....



0X080   BC 81 3E FE 7D 55 AA 74-0B 80 7E 10 00 74 C8 A0   ..>.}U.t..~..t..

0X090   B7 07 EB A9 8B FC 1E 57-8B F5 CB BF 05 00 8A 56   .......W.......V

0XA0     00 B4 08 CD 13 72 23 8A-C1 24 3F 98 8A DE 8A FC   .....r#..$?.....

0XB0     43 F7 E3 8B D1 86 D6 B1-06 D2 EE 42 F7 E2 39 56   C..........B..9V

0X0C0   0A 77 23 72 05 39 46 08-73 1C B8 01 02 BB 00 7C   .w#r.9F.s......|

0X0D0   8B 4E 02 8B 56 00 CD 13-73 51 4F 74 4E 32 E4 8A   .N..V...sQOtN2..

0X0E0   56 00 CD 13 EB E4 8A 56-00 60 BB AA 55 B4 41 CD   V......V.`..U.A.

0X0F0   13 72 36 81 FB 55 AA 75-30 F6 C1 01 74 2B 61 60   .r6..U.u0...t+a`



0X100   6A 00 6A 00 FF 76 0A FF-76 08 6A 00 68 00 7C 6A   j.j..v..v.j.h.|j

0X110   01 6A 10 B4 42 8B F4 CD-13 61 61 73 0E 4F 74 0B   .j..B....aas.Ot.

0X120   32 E4 8A 56 00 CD 13 EB-D6 61 F9 C3 49 6E 76 61   2..V.....a..Inva

0X130   6C 69 64 20 70 61 72 74-69 74 69 6F 6E 20 74 61   lid partition ta

0X140   62 6C 65 00 45 72 72 6F-72 20 6C 6F 61 64 69 6E   ble.Error loadin

0X150   67 20 6F 70 65 72 61 74-69 6E 67 20 73 79 73 74   g operating syst

0X160   65 6D 00 4D 69 73 73 69-6E 67 20 6F 70 65 72 61   em.Missing opera

0X170   74 69 6E 67 20 73 79 73-74 65 6D 00 00 00 00 00   ting system.....



0X180   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0X190   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0X1A0   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0X1B0   00 00 00 00 00 2C 44 63-DE BB C4 76 00 80 01   .....,Dc...v....

0X1C0   01 00 06 FE 3F 0C 3F 00-00 00 8E 2F 03 00 00 00   ....?.?..../....

0X1D0   01 0D 0F FE FF FF CD 2F-03 00 D5 6C BC 01 00 00   ......./...l....

0X1E0   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0X1F0   00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA   ..............U.

                  一个硬盘的BOOTSECTORS数据

其中红色部分是主引导纪录(MBR)

蓝色和浅绿色是分区表数据一共是4个分区项和显然后两个分区表项是未用的。

最后两个字节是合法性标志。

对于第一个分区表项可以知道该分区是一个活动分区,分区类型是0X0C (FAT16)分区

分区相对扇区起始地址是0x3f(63) 分区大小是0x32F8E(208782个扇区大小大概为100M

由于这是柱分区该分区的起始扇区号就为0x3f;

对于第二个分区表项可以知道该分区的分区类型是0x0F(EXTENDX)分区,起始扇区地址是

0X32FCD(208845)分区大小是0X1BC6CD5(29125845)个扇区。

读取扇区0X32FCD取出扩展分区得的分区表项

00 01 01 0D 07 FE BF 0A 3F 00 00 00 3F 04 7D 00

00 00 81 0B 05 FE FF 09 7E 04 7D 00 3F 82 3E 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

取出第一个分区表项知道该分区是类型是7(NTFS分区)分区大小是0X7D043F

分区相对扇区号为0x3f可以算出分区的起始扇区是0X32FCD+0X3F=0X3300C

取出第二个分区表项知道该分区是类型是5(EXTEND分区)分区大小是0X3E823F

分区相对扇区号为0X7D047E可以算出分区的起始扇区是0X32FCD+0X7D047E=0X80344B

读取扇区0X80344B取出扩展分区得的分区表项

    00 01 81 0b 0b fe ff 08 3f 00 00 00 00 82 3e 00

    00 00 c1 0a 05 fe ff ff bd 86 bb 00 57 a7 00 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

取出第一个分区表项知道该分区是类型是0b(fat32分区)分区大小是0X3e8200

分区相对扇区号为0x3f可以算出分区的起始扇区是0X32FCD+0x7d047e +0X3F=0X80348a

取出第二个分区表项知道该分区是类型是5(EXTEND分区)分区大小是0X100a757

分区相对扇区号为0Xbb86bd可以算出分区的起始扇区是0X32FCD+0Xbb86bd=0Xbbe68a

读取扇区0Xbbe68a取出扩展分区得的分区表项

    00 01 c1 0a 07 fe ff ff 3f 00 00 00 18 a7 00 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

取出第一个分区表项知道该分区是类型是7(NTFS分区)分区大小是0X100a718

分区相对扇区号为0x3f可以算出分区的起始扇区是0X32FCD+0xbbe68a+3f=0Xbeb6c9


硬盘结构及其分区简介_3

逻辑分区简介:


FAT16 FAT32 NTFS逻辑分区BOOTSECTOR
    逻辑分区的BOOTSECTOR的第一个扇区它由以下部分组成

        跳转指令

        硬盘分区类型的文本字符名

        分区参数块

        扩展的分区参数块

        启动指令块

        合法性标志55AA

对于不同的分区类型这些块的内容与意义是不同的下面是FAT FAT32 NTFS各分区的BOOTSECTORD的内容语义的略图





                        FAT16分区BOOTSECTOR结构图            







                                      FAT32分区BOOTSECTOR结构图











                                          NTFS分区BOOTSECTOR结构图









FAT16 FAT32逻辑分区组成结构
    FAT16和FAT32的分区组成结构比较类似其基本如下:

BOOTSETCOR



保留扇区

FAT表1

FAT表2

根目录区

磁盘内容

                        

                            FAT16 FAT32逻辑盘结构图

其中FAT16的根目录区是固定大小的紧跟在FAT表后,而FAT32的根目录区可以是不固定大小的

在BOOTSECTOR中提供了根目录区的第一个簇的簇号。

    每一个目录项占20个字节这些字节的定义如下

0-A文件名 第一个字节为E5表示该目录项已被删除,为0表示未用,为2E表示是当前目录或者根目录。

B是文件属性BIT0文档 BIT1只读文件BIT2系统文件BIT3隐藏文件BIT4目录 BIT5卷标

0X10-0X13 文件创建日期

0X14-0X15   文件或目录起始簇号高16位(对FAT16无效为00 00)。

0X16-0X19   文件更改日期

    0X1A-0X1B   文件或目录起始簇号低16位。

    0X1C-0X1F   文件大小(对目录该项为0)

    整个磁盘空间是按簇划分,在BOOTSECTOR中记录了每个簇的大小参数。

  FAT表是用来记录整个磁盘空间的使用与分配情况的它的结构是一种链式结构。

    他每16个字节或者32个字节表示一个簇。例如我们在FAT16分区找到第121簇的使用情况

过程如下:

假设该分区大小为2G,起始扇区为63,FAT表为255个扇区,根目录有0X100个入口,每簇大小为64个扇区,隐含扇区为1个。

该簇在FAT表中的位置为:

  A=121*2=241;B=A%512;IF(B!=0);B=1;

  C=63+1+A/512+B;

  读取扇区C到缓冲区取第A%512/2个字即为该扇区的下一个扇区,如果为0表示该扇区未用,

为FF FF表示该扇区为最后一个扇区。其他的表示有下一个扇区。

该簇的物理磁盘扇区号是63+1+255*2+0X100*20/512+(121-2)*64

读于一个FAT32分区,要找到121簇的使用情况

假设该分区大小为4G,起始扇区为200048,FAT表为3997个扇区,每簇大小为8个扇区,根目录起始簇号为2,隐含扇区为32个。



该簇在FAT表中的位置为:

      A=121*4=241;B=A%512;IF(B!=0);B=1;

  C=20048+32+A/512+B;

读取扇区C到缓冲区取第A%512/4个双字即为该扇区的下一个扇区,如果为0表示该扇区未用,

为FF FF FF FF表示该扇区为最后一个扇区。其他的表示有下一个扇区。

    该簇的物理磁盘扇区号是20048+32+3997*2+(121-2)*8

经过上面的介绍我们就比较清楚整个FAT16 FAT32分区的寻址方式

例如读取文件C:\WINDOWS\SYSTEM.INI

首先找到逻辑盘C的起始扇区,然后读出他的根目录区,在根目录区中找到WINDOWS子目录项,

找到目录项中该子目录的起始簇,在FAT表中找到以该簇为起始簇的簇链,读出这些簇的所在的扇区内容然后找到文件名为SYTEM.INI的目录项,取得它的起始簇号,读出该簇为起始簇的簇链的所有扇区内容即可。

NTFS逻辑分区组成结构
    NTFS分区的结构比FAT16和FAT32复杂。整个NTFS分区也是和FAT分区一样以簇为基本的的存储结构,但NTFS分区把整个分区的全部扇区都作为簇来划分,而FAT分区的BOOTSECTOR

FAT表,根目录(FAT32除外),作为另外的部分它的起始簇是在这些扇区之后的。

NTFS分区的结构大概如下;

BOOTSETCOR

MFT表文件

磁盘空间

  

    BOOTSECTOR记录了MFT表的起始簇号,通过BOOTSECTOR找到MFT的起始扇区,(方法

是 磁盘起始扇区+簇号*每簇扇区数)。

    MFT表是由很多个MFT记录构成,每个MFT记录表示一个文件的信息,MFT表将整个文件系统的内容,都当成文件来处理包括它自己本身。MFT表记录将文件的所有信息都当成属性来处理。

下面是MFT记录的头结构说明。



    起始         长度                   意义

  0             4                       MFT记录标志FILE

    4             2                       修复校验偏移(Offset to fixup usually 2C)

    6             2                       修复数据长度,包含第一个字节

    8             8                       LSN

    10             2                       序列号

起始         长度                   意义

12             2                       链节个数(有多少个文件名链节在这个实际文件上)

14             2                       第一个属性的起始于该MFT记录得哪一个字节

16             2                       BIT0表示该记录中有属性值存于记录外,BIT1表示该记录中

存有文件目录

18             4                       该记录的有效字节数(记录头+所有属性长度和)

1C           4                       该记录的长度

20             8                       高2字节主MFT记录的记录号,低2字节0

28             2                       所有属性加一

2A           6+                     修复数据依赖于记录长度

                          



                                MFT记录结构示意图

MFT的记录由记录头和属性列表组成,每一个属性都有一个结构相同的属性头,属性头分两种,一种是属性内容在MFT表中,一种是属性的内容在磁盘分配的簇中,属性头分两部分对于所有属性第一部分结构是相同的第二部分结构不同:

偏移(16进制)
长度(16进制)
内容的意义

0
4
属性类型

4
2
属性总长度

8
1
属性数据是否存在MFT表中,0表示是,1表示存在磁盘分配的空间

9
1
属性名长度

A
2
属性内容相对于属性头起始地址的偏移

C
2
属性值是否压缩0表示没压缩,1表示压缩

E
2
属性标志(通常为0)


                                    属性头的第一部分内容(前16字节)

10
4
属性数据长度

14
2
属性数据起始字节(相对于属性头起始地址)

16
2
属性在MFT属性中是第几个属性(从0开始)


                            属性内容在MFT表中的属性头第二部分内容

10
10H
属性内容所在簇计算的起始簇

20
2
属性数据起始字节(相对于属性头起始地址)

22
2
属性内容压缩方法(我不太清楚这个字的意义)

28
8
为属性数据的分配空间大小

30
8
属性数据的实际大小

38
8
初始化数据长度(对于压缩的数据)

40
8
压缩前的长度(对于压缩数据)

48
不定长
vcn lcn runlength数据所在簇的位置(具体解释在后面)


                      属性内容不在MFT表中的属性的第二部分内容





属性头后紧跟的是属性内容NTFS的标准的属性包括以下几种。

10H标准信息属性       Standard information

20H 属性列表属性     Attribute list

30H文件名属性         File Name

40H卷表版本属性       Volume Version

50H安全性描述属性   Security descriptor

60H卷表名属性         Volume name

70H卷表信息属性       Volume information

80H数据内容属性       Data

90H索引根目录属性   Index Root

A0H索引分配表属性   Index Allocation

B0H镜像属性           BitMap

C0H 链节属性         Symlink

D0H HPFS扩展属性信息属性     HPFS extended attributes information

E0H HPFS扩展属性     HPFS extended attributes

对于NTFS标准属性我并不完全了解下面就我所了解的部分进行介绍

        

偏移(16进制)
长度(16进制)
内容的意义

0
8
文件创建时间

8
8
文件内容最后一次修改时间

10
8
文件别的属性最后一次修改时间

18
8
文件最后一次修改时间

20
4
文件存取控制 800文件内容是压缩的,400文件是一个链接

20文档标志4系统文件标志,2隐含文件标志,1系统文件

标志

24
C
未用通常为0


标准信息属性内容定义

偏移(16进制)
长度(16进制)
内容的意义

0
4
属性名

4
2
属性长度

6
1
属性字符名长度

8
8
属性簇号计算起始簇号

10
8
包含该属性的MFT记录号

38
8
文件存取控制38

1A
长度为BIT6*2
属性名的UniCode


                                属性列表属性内容定义





偏移(16进制)
长度(16进制)
内容的意义

0
8
该文件的根目录的MFT记录号

8
20
文件的时间信息(与基本信息中的相同)

28
8
属性分配空间

30
8
属性大小

38
8
文件属性 38 20文档标志4系统文件标志,2隐含文件标志,1系统文件标志39 08 压缩 3b 10目录

40
1
文件名长度

41
1
文件名类型0 posix 1 unicode 2 dos 3both dos and unicode

42
长度为BIT40*2
文件名的UniCode


                                文件名属性内容定义

偏移(16进制)
长度(16进制)
内容的意义

0
4
总是30h

4
4
总是1

8
4
索引记录大小

C
4
每个簇可以记录的索引记录个数

10
4
总是10

14
4
整个属性大小+10h

1c
2
1如果有index allocation属性存在

1e
2
标志位(不知道意义)


                                    索引根目录属性定义

索引分配表属性 该属性分配索引空间以存放目录

如果一个属性内容无法在MFT表中放下,MFT表就会申请磁盘空间,存放在申请的空间中,属性列表定义中第48字节开始说明了该属性所在的磁盘簇号。下面是该字段的意义的英文说明以及简单的翻译:

Nonresident attributes are stored in intervals of clusters called runs. Each run is represented by its

starting cluster and its length. The starting cluster of a run is coded as an offset to the starting cluster of the

previous run. Length and starting cluster are variable size fields. The first byte of a run indicates the size of

both. The size of the offset is stored in the high nibble, and the size of the length in the low nibble.

For compressed or sparse runs, the offset is 0, and the size of the offset is also 0. Each compression

unit starts at a multiple of 16 clusters. If compression is possible, at the VCN of a unit will be one or more

data runs followed by an empty run. If there are data runs for more than 16 clusters, the unit was not

compressible.If there is no data run at all (only a large empty run), the unit consists of all zeroes.

Example: 21 20 ED 5 22 48 7 48 22 21 28 C8 DB

First run: 20 clusters starting from 5ED (5ED to 60D)

2nd run: 748 clusters starting from 5ED+2248 (2835 to 2F7D)

3rd run: 28 clusters starting from 2835+DBC8 (3FD to 425)

Note that the offset is interpreted as signed value

不存储于MFT表中的属性值被存储于分散的簇中称为RUN。每个RUNS由它的起始簇和长度构成。起始簇号和长度存储于变长的域中,一个RUN的第一个字节表明了起始簇号和簇的个数分别占

用的字节数,跟着簇的个数数据,接着是起始簇号的数据。入果没有RUN存在着RUN的起始字节为0,RUNS是一个累加和,第二个RUN的起始簇号需要加上第一个RUN的起始簇号,以此类推。







NTFS分区的目录结构

    NTFS分区的目录结构由文件名索引组成,它由 索引根目录属性(Index Root)

索引分配表属性   (Index Allocation) 索引根目录属性表明该MFT表记录是一个目录,

索引分配表属性给该目录分配磁盘空间以便存储索引记录(Index buffer)。

索引记录由索引记录头和多个索引记录项主组成,一个索引记录大小为2k。其结构如下:

          


偏移(16进制)
长度(16进制)
内容的意义

0
4
索引记录标志 总是 INDX

4
2
自修复数据存储位置 通常是28H

6
2
自修复数据长度

10
8
VCN值

18
2
头结构长度(第一个索引记录项入口字节地址-18)

1C
4
整个记录长度

20
4
整个记录存储数据的长度

24
4
1表示没有索引记录项

28
A
自修复数据


                            索引记录头结构定义



索引记录项是在这个目录下的文件或目录的索引结构其定义如下

偏移(16进制)
长度(16进制)
内容的意义

0
8
该文件的MFT记录号

8
2
记录项长度

A
2
0x42+0x2*<0x50>(可能是一个校验位)

C
1
本记录项有没有子项(1表示有,为了支持dos文件名)

10
8
父目录的MFT表记录号

18
20
文件的时间信息

38
8
文件数据属性分配磁盘空间大小

50
1
文件名长度

51
1
文件名类型(详见文件名属性)

52
长度为BIT8*2
文件名(UNICODE)


索引记录项定义

NFTS分区重要文件:

    MFT表里存储了所有的文件的基本信息,MFT表的前16个记录是保留给系统使用的,这些

文件是:

MFT记录0 $MFT文件           即MFT表本身的信息

MFT记录1 $MFTMIRR文件       MFT表的第一个记录内容的备份

MFT记录2 $LogFile文件         缓冲区文件保证系统突然死机后,重起时用

MFT记录3 $Volume文件               磁盘卷表文件

MFT记录4 $Attrdef文件               属性定义文件,包含各种属性的定义

MFT记录5 .       文件               根目录文件,分区目录结构的入口

MFT记录6 $BitMap 文件               磁盘分配镜像文件,每个位表示一个簇是否被分配

MFT记录7 $Boot   文件               指向磁盘bootsetor开始的16个扇区

MFT记录8 $BadClus文件             磁盘坏簇的镜像文件

MFT记录9 $Quota   文件               不太清楚该文件用途

MFT记录10 $UpCase文件             大写字母对应的unicode码

MFT记录10-- MFT记录15   未用

最后介绍一下NTFS文件系统中一个文件例如:要读取文件F:\WINNT\SYSTEM32\ANSI .SYS

具体步骤如下:

            1读取分区表信息,找到磁盘F的起始扇区。

              2读取F盘的第一个扇区(分区的BOOTSETOR)取得分区的每簇大小,MFT表

                  起始簇号,每簇大小等信息。

              3.读取MFT表的第五个记录(根目录)找到目录索引所在簇号。

              4.读取索引,查找WINNT目录所在的MFT记录号

                5.读取WINNT目录的MFT记录,找到目录索引所在簇号。

              6.读取索引,查找SYTEM32目录所在MFT记录号

              7. 读取SYTEM32目录的MFT记录,找到目录索引所在簇号。

              8. 读取索引,查找ANSI . SYS所在MFT记录号

              9. 读取ANSI .SYS文件的MFT记录,找到它的DATA属性。

              10.根据DATA属性中指定的文件数据存放位置读取出ANSI .SYS文件的数据。

PS:有一些图片没有转过来,大家可以去网原信息网站看一下.

最新喜欢:

snoxsnox
走走看看开源好 Solaris vs Linux
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-05-20 02:20
如何保证信息不泄漏呢?

信息来源:赛迪网

如果只能使用Windows本身提供的工具,那么我们可以认为清空回收站之后,被删除的文件已经彻底清除了。不过事实并非如此,只要有专用的硬件和软件,即使数据已经被覆盖、驱动器已经重新格式化、引导扇区彻底损坏,或者磁盘驱动器不再运转,我们还是可以恢复几乎所有的文件。

  一、磁盘如何保存数据

  要理解如何恢复已删除的数据,首先要搞清楚磁盘如何保存数据。硬盘驱动器里面有一组盘片,数据就保存在盘片的磁道(Track)上,磁道在盘片上呈同心圆分布,读/写磁头在盘片的表面移动访问硬盘的各个区域,因此文件可以随机地分布到磁盘的各个位置,同一文件的各个部分不一定要顺序存放。

  存放在磁盘上的数据以簇为分配单位,簇的大小因操作系统和逻辑卷大小的不同而不同。如果一个硬盘的簇大小是4 K,那么保存1 K的文件也要占用4 K的磁盘空间。大的文件可能占用多达数千、数万的簇,分散到整个磁盘上,操作系统的文件子系统负责各个部分的组织和管理。

  当前, Windows支持的硬盘文件系统共有三种。第一种是FAT,即所谓的文件分配表(File Allocation Table),它是最古老的文件系统,从DOS时代开始就已经有了。Windows 95引入了第二种文件系统,即FAT 32,Windows NT 4.0则引入了第三种文件系统NTFS。这三种文件系统的基本原理都一样,都用一个类似目录的结构来组织文件,目录结构包含一个指向文件首簇的指针,首簇的FAT入口又包含一个指向下一簇地址的指针,依此类推,直至出现文件的结束标记为止。

  二、Windows不能真正清除文件

  在Windows中,如果我们用常规的办法删除一个文件,文件本身并未被真正清除。例如,如果我们在Windows资源管理器中删除一个文件,Windows会把文件放入回收站,即使我们清空了回收站(或者不启动回收站功能),操作系统也不会真正清除文件的数据。

  Windows所谓的删除实际上只是把文件名称的第一个字母改成一个特殊字符,然后把该文件占用的簇标记为空闲状态,但文件包含的数据仍在磁盘上,下次将新的文件保存到磁盘时,这些簇可能被新的文件使用,从而覆盖原来的数据。因此,只要不保存新的文件,被删除文件的数据实际上仍旧完整无缺地保存在磁盘上。

  因此,我们可以用工具软件绕过操作系统,直接操作磁盘,恢复被删除的文件。这类工具软件很多,EasyRecovery就是其中的佼佼者。

  如果不小心删除了某个重要文件,想要恢复,这时千万不要覆盖它。立即停用计算机,不要再向磁盘保存任何文件,包括不要把恢复工具安装到已删除文件所在的硬盘,因为任何写入磁盘的内容都有可能覆盖已删除文件释放的磁盘簇。如果必须安装恢复工具,可以安装到其他硬盘分区、软盘,或者干脆拆下硬盘到另一台机器上去恢复。

  三、覆盖七次才能清除的蛛丝马迹

  如果数据已经覆盖,用通常的恢复工具就无能为力了,但这并不意味着我们绝对不能挽救丢失的数据。读取硬盘上被覆盖的数据通常有两种办法。

  读/写磁头向磁盘写入数据时,它会将磁化数据位的信号调整到某个适当的强度,但信号不是越强越好,不应超出一定的界限,以免影响相邻的数据位。由于信号强度不足以使存储媒介达到饱和的磁化状态,所以实际记录在媒介上的信号受到以前保存在同一位置的信号的影响,例如,如果原来记录的数据位是0,现在被一个 1覆盖,那么实际记录在磁盘媒介上的信号强度肯定不如原来数据位是1的强度。

  专用的硬件设备能够精确地检测出信号强度的实际值,将这个值减去当前数据位的标准强度,就得到了被覆盖数据的副本。理论上,这个过程可以向前递推七次,所以如果要彻底清除文件,必须反复覆盖数据七次以上,每次都用随机生成的数据覆盖。
第二种数据恢复技术的依据是,磁头每次读/写数据时,不可能绝对精确地定位在同一个点上,写入新数据的位置不会刚好覆盖在原来的数据上。原有数据总是会留下一些痕迹,利用专用的设备可以分析出原有数据的副本--称为影子数据。当然,如果我们反复执行覆盖操作,原有数据的痕迹也会越来越弱。

  ● 影子数据:被覆盖的数据总是与新写入的不离左右,就象人的影子总是紧跟着人,因此被覆盖的数据就称为影子数据。英文功力好的读者可以参见这篇专著:http://www.forensics-intl.com/art15.html

  通常而言,能够恢复已删除、覆盖的数据应该算是一件好事,当然,某些必须彻底清除数据的场合除外。这方面最为著名的标准是美国国防部订立的磁盘清洗规范,它要求数据必须覆盖三次:第一次用一个8位的字符覆盖,第二次用该字符的补码(0和1全反转的字符)覆盖,最后用一个随机字符覆盖。不过这个清洗方法不适用于包含高度机密信息的媒介,这类媒介必须进行消磁处理,或者销毁其物理载体。当然,对于大多数场合来说,简单的覆盖处理已经足够。

  四、被遗忘的角落

  删除和覆盖文件还不能清除硬盘上的所有敏感数据,因为数据可能隐藏在某些意料之外的地方,所以文件占用的每一个扇区都必须彻底清除所谓扇区,就是大小为512字节的数据片断,每个簇包含多个扇区。

  向磁盘写入文件时,文件的最后一部分通常不会恰好填满最后一个扇区,这时操作系统就会随机地提取一些内存数据来填充空余区域。从内存获取的数据称为 RAM Slack(内存渣滓),它可能是计算机启动之后创建、访问、修改的任何数据。另外,最后一个簇中没有用到的扇区就原封不动,即保留原来的数据,称为 Drive Slack(磁盘渣滓)。问题在于许多号称安全删除文件的工具不会正确清除内存渣滓和磁盘渣滓,而这些被称为渣滓的地方却可能包含大量的敏感信息。

  在NTFS文件系统中,每个文件包含多个流,其中一个流用来保存访问权限之类的信息,另一个流用来保存真正的文件数据。除此之外,NTFS还允许额外的数据流,即ADS(Alternative Data Stream),ADS可以用来保存任何信息,最常见的用途是保存图形文件的缩略图。由于许多安全删除文件的工具不能清除ADS,所以即使存放文件实际数据的流已经清除,但缩略图仍可能泄露机密。微软知识库文章319300(http://support.microsoft.com)介绍了如何防止系统创建缩略图使用的流,即删除注册键HKEY_LOCAL_MACHINE\System\Currentcontrolset\Control\Contentindex\FilterTrackers。

  ●ADS:ADS这个缩写词经常用来表示活动目录服务(Active Directory Services),不过本文中ADS是指“可选数字流”,是文件主体数据之外的附属信息存储区域。就象你的公文包,包里面是正式存放物品的主空间,但包的外面还会有一二个附属小口袋便于快速取用物品,这些小口袋就相当于ADS。

  ADS已是人们熟知的隐藏数据和病毒之地,经常被计算机犯罪分子利用。但除此之外,硬盘上还有其他可以隐藏数据的区域。

  扇区是在低级格式化期间创建的,通常由硬盘制造厂完成。低级格式化工具会标记出损坏的扇区,从而避免磁盘控制器向损坏的区域写入数据。簇包含多个扇区,由高级格式化工具创建,如Windows或DOS的format命令。如果高级格式化期间发现坏扇区,整个簇被标记为坏簇,但是,坏簇里面还有好的扇区,有些人就利用这些扇区来隐藏数据。

  在老式磁盘上,数据还可以隐藏在称为扇区缝隙的地方。老式磁盘的每一个磁道都有数量相同的扇区,但外圈的磁道显然要比内圈的磁道长,有些人就利用外圈磁道上扇区之间的缝隙来保存数据。新型磁盘利用一种称为分区记录(Zoned Recording)的技术避免了这种空间浪费,它能够根据磁道的位置调整每个磁道的扇区数量。

  要访问磁盘上的这类隐藏区域,必须使用绕过操作系统磁盘访问功能的工具。搜索一下网络,可以看到正规的专业工具都很昂贵,例如EnCase Forensic Edition(www.guidancesoftware.com)要2000多美元;Directory Snoop可能最便宜,也要29美元,但它不支持NTFS。

  综上所述,我们可以说恢复数据实际上要比彻底清除数据简单。如果你不小心删除了某个重要的文件(谁都会遇到这类事情),恢复工具就是救命的稻草。反之,如果你想出售二手机或二手磁盘,应当考虑一下是否有必要彻底地清洗一下硬盘。
走走看看开源好 Solaris vs Linux
qihuiling_0304
驱动牛犊
驱动牛犊
  • 注册日期2007-03-18
  • 最后登录2010-11-15
  • 粉丝0
  • 关注0
  • 积分662分
  • 威望68点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-05-20 02:46
楼主辛苦了~
~要有追求卓越的执著~
devia
论坛版主
论坛版主
  • 注册日期2005-05-14
  • 最后登录2016-04-05
  • 粉丝3
  • 关注0
  • 积分1029分
  • 威望712点
  • 贡献值1点
  • 好评度555点
  • 原创分8分
  • 专家分4分
地板#
发布于:2007-05-24 08:39
好东西!
人总在矛盾中徘徊。。。
游客

返回顶部