Good News ! Recover from CIH
摘抄:
工具软件:Norton Utility 8.0 中的 NDD.*/DISKEDIT.*/NLIB200.RTL ;老工具
了
系统软件:Windows 9X 启动软盘 ;自制
杀毒软件:KV300 Z版 (Cracked) ;staryang.yeah.net上Down的。
测试环境:Windows 95 (FAT32)/HP OmniBook 3000(HDD:4GB)/主板BIOS良好
1) 用无毒系统Windows 9X软盘启动计算机,进入CMOS SETUP,将系统日期修改为
26日以前。
2) 用软盘重新引导计算机,运行FDISK /MBR,清除主引导记录MBR代码区。
3) 运行DEBUG,输入以下程序:
-a
XXXX:0100 mov ax,201
XXXX:0103 mov bx,1000
XXXX:0106 mov cx,1
XXXX:0109 mov dx,80
XXXX:010C int13
XXXX:010E int3
XXXX:010F <回车>
-g
......(显示寄存器结果,略去)
-f11BE 11FD 00
-f11FE 11FF 55 AA
-a100
XXXX:0100 mov ax,301
XXXX:0103 <回车>
-g=100
......
-q
以上程序清空分区表。或者,直接运行DISKEDIT,选择物理驱动器HARD DISK 1
,按Alt-P
选择物理扇区,Side 0,Cylinder 0,Sector 1,用00清空偏移01BE至01FD,并
在扇区最
后输入55,AA。在启动DISKEDIT后,系统自动设为READ ONLY,从菜单中选TOOL
S->CONFIGURATION,
清除READ ONLY标记并回车,就可以对硬盘进行写操作了。在写操作之后,按Ct
rl-W存盘。
4) 清空分区表后,用NDD重建原分区。如果硬盘上还有除C以外的逻辑分区,可以
一齐找回。
5) 为重建逻辑驱动器C,下面将计算FAT区:
a) Windows 9X操作系统的逻辑驱动器C的BOOT区在Cylinder 0,Side 1,Sect
or 1。
b) 用DISKEDIT的FIND功能寻找ASC II字符串:COMMAND COM
(COMMAND与COM中间有一个空格,ASC II值为20,找寻FDT表中COMMAND.COM的
原
因是,根目录中一般都有此文件,如果你的计算机里该文件不在根目录,就将
上
述字符串改为根目录中的其他文件名,如IO.SYS或MSDOS.SYS。但要注意文件
名和
后缀名之间要有空格,总长度为11字节)
c) 找到后,用PgUp向前翻页,直到上一扇区尾部出现连续的00
(一般说,没见过硬盘的最后几十K还有存放数据的情况,否则,Windows 9X
的
虚拟内存恐怕就没法建立了,
)
d) 记录该扇区的Cylinder,Side,Sector值。——ROOT
e) 寻找FAT2的开始扇区,其特点是:
(要选中“Search at specified sector offset:[0...]”)
扇区偏移0000H处为F8 FF FF ;FAT16
扇区偏移0000H处为F8 FF FF FF ;FAT32
找到后,确认上一扇区尾部出现连续的00,则该扇区为FAT2头部。
(FAT1应与FAT2内容相同,但其头部数个扇区已被CIH破坏)
f) 记录该扇区的Cylinder,Side,Sector值。——FAT2
g) 计算FAT2的扇区数,用以下公式,其中,尾标0为FAT2地址,尾标1为ROOT地
址:
扇区数=(Cylinder1-Cylinder0)*Sectors/Cylinder+(Side1-Side0)*Sides
*Sectors/Cylinder+Sector1-Sector0
说明:Sectors/Cylinder为每道扇区数,Sides为硬盘的总磁头数。一个简单
的
查看方法是:在DISKEDIT中按下<End>键,屏幕右下角的Sector值即为每道扇
区
数,而Side值+1即为总磁头数。FAT1扇区数与FAT2相同。
h) 计算出FAT1头部地址,并记录。——FAT1
i) 在DISKEDIT中按Alt-P重选Physical Sector,起始地址为步骤e)记录的地址
。
扇区数为步骤g)计算出的扇区数。按Alt-W将选中的扇区(即FAT2)存至FAT1
开
始的地址(步骤h)计算出的FAT1头部)。
j) 至此,FAT2->FAT1的恢复工作宣告结束。
6) 下面恢复主引导记录中的标志:
用DISKEDIT选择Cylinder 0,Side 0,Sector 1,将此扇区尾部偏移为01C2H地
址的标志修复。
如果为FAT16系统,应为06H;如果为FAT32系统,应为0CH。均表示PRI-DOS分区
。
7) 恢复BOOT扇区,位置在Cylinder 0,Side 1,Sector 1,以下用0-1-1表示,
以此类推。
a) 在步骤5)中,已计算出了FAT1的起始位置。在FAT16系统中,FAT1一般自0-
1-2开
始;在FAT32系统中,FAT1一般自0-1-33开始。如果你的系统与此不同,以实
际
计算出的数值为准。
b) 将FAT1的起始扇区号减1,就是系统的隐含扇区数,一般FAT16为1,FAT32为
32。
c) 如为FAT16系统,跳过本步骤,至d)。
选择一台无毒的FAT32系统作参考,将0-1-1至FAT1前面的隐含扇区保存到
软盘文件(同5)i)的操作方法,只是地址、长度不同),假设文件名为abc.b
in,
然后,用DEBUG写入带毒硬盘。程序如下:
-n a:/abc.bin
-l1000
-rbx
BX:????
:0
-rcx
CX:????
:4000 ;FAT32 系统的隐含扇区数*512,16进制
-w1000 2 0 1
-q
d) 用DISKEDIT按Alt-P选择0-1-1(BOOT区),按F7以BOOT区方式显示。
i) 修改 Sectors per cluster,公式为:
C盘容量(估计值,GB)*1024*1024/(FAT2扇区数*512/4)*2;FAT32
C盘容量(估计值,GB)*1024*1024/(FAT2扇区数*512/2)*2;FAT16
将计算结果取整,C盘容量不必精确,毛估估就行。一般为8,16,...128。
ii) 修改 Reserved sectors at begin
ning,改为7)b)的计算结果。
iii)修改 Sectors per FAT:
如为FAT16系统,直接改为5)g)的计算结果。
如为FAT32系统,按F2切换到Hex显示方式,将5)g)结果写入偏移24H
开始的几个字节,注意,高位在后,低位在前。16进制。
iv) 修改 Sectors per track,改为5)g)中的“每道扇区数”
v) 修改 Sides,改为5)g)中的“总磁头数”
vi) 按Ctrl-W存盘。
8) 至此,所有修改完成。
9) 用软盘重新引导开机。切换到C盘,DIR查看目录,如无文件信息,可能是FAT
1/FAT2的扇区数计算
有误,加1后修改存盘并重启动;如出现不可读字符,减1后修改存盘并重启动。
经过此方法修改后,一般可将损坏的数据全部修复,除非你的硬盘分区过小
,如FAT16:小于20MB。
而CIH将0-0-1和0-1-1两道中的前100个左右的扇区用随机数据进行了覆盖,除了
破坏了FAT1,连FAT2
也无法幸免……不过,区区20MB的C盘,你恢复它干吗?