忘记密码
 新成员注册
查看: 1139|回复: 2

[转帖]硬盘数据恢复知识1

[复制链接]
我的人缘0
发起活动
0 次
参加活动
0 次
龙能跃 发表于 2007-10-25 10:23 | 显示全部楼层 |阅读模式

你还没有登录,登录后可以看到更多精彩内容

您需要 登录 才可以下载或查看,没有账号?新成员注册

×
1、 系统工作机理的简单介绍(本节由lowpower缩写) 这一部分在原作中是最重要的一章,考虑到篇幅关系,进行了大量的删节。 ①、 dos(dos兼容系统)硬盘数据的构成 dos磁盘系统,可以按照逻辑分区的概念管理物理空间,不同分区可以装载不同的os系统。 示意如下:                  硬盘空间 第一扇区|分区1     |分区2   |分区3   |分区4 主引导扇区|引导扇区|引导扇区|引导扇区|引导扇区| 各分区公用|各个分区相对独立,可安装不同操作系统。



对fat结构的分区每一分区都有独立的引导记录,fdt表,fat表等。同时,系统还有一个最为重要的主引导记录。在0柱0面1扇区,今后我们用cyl代表柱、side代表面,sec代表扇区。以下一个fat结构分区的简图。



保留区- 磁盘参数表、dos引导记录 控制区-fat表1、fat表2根目录区 数据区-数据区



以下简单介绍一下重要的部分: 主引导记录又称主分区表、mbr等等:mbr占一个扇区,在cyl 0、side 0、sec 1,由代码区和数据区构成。其中代码区是一端标准的程序,完成bios自举到os boot之间的工作,为os启动做最后的准备。标准代码区可以由fdisk/mbr重建,但对于多系统引导的不标准mbr,将被这一操作破坏。mbr的数据区记录了分区情况。 系统扇区:cyl 0、side 0 、sec 1-cyl 0、side 0 、sec 63,共62个扇 区引导区又称boot区:cyl 0、side 1 、sec 1 这是我们过去称的dos引 导区。也占一个扇区。 文件分配表又称fat:是记录文件占用簇的情况和连接关系的地方。一般有两个fat表,起到备份的作用。fat12、fat16的第一fat表一般均在0-1-2,fat32的第一fat表在0-1-33。由于fat表记录文件占用扇区连接的地方,如果两个fat表都坏了,后果不堪设想。 由于fat表的长度与当前分区的大小有关所以fat2的地址是需要计算的。根目录区(root、fdt):这里记录了根目录里的目录文件项等,root区跟在fat2后面。 数据区:跟在root区后面,这才是数据内容。其实, mbr、隐含扇区、boot区,重建都比较容易。数据恢复的关键在于恢复数据文件。由于fat表记录了文件在硬盘上占用扇区的链表,如果2个fat表都完全损坏了。那么恢复文件,特别是占用多个不连续扇区文件就相当困难了。 ②、 主引导记录简单说明: 主引导记录是硬盘引导的起点,关于代码区不多说了,其数据区,比较重要的是2个标志,80h和55aa,80h一般在偏移1be处,80是分区激活的标志的标记表示系统可引导,且整个分区表只能有一个80标记。另一个就是结尾的55 aa标记,用来表示主引导记录是一个有效的记录。另外,各个分区自身的引导记录,也是以55aa结束,这是我们查找分区的标志。我们后面在介绍如何主引导记录中,给出了一个完整的分区表的例子,大家可对照查看。数据区中,用10h字节表示一个分区,最多可表示4个分区,分别从1be、1ce、1de、1ee开始,我们后面给出了分区表项对应地址的含义。大家可以对应分析一下以下分区的情况。 80  01  01  00  0b  fe  bf  fc  3f  00-00 00 7e 86 bb 00 ①      ②      ③       ④            ⑤        ⑥ ①:激活标记,80表示可引导分区 ②:分区开始的磁头号为01、开始的扇区号为01、开始的柱面号为00,由于开始的扇区号为2进制6位,而开始的柱面号为2进制10位,因此扇区号所用字节的高两位要加在柱面号高两位。 ③:分区的系统类型fat32(0b),01是fat12,04为fat16,06为bigdos,07为ntfs, 其他参见分区类型表。 ④:分区结束磁头号254、分区结束扇区号63、分区结束柱面号764 ⑤:首扇区的相对扇区号63 ⑥:总扇区数12289622 2、常见手工处理工具与dos外部命令介绍 debug:古老和最为常见的调试跟踪软件,始终捆绑在微软的dos/win9x操作系统中。有19个子命令。有编写执行汇编指令,直接读写绝对扇区和内存单元等功能,可以在最艰苦的条件下工作。dos6.22以下的系统,debug.exe在dos目录下,win9x系统中它在windows\command目录下,它 也出现在win9x所生成的应急盘中。diskedit:常见16进制编辑软件,字符界面,可以以文件方式和扇区方式读写逻辑内容,可以读写绝对扇区,可以方便的查找编辑分区表、fat表、root区等重要扇区。这一点要比debug更方便。但在一些重要扇区损坏的情况下,diskedit可能无法启动。diskedit软件可以在著名的norton utilities软件包中找到。最新的diskedit出现在nu4中。 ndd:常见的fat文件结构磁盘修复工具,就是著名的norton磁盘医生,可以自动修复分区丢失等情况,可以抢救软盘坏区中的数据,强制读出后搬移到其他空白扇区。希望大家不要再使用norton for dos7或8的ndd,这个版本由于不支持大分区、fat32、长文件名等技术,会给你带来大量的麻烦。建议大家使用norton utilities4或更高版本中的ndd.exe,这是纯dos下的工具。在硬盘崩溃或异常的情况下,他可能可以带给用户以希望。win9x下的磁盘医生调用的并不是这个程序,而 是ndd32.exe. fdisk:fdisk当然是个危险的命令,很多人非常恐惧,事实上,fdisk命令的运行并不影响任何分区内的硬盘数据,他对分区的设置操作,只改变主分区表的数据区。而特别是fdisk异常重要的隐含参数/mbr,可以重建主分区表的代码区,清除主引导型病毒等。这是非常有用的操作。dos6.22以下的系统,fdisk.exe在dos目录下,win9x系统中它在windows\command目录下,它也出现在win9x所生成的应急盘中。 format:在一些人眼中,format是最可怕的命令,但他并不是对硬盘清零,特别值得注意的是,很多文件恢复工具都建议你恢复前先format该分区起到保护的饿作用。dos6.22以下的系统,format.com在dos目录下,win9x系统中它在windows\command目录下,它也出现在win9x所生成的应急盘中。 hd-copy:传统的软盘copy工具,2.0版本以后加入了强制读的功能,可以读出一些损坏扇区的内容。 sys:sys命令是重建boot区的最简洁的手段,也可以杀除boot区病毒。dos6.22以下的系统,sys.com在dos目录下,win9x系统中它在windows\command目录下,它也出现在win9x所生成的应急盘中。



令我非常遗憾的是,至今我没有发现比较出色的扇区级备份镜象工具,我曾写过一个hd-mirror,但由于错误较多,我提供下载的第二天就停止了发布,另外fixc的作者noz写过一个clone.exe,但可惜只适合相同的硬盘。我也曾以为ghost可以做到这点,事实上,你目前还不能指望他为你备份一块深度破损的硬盘。。如果有一个有效的能以按扇区机制(而不是文件机制)压缩备份一块硬盘将之做成一个镜象文件的话,那么我们的恢复工作就拥有了更多的保证和余地。我们可以更大胆的做恢复的尝试。 3、 一些自动处理工具或软件包 首先介绍国内的一些免费修复工具 fixmbr:何公道先生写的一个修复mbr的工具,适合处理逻辑分区丢失的情况, 有一些可选参数,支持 fat32、fat16,不支持ntfs、linux等分区,支持8.4g以上硬盘。可修复cih发作后的扩展逻辑分区。 vrvfix:北信源公司的推出的修复硬盘共享工具,适合处理逻辑分区丢失的情况,处理的基本比较准确。支持fat32、fat16,不支持ntfs、linux等分区。也不支持8。4g以上硬盘。 fixc:国内最早出现的可以修复部分被cih破坏的c盘的工具,作者是noz,新版本也加入了修复分区信息的功能,支持fat32、fat16,有限支持ntfs,不支持8。4g以上硬盘。目前的版本已经比较完善。 fixhdpt:tbsoft工作室的分区信息修复工具。支持fat32、fat16,不支持ntfs和linux,不支持8。4g以上硬盘,是历史比较长的工具之一。 re(reapireasy):本人早期写的分区表修复工具,支持fat32、fat16,有限支持ntfs,不支持8.4g 以上硬盘,和某些bios不兼容。其整体水准低于前面列举的工具。 国外一些系统维护的工具目前已经达到了非常强大的程度。 norton utilities:历史最悠久的系统维护工具。不仅可以数据恢复,还可以系统加速和修补内存错误。目前最新的版本是nu 4.5for 9x、nu2 for nt等。 tiramint:最为出色的灾难恢复工具之一,有ntfs、fat32、fat16、novell4种版本。生成急救软盘,可以对深度破坏的磁盘进行交叉恢复。 4、常用的基本操作 ① 读出主引导记录:这是系统级数据恢复可能涉及最多的程序之一。 例: debug -a100 ;从此处开始汇编 126c:0100 mov ax,201; 读操作一个扇区 126c:0103 mov bx,300; 送入地址300 126c:0106 mov cx,1 ;0面1扇 126c:0109 mov dx,80 ;80h为硬盘,头为0 126c:010c int 13 126c:010e int 3 126c:010f -g=100 ;执行 ax=0050  bx=0300  cx=0001  dx=0080  sp=ffee  bp=0000  si=0000  di=0000 ds=126c  es=126c  ss=126c  cs=126c  ip=010e   nv up ei pl nz na po nc 这里用了i/o中断13,涉及的寄存器含义为 ah,操作方式,02h为读,03h为写 al,送扇区数 bx,送准备装入扇区的内存偏移地址 cx送从哪一道哪一扇区开始,我们一般依靠改换cx来读写不同逻辑盘某个逻辑扇区。dx,送盘符和头数 int 3是断点中断,使程序运行到此停止。 ② 显示引导区内容:我们把扇区读到某个内存地址并不是目的。而是为了看到他的内容,在debug中d命令可以方便的查看内存单元的内容。续前例,如果我们要看到主引导区的内容的话,既然装载到300。 -d300 l200就可以查看了,一个引导区的映象类似如下,可以直观的看到我们前面所提到的代码区和数据区。是否正常请大家自行分析一下 126c:0300  33 c0 8e d0 bc 00 7c fb-50 07 50 1f fc be 1b 7c   3.....|.p.p....| 126c:0310  bf 1b 06 50 57 b9 e5 01-f3 a4 cb be be 07 b1 04   ...pw........... 126c:0320  38 2c 7c 09 75 15 83 c6-10 e2 f5 cd 18 8b 14 8b   8,|.u........... 126c:0330  ee 83 c6 10 49 74 16 38-2c 74 f6 be 10 07 4e ac   ....it.8,t....n. 126c:0340  3c 00 74 fa bb 07 00 b4-0e cd 10 eb f2 89 46 25   <.t...........f% 126c:0350  96 8a 46 04 b4 06 3c 0e-74 11 b4 0b 3c 0c 74 05   ..f...<.t...<.t. 126c:0360  3a c4 75 2b 40 c6 46 25-06 75 24 bb aa 55 50 b4   :.u+@.f%.u$..up. 126c:0370  41 cd 13 58 72 16 81 fb-55 aa 75 10 f6 c1 01 74   a..xr...u.u....t 126c:0380  0b 8a e0 88 56 24 c7 06-a1 06 eb 1e 88 66 04 bf   ....v$.......f.. 126c:0390  0a 00 b8 01 02 8b dc 33-c9 83 ff 05 7f 03 8b 4e   .......3.......n 126c:03a0  25 03 4e 02 cd 13 72 29-be 46 07 81 3e fe 7d 55   %.n...r).f..>.}u 126c:03b0  aa 74 5a 83 ef 05 7f da-85 f6 75 83 be 27 07 eb   .tz.......u..''.. 126c:03c0  8a 98 91 52 99 03 46 08-13 56 0a e8 12 00 5a eb   ...r..f..v....z. 126c:03d0  d5 4f 74 e4 33 c0 cd 13-eb b8 00 00 00 00 00 00   .ot.3........... 126c:03e0  56 33 f6 56 56 52 50 06-53 51 be 10 00 56 8b f4   v3.vvrp.sq...v.. 126c:03f0  50 52 b8 00 42 8a 56 24-cd 13 5a 58 8d 64 10 72   pr..b.v$..zx.d.r 126c:0400  0a 40 75 01 42 80 c7 02-e2 f7 f8 5e c3 eb 74 49   .@u.b......^..ti 126c:0410  6e 76 61 6c 69 64 20 70-61 72 74 69 74 69 6f 6e   nvalid partition 126c:0420  20 74 61 62 6c 65 00 45-72 72 6f 72 20 6c 6f 61    table.error loa 126c:0430  64 69 6e 67 20 6f 70 65-72 61 74 69 6e 67 20 73   ding operating s 126c:0440  79 73 74 65 6d 00 4d 69-73 73 69 6e 67 20 6f 70   ystem.missing op 126c:0450  65 72 61 74 69 6e 67 20-73 79 73 74 65 6d 00 00   erating system.. 126c:0460  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................ 126c:0470  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................ 126c:0480  00 00 00 8b fc 1e 57 8b-f5 cb 00 00 00 00 00 00   ......w......... 126c:0490  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................ 126c:04a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................ 126c:04b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 80 01   ................ 126c:04c0  01 00 0b fe bf fc 3f 00-00 00 7e 86 bb 00 00 00   ......?...~..... 126c:04d0  81 fd 0f fe ff ff bd 86-bb 00 e0 a9 75 00 00 00   ............u... 126c:04e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................ 126c:04f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 aa   ..............u. ③ 反汇编主引导区内容:判定mbr的代码区是否正常,对于数据区的基本情况,我们可以通过直观观察得出,但对于存在引导型病毒,或者引导区出现异常代码的情况,我们可能需要分析mbr中代码区的指令。这一般要对已经读入内存的引导区进行反汇编。 反汇编用指令u 续前例: -u300 l15d ;反汇编主引导扇区代码区内容 126c:0300 33c0          xor ax,ax 126c:0302 8ed0          mov ss,ax ………… 126c:045c 65            db 65 126c:045d 6d            db 6d ④ 写内存单元,在我们的前例中,主分区类型是0b是fat32的,假定这个类型实际是ntfs的,我们该如何修改呢?由于主分区类型的偏移是4c3h,我们可以用e命令写到内存单元中,从附表中查得ntfs的类型为07。因此 -e4c3 7再比如说,假定我们想把无效的分区表清零,那么,我们应当用另一个命令f,这个命令可以用填充一个内存地址范围。清零分区表的操作就是 -f4be 4ff 00,以下两个操作也比较常见。 重置80标记,-e4be 80 重置55aa标记,-f4ff 4fe 55 aa 不要忘记了,此时仅仅是改动了内存中的数据,并未写到硬盘上。因此需要用int 13中断把改写的结果,写回硬盘。   续前例, -a100 126c:0100 mov ax,301 ; 写操作一个扇区 -g=100 ;执行   其实,我们相当于修改了刚才输入的读主引导扇区程序,使程序变为。 126c:0100 mov ax,301 ; 写操作一个扇区 126c:0103 mov bx,300 ;从内存地址300 126c:0106 mov cx,1   ;0面1扇 126c:0109 mov dx,80  ;80h为硬盘,头为0 126c:010c int 13 126c:010e int 3      ;断点 ⑤ 绝对磁盘内容的读出与写入 类似操作在fat32结构硬盘被cih破坏的修复中比较常见,我们后面将讲到恢复的基本思路就是用第二fat表覆盖第一fat表。那么无疑要读出第二fat表的内容,再回写到第一fat表的位置上。一般的来说,大量连续扇区的读出写入diskedit进行非常方便,如果用debug做则要写一段子程序,不过程序的主要技巧就是利用int 25绝对磁盘读中断读出的内容,而用int 26绝对磁盘写做内容写入。 4、数据可恢复的前提   有人觉得这个题目说法比较奇特,但数据恢复,作为一个数据再现的过程,一定要解决两个问题,第一是从哪里恢复的问题,第二是怎么恢复的问题。解决了这两个问题,我们事实上就把握了数据恢复的全部思想脉络。而这一部分就是从哪里恢复的问题。 ①、 有效而及时的备份中是数据恢复最可靠的来源,在许多人倡导备份到秒的今天,恐怕不会有人怀疑这点。而有些备份机制则是系统内建的,比如两份fat表。 ②、 数据的实际有效性的判定是关键,对我们来说,硬盘无法自举、文件找不到、文件打不开等现象,其实并不与数据丢失画等号。因为此时往往数据只是从操作系统的角度是一种逻辑丢失,而从物理扇区意义上,它仍然存在或部分存在。最明显的就是文件删除的例子,事实上,这只是把文件首字节,改为0e而已。而此时文件体依然存在。 ③、 数据损坏过程的可逆性分析:对数据的改变无非两种,取代和变换,前者是不可逆的,而后者则是可逆的。我们以杀毒为例,对于大多文件性病毒来说,那些以附加而非代换方式感染的文件型病毒,理想的杀毒过程就是感染的逆过程。这种分析也常见与重要信息被隐藏搬移或者被加密的情况,但分析将比较复杂。 ④、 数据本身是否是标准信息:有些信息实际是通用或局部通用的,你无须考虑如何从本机抢救。只要相同或相近的系统版本就可以了,比如boot区、隐含扇区、windows的dll文件等等。典型的例子如分区表的代码区,这是一段标准代码,事实上,它就放在你的fdisk程序里面,你可以用debug把他提取出来。 ⑤、 数据本身是否可以由其他信息统计再生:有些信息尽管丢失了,也没有备份。但它实际可以从其他数据中间接求得。最典型的就是主分区表中的分区信息,即使你把他清零也不必害怕,因为你可以从你几个分区中计算再生。 ⑥、 破坏的完成程度:事实上,fdisk、format都不会彻底破坏数据,一般只有低格和扇区覆盖操作才会彻底破坏数据。但有时,破坏过程或者误操作过程会因人工终止、死机等原因不能完成。最明显的就是cih病毒的例子,由于cih是以1024字节为单位覆盖扇区,这当然是不可逆过程,于是我们最初都认为,破坏是很难恢复的,除非人工终止。事实上,当病毒覆盖某些扇区时会与9x系统发生冲突,从而造成死机,使数据得到了保护。
充实自我,展现自我!没有完美的个人,只有优秀的团队!计协我的家,建设靠大家!只有真正的融入了,你才会体会快乐哦~
我的人缘0
发起活动
0 次
参加活动
0 次
曾嘉欣 发表于 2008-1-20 18:31 | 显示全部楼层
哇,我都看不懂.
充实自我,展现自我!没有完美的个人,只有优秀的团队!计协我的家,建设靠大家!只有真正的融入了,你才会体会快乐哦~
我的人缘0
发起活动
0 次
参加活动
0 次
陆良萍 发表于 2008-4-9 11:36 | 显示全部楼层
是很不懂,但很想了解一下
充实自我,展现自我!没有完美的个人,只有优秀的团队!计协我的家,建设靠大家!只有真正的融入了,你才会体会快乐哦~
您需要登录后才可以回帖 登录 | 新成员注册

本版积分规则

QQ|手机版|CA之家 ( 桂ICP备07006672号-6 )

GMT+8, 2025-9-19 18:24

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表