- UID
- 1283
- 阅读权限
- 5
- 推广
-
- 幽默
-
- 注册时间
- 2005-12-29
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
< >一·序言 <BR> 不知道你是否曾碰到过从软盘和硬盘都启动不了计算机的情形?一般计算机的硬盘分区表被病毒感染后,若不能启动机子,通常从软盘可以启动。但在严重的情形下 ,不但从硬盘不能启动机子,就是从软盘也不能启动。有的恶毒的病毒就能使硬盘被死锁。笔者一次在自己机子上玩弄硬盘锁时,就被锁住过一次。结果在硬盘下选择DOS或WIN95模 式启动机子都死机,在软盘下用DOS启动也死机;在COMS中将硬盘类型选择None,虽然可以从软盘启动,但启动后没有硬盘,使用软盘上的FDISK命令,想重新分区或格式化都没门。 弄得我一筹莫展。 </P>
< ><BR> 本来,硬盘被锁住时,可以采用3.0以下的DOS版本启动机子,机子启动后虽然也不认硬盘,但其不认的原因在于其管理不了现在的大硬盘,因此可以用Debug修改硬盘 分区表,修改后可以启动。但在已进入WINDOWS的年代,3.0以下的DOS实难找到,即使找到,你的机子上恐怕也因没有5寸软驱而不能使用。因此,最好的办法是编制一个程序来解决 这个问题。笔者通过尝试和思考,找到一种比较实用的方法,可以轻松解开死锁的硬盘,当然也把自己的硬盘解开了。下面,我将这种方法介绍出来。 </P>
< ><BR> 二·硬盘锁住原理 <BR> 硬盘锁住通常是对硬盘的分区表做手脚,因此首先应该了解硬盘的分区表。硬盘分区表位于0柱面0磁头1区,这个扇区的前面200多个字节是主引导程序,后面从01BEH 开始的64个字节是分区表。分区表共64字节,分为4栏,每栏16字节,用来描述一个分区。如果是用DOS的FDISK程序分区后,最多只用两栏,第一栏描述基本的DOS分区,第二栏描述 扩展的DOS分区。 <BR> 分区表一栏的结构与各字节的含义如下: <BR> 00H-标志活动字节,活动DOS分区为80H,其它为00H。 <BR> 01H-本分区逻辑0扇区所在的磁头号。 <BR> 02H-逻辑0扇区所在柱面中的扇区号。 <BR> 03H-逻辑0扇区所在的柱面号。 <BR> 04H-分区类型标志。 <BR> 05H-本分区最后一个扇区的磁头号。 <BR> 06H-最后一个扇区的扇区号。 <BR> 07H-最后一个柱面的柱面号。 <BR> 08H-硬盘上在本分区之前的扇区总数,用双字表示。 <BR> 0CH-本分区的扇区总数,从逻辑0扇区计数,不含隐藏扇区,用双字表示。 <BR> 在上面的介绍中给出的柱面号与扇区号虽然各占一个字节,但实际上扇区号用6位表示,柱面号用10位表示,扇区号所在字节的最高两位实际上是柱面号的最高两位。 <BR> 分区表的最后两个字节是分区表的有效标志,如果将其改变,将不能从硬盘启动,这是一种简单的锁住硬盘的方法。解决的办法是从软盘启动,启动后硬盘仍然可以 使用。用Debug或Noratn中的Diskedit软件将硬盘该分区表中的标志恢复,则从硬盘启动也没有问题了。锁住硬盘的另一种方法是对分区参数做手脚,如果将分区参数全部变为0,则 启动时由于找不到分区参数,从硬盘是没法启动,从软盘启动后也不认硬盘,如果你敲入盘符C并回车,将出现提示Invalid <BR> driver <BR> 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盘一样,看看你的计算机还能不能启动,不过你在没有充分的准备前绝不要试。 <BR> 一个完整的硬盘锁程序,不过是重新改写0柱面0磁头1扇区的引导程序,并将分区表破坏或故意制造一个循环分区表,而将真正的硬盘分区表参数和引导程序放在其它 隐藏扇区并保护起来,如果启动时口令不对,则不能启动机子,口令对了则顺利启动。这种硬盘锁程序,情形好的还可以用软盘启动;情形严重的就是连软盘也不能启动,硬盘真被 锁住。 三·解开硬盘锁的程序法 <BR> 如果硬盘被锁死,是否真的就无法解开呢?当然不是。看看问题的症结所在,根源在于DOS中的IO.SYS文件,它包含LOADER、IO1、IO2、IO3四个模块,其中IO1中包含 有一个很关键的程序SysInt_I,它在启动中很固执,非要去读分区表,而且不把分区表读完誓不罢休。如果碰上分区表是循环的,它就只有死机了。这是DOS的脆弱性和不完备性。其 实这也不能怪DOS,因为DOS为了获得硬盘使用权,就必需读分区表参数,而且DOS还约定驱动器号不能超过26,只不过没有考虑到此等循环分区表情形。一句话,机子不能启动不过是 DOS操作系统造成的,如果另写一个操作系统,或许就能启动机子。当然这只是说个笑话。 <BR> 明白了病因在于DOS,问题就好办了。DOS启动中不是要读硬盘分区表吗?我不让你读分区表甚至连硬盘都不让你读,不就可以顺利启动了。的确是这样的,开硬盘锁 的程序实现方法就是基于这个思想形成的。当然,这只有从软盘启动着手了。 <BR> 看看计算机的启动过程,上电首先进行的多项硬件自测跟我们没有关系,我们关心的只是它最开始和磁盘打交道时是干什么。如果选择从硬盘启动,则计算机和磁盘 最开始打交道是将硬盘0柱面0磁头1扇区的内容读入内存0000:7C00处并跳到0000:7C00处执行;如果选择从软盘启动,则计算机和磁盘最开始打交道是将A盘0磁道0磁头1扇区的内容 读入内存0000:7C00处并跳到0000:7C00处执行,在执行过程中,计算机并不检查该扇区的内容是什么,只机械地执行读命令,这使得许多系统型病毒得以生存。但利用这一点,恰 恰使我们的程序解锁法有了用武之地。如果我们用DOS格式化一张可以启动机子的系统软盘,将该软盘的0磁道0磁头1扇区的内容移到后面的空白扇区中,而重新写一段程序到该软盘 的0磁道0磁头1扇区,这样用软盘启动时首先执行的是我们所写的程序了。在这段程序中,具备这样一些功能:在DOS启动前抢先拦截INT <BR> 13H,驻留高端内存并监视INT <BR> 13H,判断是否读硬盘,如果是读硬盘就直接返回,这样就禁止了读硬盘,也就避免了DOS读硬盘循环分区表造成的死机;同时拦截对软盘的读取,如果读软盘的0磁道 0磁头1扇区,就改成读真正有引导程序和磁盘参数表的扇区,免得DOS在启动中找不到软盘的磁盘参数表而死机。完成这些任务的同时,还要读取软盘真正的引导程序并把控制权交给 它。 <BR> 该方法可以称为万能的,因为它在用软盘启动中,始终不与硬盘打交道,这样不管你硬盘用什么方法加锁了,对DOS的启动都没有影响。当然,这样启动的机子是不认 硬盘的,但这没有关系。你可在机子启动后,用Debug调出驻留高端内存的新INT <BR> 13H程序,将其改为只有一条直接执行旧INT 13H的语句,这样在Debug下可以用INT <BR> 13H读取硬盘0柱面0磁头1扇区的内容,如果你有备份,将分区表参数恢复后再写入0柱面0磁头1扇区,重新启动计算机就可以了。如果实在没有备份,去掉分区表中的 循环链,用正常DOS启动盘重启机子后至少也可以重新对硬盘分区,不至于硬盘被锁住打不开了。 <BR> <BR> 四·程序及说明 <BR> 1·下面是写入软盘0磁道0头1扇区的源程序key.com,程序用debug输入。 <BR> C>debug <BR> -a100 <BR> 100 CLI <BR> 101 XOR AX,AX <BR> 103 MOV DS,AX <BR> 105 MOV ES,AX <BR> 107 MOV SS,AX <BR> 109 MOV AX,7C00 <BR> 10C MOV SP,AX <BR> 10E STI <BR> 10F MOV SI,AX <BR> 111 MOV DI,7E00 <BR> 114 CLD <BR> 115 MOV CX,0200 <BR> 118 REPNZ <BR> 119 MOVSB <BR> 11A JMP 0000:7E1F <BR> 11F MOV CX,0003 <BR> 122 PUSH CX <BR> 123 MOV AX,0201;读启动软盘的引导扇区 <BR> 126 MOV BX,7C00 <BR> 129 MOV CX,4F01 <BR> 12C MOV DX,0100 <BR> 12F INT 13 <BR> 131 POP CX <BR> 132 DEC CX <BR> 133 JNZ 0122 <BR> 135 MOV AX,[004C];抢先获取INT 13H的位置 <BR> 138 MOV [7E88],AX <BR> 13B MOV AX,[004E] <BR> 13E MOV [7E8A],AX <BR> 141 MOV AX,[0413] <BR> 144 DEC AX <BR> 145 MOV [0413],AX <BR> 148 MOV CL,06 <BR> 14A SHL AX,CL <BR> 14C MOV ES,AX <BR> 14E XOR AX,AX <BR> 150 MOV DS,AX <BR> 152 MOV SI,7E6D;复制改写的INT 13H程序到高端内存 <BR> 155 MOV DI,0000 <BR> 158 MOV CX,0030 <BR> 15B REPNZ <BR> 015C MOVSB <BR> 015D MOV AX,0000;将新INT 13H位置写入中断向量表 <BR> 0160 MOV [004C],AX <BR> 0163 MOV AX,ES <BR> 0165 MOV [004E],AX <BR> 0168 JMP 0000:7C00 <BR> 016D PUSHF;新INT 13H程序 <BR> 016E CMP DX,0080;是否是硬盘 <BR> 0172 JNZ 0176;不是硬盘则继续 <BR> 0174 POPF <BR> 0175 IRET;是硬盘则直接返回 <BR> 0176 CMP DX,+00;是否读软盘BOOT区? <BR> 0179 JNZ 0186 <BR> 017B CMP CX,+01 <BR> 017E JNZ 0186 <BR> 0180 MOV CX,4F01;是则读79磁道1磁头1扇区 <BR> 0183 MOV DX,0100 <BR> 0186 POPF <BR> 0187 JMP 0000:0000;此处跳转去执行旧INT 13, <BR> ;旧INT 13H的位置由前面程序获得后写入。 <BR> N key.com <BR> RCX <BR> 200 <BR> W <BR> Q <BR> 2·程序的装载 <BR> <BR> 在进行下面工作前,先用DOS格式化一张启动的系统盘,并保证没有坏扇区,最好进行启动测试,确保其可以启动机子。由于现在机子上大多只有3寸软驱,因此选 择1.44M的3.5寸软盘。然后用debug <BR> key.com将程序key.com调入内存偏移地址为100H,同时在400H处写入一段装载程序。即: <BR> C>debug key.com <BR> -a400 <BR> 400 MOV CX,0003 <BR> 403 PUSH CX <BR> 404 MOV AX,0201;将A盘引导程序读入内存1000H处 <BR> 407 MOV BX,1000;为确保成功,首次采用重复读3次 <BR> 40A MOV CX,0001 <BR> 40D MOV DX,0000 <BR> 410 INT 13 <BR> 412 POP CX <BR> 413 DEC CX <BR> 414 JNZ 0403 <BR> 416 MOV AX,0301;将已读入内存的软盘引导程序写入软盘 <BR> 419 MOV </P>
< >◎ 不懂汇编 gww (20543)于2002/04/07(20:15:09).. <BR>我不懂汇编,但在第四部分:四·程序及说明 中的的倒数第五行,也就是“0187 JMP 0000:0000”下边是不是少了一行,最后怎么结束?<BR>◎ 接上面 amspark (17671)于2002/01/10(21:57:32).. <BR>41C MOV CX,4F01 <BR> 41F MOV DX,0100 <BR> 422 INT 13 <BR> 424 MOV AX,0301;将key.com程序写入软盘0磁道0磁头1扇区 <BR> 427 MOV BX,0100 <BR> 42A MOV CX,0001 <BR> 42D MOV DX,0000 <BR> 430 INT 13 <BR> 432 INT 3 <BR> 为保证万无一失,最好将软盘这两个扇区的内容重新读出来看一看,以保证写成功了。做好这一切,保险的还是进行一次测试,即用该软盘启动一次机子,看能否成 功,若成功启动,你就可以用循环分区表法锁住硬盘,看从正常DOS下能否启动,然后再用此软盘启动机子试试,看看功效如何? <BR> 从该软盘启动后,不认硬盘,并且在高端内存驻留了新INT <BR> 13H程序,该段程序实际上是key.com中从16D到187部分。由于有此段程序存在,在debug下也无法读硬盘,也就没法恢复硬盘分区表,因此机子启动后首先应修改这段 程序。现在的机子基本内存通常都为640K,这样这段程序就位于内存中9FC0:0000处,在debug下,用U9FC0:0显示这段程序,可以看到位于9FC0:001A处是一条跳转指令,该跳转指 令即转去执行最原始的INT <BR> 13H。由于BIOS版本不一样,跳转指令指向的位置可能不一样,如笔者机子上是一条JMP <BR> F000:A5D4语句。这时在在debug下编写这样一语句:a9FC0:0 JMP <BR> F000:A5D4。这样,对硬盘的禁写与禁读都不再起作用了,在debug下用INT <BR> 13H的2号子功能可以读出硬盘分区表,修改恢复后再用3号子功能将数据写回分区表。退出debug,重新用正常DOS启动计算机,就可以了。 <BR> 附带提一下,在正常DOS下,该软盘由于没有BOOT区,也就没有磁盘参数表,从而不能使用,用DIR A:命令会出现General <BR> failure reading drive A提示。不要理睬它,这并不影响它作特殊启动盘。 <BR> 五·建议 <BR> 为更好的保护你的硬盘,笔者建议你最好将你的硬盘分区表信息备份起来。备份有两种方式,一种是以文件形式将硬盘每个逻辑盘的分区信息存储起来;另一种是将 分区信息备份在硬盘隐藏扇区里。比如可以将0柱面0磁头1扇区备份在0柱面0磁头3扇区,将D盘开始柱面号0磁头1扇区备份在该柱面0磁头3扇区,其它逻辑盘也如此。这种方法简单、 方便,也很可靠。用NORTAN中的DISKEDI很容易操作和实现。有了备份分区表信息,就不怕破坏分区表的病毒了;再加上我给你的程序,即使有人真锁住了你的硬盘,你也可以轻而易 举解开了。 </P> |
|