`
holoblog
  • 浏览: 1224751 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18894
文章分类
社区版块
存档分类
最新评论

解开硬盘锁的程序法

 
阅读更多

如果硬盘被锁死,是否真的就无法解开呢?当然不是。看看问题的症结所在,根源在于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

100CLI

101XORAX,AX

103MOVDS,AX

105MOVES,AX

107MOVSS,AX

109MOVAX,7C00

10CMOVSP,AX

10ESTI

10FMOVSI,AX

111MOVDI,7E00

114CLD

115MOVCX,0200

118REPNZ

119MOVSB

11AJMP0000:7E1F

11FMOVCX,0003

122PUSHCX

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

126MOVBX,7C00

129MOVCX,4F01

12CMOVDX,0100

12FINT13

131POPCX

132DECCX

133JNZ0122

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

138MOV[7E88],AX

13BMOVAX,[004E]

13EMOV[7E8A],AX

141MOVAX,[0413]

144DECAX

145MOV[0413],AX

148MOVCL,06

14ASHLAX,CL

14CMOVES,AX

14EXORAX,AX

150MOVDS,AX

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

155MOVDI,0000

158MOVCX,0030

15BREPNZ

015CMOVSB

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

0160MOV[004C],AX

0163MOVAX,ES

0165MOV[004E],AX

0168JMP0000:7C00

016DPUSHF;新INT 13H程序

016ECMPDX,0080;是否是硬盘

0172JNZ0176;不是硬盘则继续

0174POPF

0175IRET;是硬盘则直接返回

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

0179JNZ0186

017BCMPCX,+01

017EJNZ0186

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

0183MOVDX,0100

0186POPF

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

Nkey.com

RCX

200

W

Q

2·程序的装载

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

C>debugkey.com

-a400

400MOVCX,0003

403PUSHCX

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

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

40AMOVCX,0001

40DMOVDX,0000

410INT13

412POPCX

413DECCX

414JNZ0403

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

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

41CMOVCX,4F01

41FMOVDX,0100

422INT13

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

427MOVBX,0100

42AMOVCX,0001

42DMOVDX,0000

430INT13

432INT3

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

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

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

四·建议

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics