用扩展INT13H研析并恢复大容量硬盘分区信息链表_信息技术论文
用扩展int13h研析并恢复大容量硬盘分区链表
江西宜春学院计算机系 刘 健
内容摘要:本文利用扩展int13h的磁盘地址数据包及相关调用,分析了整个分区链表并给出了链表中任一结点分区丢失或被破坏之后的一种恢复方法。
关键字:扩展int13h、数据包、分区、链表、恢复
一、 扩展int13h相关读写接口规范概述
扩展int13h接口设计的目的是为了扩展bios的功能,使之能处理柱面数大于1024的硬盘,并支持移动存贮介质的锁定、解锁和弹出等各类新增功能。
1、 数据类型定义:
byte 一字节; word 二字节; dword 四字节; qword 八字节;
磁盘读写地址数据包drwap(disk read write address packet),利用该数据包中断int13h可以直接读写处理目前主流硬盘上的任一扇区,匆需理会传统磁盘概念中的通过柱面号、磁头号及扇区号(chs)的扇区定位方式。
drwap结构如下:
struct drwap
{ byte packetsize;//数据包所占字节数,有10h和18h两种,本文用前者
byte reserved;//保留字节,设为00h
word blockcount;//传输的数据块个数(最大值为7fh),以扇区为单位
dord transferbuffer;//传输缓冲区地址(seg:offset)
qord absoluteblocknumber;//磁盘起始绝对扇区号(主引导扇区为0号)
}
absoluteblocknumber与传统chs的关系如下:
absoluteblocknumber=(cylinder*numheads+head)*sectorpertrack+sector-1
drwap数据包的获取及实际操作
2、 定义磁盘读写地址数据包获取指定扇区之内容
入口参数:ah=42h; dl=80h; ds:si=drwap首地址
出口参数:cf=nc ok;cf=cy error
二、分区链表解析
读取主引导扇区操作过程:(为操作的连续性,本文不采用传统int13h的功能号02)磁盘读写地址数据包按如下方式定义:
进入debug状态之后,ds和si采用当前默认值,假设为ds=1216,si=0000 则e命令或f命令从1216:0000处输入以下16个字节内容
1216:0000 10 00 01 00 00 02 16 12-00 00 00 00 00 00 00 00
数据包长度=10h=16个字节 保留字节=00h 要传输的扇区个数=0001h=1个
缓冲区地址ds:si=1216:0200 磁盘起始绝对扇区号=0000000000000000h=0号
-a100
1216:0100 mov ah,42
mov dl,80
int 13
int 3
-g=100
-d3be
80 01
1216:03b0 01 00 0b fe bf d9 3f 00-00 00 1b f2 b2 00 00 00
:03c0 81 da 0f fe ff ff 5a f2-b2 00 3e de e0 02 00 00
从上述内容可知:
c区的起始点为0柱1头1扇,即磁盘起始绝对扇区0号;
c区的结束点为729柱254头63扇,并隐含了63个扇区;
c区共占用了00b2f21bh个扇区约为5.58gb。
整个扩展分区的起点为730柱0头1扇,其结束点由于柱面号已大大的大于1024,而10位二进制数已不能表达,所以其结束点一律记为254头1023柱63扇,即 fe ff ff.
整个扩展分区本身占用02e0de3eh扇区,5a f2 b2 00 为扩展分区前所用扇区数,即c区所用和隐含部分00b2f21bh+0000003fh=00b2f25ah
读取逻辑d盘分区表:
从前面可知d盘之前已用00b2f25ah,由于起始绝对扇区号为零,因此d盘的入口地址为:00b2f25ah,所以磁盘读写地址数据包修改如下:
ds:0000 10 00 01 00 00 02 16 12 -5a f2 b2 00 00 00 00 00
-g=100
-d3be
ds:3b0 00 01
:3c0 81 da 0b fe ff ff 3f 00-00 00 1b f2 b2 00 00 00
:3d0 c1 ff 05 fe ff ff 5a f2-b2 00 54 da d0 00
逻辑d盘的起点为730柱1头1扇,0头所含63扇隐含;
逻辑d盘的结束点由于柱面数超过1024,一律记为fe ff ff此后的逻辑盘结束点也一样。
逻辑d盘自用00b2f21bh扇
后一分区表项记录的是逻辑e盘的相关数据:
逻辑e盘的起点由于柱面数超过1024,一律记为00 c1 ff,结束点为fe ff ff.
逻辑e盘之前已用的扩展分区扇数00b2f21bh+0000003fh=00b2f25ah即d盘所用和d盘前隐含的部份 5a f2 b2 00
逻辑e盘所占扇区数(包含自身及隐含的0头上的63扇)
对于后继的各分区结点信息分析,可参照执行完全类似。唯一需要注意的是,后继结点分区表的入口地址,是其前继结点的入口地址加上前继结点的长度(包括隐含的3fh)。
三、 分区信息链表中任一结点分区的恢复
实际上对大容量硬盘分区的恢复有以下几条规则:
1、 任何一分区所占用的扇区数,在其所对应的逻辑零扇区的偏移地址20h都有备份;
2、 活动分区的起始点为0柱1头1扇区即01 01 00,结束点可由上述备份反推求出柱面号,磁头号为feh,扇区号为3fh,然后将柱面号和扇区号合并成两个字节,若备份容量大于传统容量限制则为fe ff ff;
3、 每一结点分区信息中前一分区表项中的隐含扇区数为003fh,后一分区表项中的隐含扇区数分为两种情况:在扩展分区中该部分内容为活动分区大小加上隐含的63个扇区;在逻辑分区中该部分内容为前一结点中后一表项的两个数据项之和;
4、 每一结点逻辑分区后一分区表项的最后四个字节内容为下一结点前一分区表项的隐含扇区数与该分区所占扇区数之和;
5、 倒数第二个结点分区中的后一表项的两个数据项之和等于扩展分区所占用的总扇区数;
6、 主分区信息表中分区类型标志分别为0bh和 0fh,在后续逻辑分区表中分别为0bh和05h;(本文针对fat32位分区方式,其它分区方式可相应改动)
7、 任一结点逻辑分区所对应的逻辑零扇区的入口地址等于该逻辑分区入口地址加上该分区所隐含的扇区数,即3fh。
掌握以上几条原则,即便整个分区链表全部破坏或丢失,都能从相关的逻辑零扇完全修复。
主分区的恢复过程操作概要:
>
第一步:活动标志和起始点是固定的 80 01 01 00 分区类型0bh,隐含扇区数是固定的3f 00 00 00,自用扇区总数从逻辑零扇区偏移20h处提取四个字节1b f2 b2 00。
利用公式 扇区总数=(柱面号*磁头数+磁头号)*每磁道扇区数
扇区总数=00b2f21bh、磁头数=ffh、磁头号=feh、每磁道扇区数=3fh,可推算柱面号,就可得到活动分区的结束点内容。
第二步:扩展分区的活动标志为00,起始点为下一个柱面号的0头1扇即00 81 da,分区类型为0fh,隐含部分=前一表项所占用扇区数与其前的隐含扇区之和,结束点由于已超过8.4g一律填为fe ff ff,扩展分区所占用的总的扇区数,可通过上述原则中的第5条计算出来。
地址:江西省宜春市宜春学院工学院计算机系
邮编:336000 电话:0795-3561890
emile:liubangling@sohu.com