解开硬盘锁的程序法

如果硬盘被锁死,是否真的就无法解开呢?当然不是。看看问题的症结所在,根源在于DOS中的IO.SYS文件,它包含LOADER、IO1、IO2、IO3四个模块,其中IO1中包含有一个很关键的程序SysInt_I,它在启动中很固执,非要去读分区表,而且不把分区表读完誓不罢休。如果碰上分区表是循环的,它就只有死机了。这是DOS的脆弱性和不完备性。其实这也不能怪DOS,因为DOS为了获得硬盘使用权,就必需读分区表参数,而且DOS还约定驱动器号不能超过26,只不过没有考虑到此等循环分区表情形。一句话,机子不能启动不过是DOS操作系统造成的,如果另写一个操作系统,或许就能启动机子。当然这只是说个笑话。

 

    明白了病因在于DOS,问题就好办了。DOS启动中不是要读硬盘分区表吗?我不让你读分区表甚至连硬盘都不让你读,不就可以顺利启动了。的确是这样的,解开硬盘锁的程序实现方法就是基于这个思想形成的。当然,这只有从软盘启动着手了。

 

    看看计算机的启动过程,上电首先进行的多项硬件自测跟我们没有关系,我们关心的只是它最开始和磁盘打交道时是干什么。如果选择从硬盘启动,则计算机和磁盘最开始打交道是将硬盘0柱面0磁头1扇区的内容读入内存0000:7C00处并跳到0000:7C00处执行;如果选择从软盘启动,则计算机和磁盘最开始打交道是将A盘0磁道0磁头1扇区的内容读入内存0000:7C00处并跳到0000:7C00处执行,在执行过程中,计算机并不检查该扇区的内容是什么,只机械地执行读命令,这使得许多系统型病毒得以生存。但利用这一点,恰恰使我们的程序解锁法有了用武之地。如果我们用DOS格式化一张可以启动机子的系统软盘,将该软盘的0磁道0磁头1扇区的内容移到后面的空白扇区中,而重新写一段程序到该软盘的0磁道0磁头1扇区,这样用软盘启动时首先执行的是我们所写的程序了。在这段程序中,具备这样一些功能:在DOS启动前抢先拦截INT 13H,驻留高端内存并监视INT 13H,判断是否读硬盘,如果是读硬盘就直接返回,这样就禁止了读硬盘,也就避免了DOS读硬盘循环分区表造成的死机;同时拦截对软盘的读取,如果读软盘的0磁道0磁头1扇区,就改成读真正有引导程序和磁盘参数表的扇区,免得DOS在启动中找不到软盘的磁盘参数表而死机。完成这些任务的同时,还要读取软盘真正的引导程序并把控制权交给它。

 

    该方法可以称为万能的,因为它在用软盘启动中,始终不与硬盘打交道,这样不管你硬盘用什么方法加锁了,对DOS的启动都没有影响。当然,这样启动的机子是不认硬盘的,但这没有关系。你可在机子启动后,用Debug调出驻留高端内存的新INT 13H程序,将其改为只有一条直接执行旧INT 13H的语句,这样在Debug下可以用INT 13H读取硬盘0柱面0磁头1扇区的内容,如果你有备份,将分区表参数恢复后再写入0柱面0磁头1扇区,重新启动计算机就可以了。如果实在没有备份,去掉分区表中的循环链,用正常DOS启动盘重启机子后至少也可以重新对硬盘分区,不至于硬盘被锁住打不开了。 

 

程序及说明

 

    1·下面是写入软盘0磁道0头1扇区的源程序key.com,程序用debug输入。

C>debug

-a100

100  CLI

101  XOR    AX,AX

103  MOV    DS,AX

105  MOV    ES,AX

107  MOV    SS,AX

109  MOV    AX,7C00

10C  MOV    SP,AX

10E  STI

10F  MOV    SI,AX

111  MOV    DI,7E00

114  CLD

115  MOV    CX,0200

118  REPNZ

119  MOVSB

11A  JMP    0000:7E1F

11F  MOV    CX,0003

122  PUSH    CX

123  MOV    AX,0201;读启动软盘的引导扇区

126  MOV    BX,7C00

129  MOV    CX,4F01

12C  MOV    DX,0100

12F  INT    13

131  POP    CX

132  DEC    CX

133  JNZ    0122

135  MOV    AX,[004C];抢先获取INT 13H的位置

138  MOV    [7E88],AX

13B  MOV    AX,[004E]

13E  MOV    [7E8A],AX

141  MOV    AX,[0413]

144  DEC    AX

145  MOV    [0413],AX

148  MOV    CL,06

14A  SHL    AX,CL

14C  MOV    ES,AX

14E  XOR    AX,AX

150  MOV    DS,AX

152  MOV    SI,7E6D;复制改写的INT 13H程序到高端内存

155  MOV    DI,0000

158  MOV    CX,0030

15B  REPNZ

015C  MOVSB

015D  MOV    AX,0000;将新INT 13H位置写入中断向量表

0160  MOV    [004C],AX

0163  MOV    AX,ES

0165  MOV    [004E],AX

0168  JMP    0000:7C00

016D  PUSHF;新INT 13H程序

016E  CMP    DX,0080;是否是硬盘

0172  JNZ    0176;不是硬盘则继续

0174  POPF

0175  IRET;是硬盘则直接返回

0176  CMP    DX,+00;是否读软盘BOOT区?

0179  JNZ    0186

017B  CMP    CX,+01

017E  JNZ    0186

0180  MOV    CX,4F01;是则读79磁道1磁头1扇区

0183  MOV    DX,0100

0186  POPF

0187  JMP    0000:0000;此处跳转去执行旧INT 13,;旧INT 13H的位置由前面程序获得后写入。

N  key.com

RCX

200

W

Q

 

2·程序的装载

    在进行下面工作前,先用DOS格式化一张启动的系统盘,并保证没有坏扇区,最好进行启动测试,确保其可以启动机子。由于现在机子上大多只有3寸软驱,因此选择1.44M的3.5寸软盘。然后用debug key.com将程序key.com调入内存偏移地址为100H,同时在400H处写入一段装载程序。即:

C>debug  key.com

-a400

400    MOV    CX,0003

403    PUSH    CX

404    MOV    AX,0201;将A盘引导程序读入内存1000H处

407    MOV    BX,1000;为确保成功,首次采用重复读3次

40A    MOV    CX,0001

40D    MOV    DX,0000

410    INT    13

412    POP    CX

413    DEC    CX

414    JNZ    0403

416    MOV    AX,0301;将已读入内存的软盘引导程序写入软盘

419    MOV    BX,1000;最后一个磁道的首扇区

41C    MOV    CX,4F01

41F    MOV    DX,0100

422    INT    13

424    MOV    AX,0301;将key.com程序写入软盘0磁道0磁头1扇区

427    MOV    BX,0100

42A    MOV    CX,0001

42D    MOV    DX,0000

430    INT    13

432    INT    3

    为保证万无一失,最好将软盘这两个扇区的内容重新读出来看一看,以保证写成功了。做好这一切,保险的还是进行一次测试,即用该软盘启动一次机子,看能否成功,若成功启动,你就可以用循环分区表法锁住硬盘,看从正常DOS下能否启动,然后再用此软盘启动机子试试,看看功效如何?

    从该软盘启动后,不认硬盘,并且在高端内存驻留了新INT 13H程序,该段程序实际上是key.com中从16D到187部分。由于有此段程序存在,在debug下也无法读硬盘,也就没法恢复硬盘分区表,因此机子启动后首先应修改这段程序。现在的机子基本内存通常都为640K,这样这段程序就位于内存中9FC0:0000处,在debug下,用U9FC0:0显示这段程序,可以看到位于9FC0:001A处是一条跳转指令,该跳转指令即转去执行最原始的INT 13H。由于BIOS版本不一样,跳转指令指向的位置可能不一样,如笔者机子上是一条JMP F000:A5D4语句。这时在在debug下编写这样一语句:a9FC0:0  JMP F000:A5D4。这样,对硬盘的禁写与禁读都不再起作用了,在debug下用INT 13H的2号子功能可以读出硬盘分区表,修改恢复后再用3号子功能将数据写回分区表。退出debug,重新用正常DOS启动计算机,就可以了。

    附带提一下,在正常DOS下,该软盘由于没有BOOT区,也就没有磁盘参数表,从而不能使用,用DIR  A:命令会出现General failure reading drive A提示。不要理睬它,这并不影响它作特殊启动盘。

 

四·建议

 

    为更好的保护你的硬盘,笔者建议你最好将你的硬盘分区表信息备份起来。备份有两种方式,一种是以文件形式将硬盘每个逻辑盘的分区信息存储起来;另另一种是将分区信息备份在硬盘隐藏扇区里。比如可以将0柱面0磁头1扇区备份在0柱面0磁头3扇区,将D盘开始柱面号0磁头1扇区备份在该柱面0磁头3扇区,其它逻辑盘也如此。这种方法简单、方便,也很可靠。用NORTAN中的DISKEDI很容易操作和实现。有了备份分区表信息,就不怕破坏分区表的病毒了;再加上我给你的程序,即使有人真锁住了你的硬盘,你也可以轻而易举解开了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值