解开硬盘逻辑死锁的一种有效方法 (转)[@more@]

解开硬盘逻辑死锁的一种有效方法

西安市西北工业大学418信箱(710072)  肖华勇

一·序言

不知道你是否曾碰到过从软盘和硬盘都启动不了计算机的情形?一般计算机的硬盘分区表被病毒感染后,若不能启动机子,通常从软盘可以启动。但在严重的情形下,不但从硬盘不能启动机子,就是从软盘也不能启动。有的恶毒的病毒就能使硬盘被死锁。笔者一次在自己机子上玩弄硬盘锁时,就被锁住过一次。结果在硬盘下选择DOS或WIN95模式启动机子都死机,在软盘下用DOS启动也死机;在COMS中将硬盘类型选择None,虽然可以从软盘启动,但启动后没有硬盘,使用软盘上的FDISK命令,想重新分区或格式化都没门。弄得我一筹莫展。

本来,硬盘被锁住时,可以采用3.0以下的DOS版本启动机子,机子启动后虽然也不认硬盘,但其不认的原因在于其管理不了现在的大硬盘,因此可以用Debug修改硬盘分区表,修改后可以启动。但在已进入windows的年代,3.0以下的DOS实难找到,即使找到,你的机子上恐怕也因没有5寸软驱而不能使用。因此,最好的办法是编制一个程序来解决这个问题。笔者通过尝试和思考,找到一种比较实用的方法,可以轻松解开死锁的硬盘,当然也把自己的硬盘解开了。下面,我将这种方法介绍出来。

二·硬盘锁住原理

硬盘锁住通常是对硬盘的分区表做手脚,因此首先应该了解硬盘的分区表。硬盘分区表位于0柱面0磁头1扇区,这个扇区的前面200多个字节是主引导程序,后面从01BEH开始的64个字节是分区表。分区表共64字节,分为4栏,每栏16字节,用来描述一个分区。如果是用DOS的FDISK程序分区后,最多只用两栏,第一栏描述基本的DOS分区,第二栏描述扩展的DOS分区。

分区表一栏的结构与各字节的含义如下:

00H—标志活动字节,活动DOS分区为80H,其它为00H。

01H—本分区逻辑0扇区所在的磁头号。

02H—逻辑0扇区所在柱面中的扇区号。

03H—逻辑0扇区所在的柱面号。

04H—分区类型标志。

05H—本分区最后一个扇区的磁头号。

06H—最后一个扇区的扇区号。

07H—最后一个柱面的柱面号。

08H—硬盘上在本分区之前的扇区总数,用双字表示。

0CH—本分区的扇区总数,从逻辑0扇区计数,不含隐藏扇区,用双字表示。

在上面的介绍中给出的柱面号与扇区号虽然各占一个字节,但实际上扇区号用6位表示,柱面号用10位表示,扇区号所在字节的最高两位实际上是柱面号的最高两位。

分区表的最后两个字节是分区表的有效标志,如果将其改变,将不能从硬盘启动,这是一种简单的锁住硬盘的方法。解决的办法是从软盘启动,启动后硬盘仍然可以使用。用Debug或Noratn中的Diskedit软件将硬盘该分区表中的标志恢复,则从硬盘启动也没有问题了。锁住硬盘的另一种方法是对分区参数做手脚,如果将分区参数全部变为0,则启动时由于找不到分区参数,从硬盘是没法启动,从软盘启动后也不认硬盘,如果你敲入盘符C并回车,将出现提示Invalid driver specification。但所幸的是,毕竟可以启动机子,不认硬盘没关系,在A盘上用DOS的Debug仍然可以读出硬盘0柱面0磁头1扇区的内容,修改后再写入0柱面0磁头1扇区,重新启动机子又没问题了。如果将分区表参数随意改为其它参数,则有可能不能用可以安装DOS的DOS系统盘启动,按F3退出后将出现内存分配错误,不能装载DOS的命令解释器COMMAND的提示,系统就死机了,笔者就曾碰见过这种情形。但用一张格式化成系统盘的软盘则可以顺利启动,只要有Debug,你仍然可以将分区表参数修改回去。可怕的事情是,如果你不幸将分区表参数改成一个循环链,即C盘的下一个分区指向D驱,D驱的下一个分区又指向C区,这样循环下去,DOS启动或WIN95启动时由于无休止的读取逻辑驱动器,就只有死机的份了。这是只要有硬盘存在,不管你用软盘还是硬盘都没法启动机子了,由于不能启动是由于硬盘造成的,即使你将硬盘下到其它计算机上,也没法使用,这样硬盘就彻底被锁死了,笔者所遭遇就是此情形。不信,你只需将硬盘0柱面0磁头1扇区的1D0H处改为1(如果你的D驱开始柱面号不够大,此处本来就为1),将1D1H处改为0,表示D盘的开始柱面号跟C盘一样,看看你的计算机还能不能启动,不过你在没有充分的准备前绝不要试。

一个完整的硬盘锁程序,不过是重新改写0柱面0磁头1扇区的引导程序,并将分区表破坏或故意制造一个循环分区表,而将真正的硬盘分区表参数和引导程序放在其它隐藏扇区并保护起来,如果启动时口令不对,则不能启动机子,口令对了则顺利启动。这种硬盘锁程序,情形好的还可以用软盘启动;情形严重的就是连软盘也不能启动,硬盘真被锁住。

三·解开硬盘锁的程序法

如果硬盘被锁死,是否真的就无法解开呢?当然不是。看看问题的症结所在,根源在于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很容易操作和实现。有了备份分区表信息,就不怕破坏分区表的病毒了;再加上我给你的程序,即使有人真锁住了你的硬盘,你也可以轻而易举解开了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-974172/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752019/viewspace-974172/

解开硬盘逻辑死锁的一种有效方法 (转)相关推荐

  1. linux下死锁怎么解决方法,死锁,解决死锁的4种基本方法

    死锁,解决死锁的4种基本方法 死锁 这个概念是操作系统里面很重要的内容,前阵子面试字节被问到了,太久没复习,面经变凉经. 死锁(Deadlock),又被翻译为死结.是操作系统或软件运行的一种状态,在多 ...

  2. 解决死锁的4种基本方法

    解决死锁的4种基本方法 1.预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件 2.避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁 3.检测死锁:允许死锁的发 ...

  3. 深入探究死锁的三种处理方法

    死锁的处理方法我们以火灾为例.要想火灾处理有三种办法,(1)提前预防,使环境没有火灾产生的环境,如降低周边温度,周边没有氧气等等(2)当出现火灾时,我们及时救火.(3)如果火灾离消防队比较远,等消防队 ...

  4. 硬盘“逻辑锁”解决办法

    许多电脑用户都见过或听说过,当硬盘中了所谓的"逻辑锁"后,无论是用软盘.硬盘,还是光盘都不能启动一些电脑.那么,"逻辑锁"到底是什么呢? 所谓"硬盘逻 ...

  5. 主引导区,分区表,硬盘逻辑锁,坏道四种故障修复

    下面根据主引导区修复,分区表损坏修复,硬盘逻辑锁修复,产生坏道的修复四种故障类型给大家列出解决的方法和对策: 1)主引导区修复 修复此故障最简单的方法就是使用高版本DOS的Fdisk带参数/mbr运行 ...

  6. linux 内核 死锁 检查,一种linux内核自旋锁死锁检测报告系统和方法与流程

    本发明涉及内核死锁检测领域,具体的说是一种linux内核自旋锁死锁检测报告系统和方法. 背景技术: linux内核死锁是长期困扰内核开发人员的问题之一,但自内核引入lockdep调试模块之后,内核死锁 ...

  7. 黑群硬盘休眠问题的一种解决思路(DS916+,DSM 6.1.7)

    黑群硬盘休眠问题的一种解决思路(DS916+,DSM 6.1.7) 参考文章: (1)黑群硬盘休眠问题的一种解决思路(DS916+,DSM 6.1.7) (2)https://www.cnblogs. ...

  8. 怎样判断计算机硬盘损坏,检测硬盘是否损坏的方法来了,这里有四种判断方法!...

    原标题:检测硬盘是否损坏的方法来了,这里有四种判断方法! 大家对硬盘都不陌生,硬盘分固态硬盘与机械硬盘,它们的读取速度与容量都有很大的区别,不过都是可以用来存储系统与重要文件数据的.硬盘损坏是电脑的硬 ...

  9. linux系统盘锁着,用Linux启动盘解决硬盘逻辑锁

    这天给别人的笔记本使用Ghost安装Win系统,进行到一半时突然卡住死机,无奈强制重启,然后,故障就来了. 首先电脑是无法启动了,毕竟Ghost还没有完成嘛,是可以理解的.插入U盘从U盘启动,选择进入 ...

最新文章

  1. 中国开源大爆发进行时,你没掉队吧?
  2. MFC中UPD通信详细解说
  3. 安卓自动化测试(1)安卓自动化测试原理概念
  4. I don't have an E-mail 我没邮箱
  5. Fiddler抓包原理解析
  6. MFC的固高环形倒立摆GRIP2002实验平台
  7. Java 8中的可重复注释
  8. ORACLE 日期加减操作
  9. 计算机应用技术老师全国计算机应用技术考试,全国计算机应用证书 全国计算机应用技术证书考试作业.doc...
  10. serialize和unserialize函数
  11. 匿名对象和类名为数据类型(java)
  12. 三层架构和mvc的区别_谈谈对于企业级系统架构的理解
  13. 如何使用阿里云打造离线下载服务器?
  14. android 360短信拦截,Android版360卫士更威武
  15. 电能管理系统在中材萍乡水泥4500t/d生产线改造上的应用
  16. java中暴力是啥方法_[蓝桥杯][历届试题]回文数字 中规中矩的暴力方法(Java代码)...
  17. MATLAB中同一路径下同文件的末尾继续写入数据
  18. 计算机毕设(附源码)JAVA-SSM基于云服务器网上论坛设计
  19. 5.1.6 守护进程daemon
  20. 西行漫记(16):C#长得太丑了

热门文章

  1. 计算机网络学习笔记(持续更新)
  2. 上海怎样查询最近三年社保明细
  3. UiBot If(如果条件成立)
  4. 综述 | 结肠细胞代谢如何塑造肠道菌群
  5. 从0到ros2玩rmf
  6. Machine Learning系列--L0、L1、L2范数
  7. java骰子_Java实现的简单掷骰子游戏示例
  8. 目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的监护系统,试写出问题定义并且分析开发这个系统的可行性
  9. 手机翻译html工具,1分钟教你用手机实时翻译,自带翻译功能就是强大,各牌手机均可...
  10. 【程序员修炼日志】校招与社招的感悟