系统还原原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
还原精灵、冰点、影子系统等还原产品在关键的技术原理上没有本质区别,都是在磁盘过滤驱动一层对特定的扇区IO进行了重定位处理。本文将对这种技术进行简略分析,并提供一套实用的实现源代码。多点还原的实现方式与前面几者区别较大,这里不作讨论。
虚拟还原数据保护技术
我们都知道,当系统里安装了磁盘“还原”类软件并激活后,所有应用层文件的写操作——创建、修改、删除,以及各种系统设置、注册表的变化,甚至包括分区格式化,在系统重启后都被完全恢复到激活还原软件时的状态。这种“恢复”的表象背后,并不是真的有什么机制在帮我们把文件系统的各种操作回退到最初的状态。事实上,一旦还原软件被激活后,我们的对文件的所有写操作就不再是有效的,全都被写到磁盘上的一些临时空间中,比如未使用的簇或预先分配的特定存储文件内,而磁盘分区内已分配给文件占用的有效扇区,一个也不会被写入!由于文件系统下层的还原驱动程序通过内存中的一个重定位表,帮我们维护着这些新写入的脏数据快与上层文件系统结构的链接关系,所以我们仍然觉得各种文件操作都在正常进行。但是当系统重启后,内存中非持久的重定位表消失了,驱动程序也处于初始化状态,更关键的是,文件系统的原来分配的有效扇区一个也没变!所以我们通过文件系统看到的磁盘分区结构也是没有变化(其实是有变化的,你在系统重启前写入的那些文件都在磁盘未分配簇或临时转储文件里)。
弄明白上述过程,就可以分析出磁盘过滤还原驱动的关键技术点了:
一、分析磁盘分区结构,你得知道什么是MBR、DBR、文件簇、扇区相对偏移(分区内)、扇区绝对偏移(磁盘内)、磁盘分区结构表等,还得对FAT\NTFS文件系统结构有一定的了解,至少你得知道FAT的簇分配表以及NTFS的$MFT和$BITMAP。
二、截获扇区IO(文件系统是以簇为单位操作,簇到了磁盘驱动这一层就变成了连续的扇区块),然后根据扇区的偏移做出不同的处理。
下面为了叙述方便,我们把在还原状态下被写过的扇区称为“脏”扇区,未写过的扇区称为净扇区。
读操作
读净扇区——直接下传该操作的IRP;
读脏扇区——查询重定位表,找到脏扇区数据的实际存储位置,转换IRP的偏移,分割后再下传(这里如何分割并创建子IRP是个难点);
写操作
写净扇区——在未使用的扇区里分配出同样大小的空间,设置重定位表,转换IRP的偏移,分割后再下传;
写脏扇区——查询重定位表,转换IRP的偏移,分割后再下传;
三、高效的重定位算法及数据结构,位
图是个比较直观方式,但是当磁盘空间很大时,也许你在物理内存中无法放置一个映射全盘扇区的位图,而且位图的操作效率就是最好的吗?
四、从磁盘分区信息中解析出文件的簇链,这个并不是还原驱动所必须的,但如果你要做一些相对高级的功能,就会需要以文件为单位来进行操作而不是以扇区为单位来进行操作。使用内核文件API?磁盘驱动中怎么能使用文件API呢!
五、穿透,有很多方式,这里举一个例子:即动态切换磁盘的还原/非还原状态,然后在非还原状态下把我们需要更新的文件写入磁盘扇区。虽然更新的时间通常只是一会儿,为了稳妥起见,在非还原状态下还是要使用某种临时保护机制(比如文件系统只读),禁止其它进程写文件。切换分区还原状态一定要锁定分区,因为未锁定的分区在内存中可能有各种未决的操作、中间状态及未刷新的缓存,是不稳定的。锁定分区和临时的保护方式,会带来一些应用上的不便。目前有一种不锁定分区,映射出虚拟分区后两次写操作的更新方式。
六、其它一些细节。比如pagefile.sys\hiberfil.SYS文件的特殊处理、BOOT文件标志的设置、阻止WINDOWS磁盘分区管理程序的操作,以及对MBR\DBR的保护等等。
七、磁盘过滤驱动的安装及防护。对于那些写ROOTKIT、病毒、木马的混蛋们来说,要绕过一个标准的磁盘过滤驱动是很容易的。所以在驱动安装及防止非法穿透上要不断地改进,做还原驱动做到这步就跟做杀毒软件的有点类似了,道高一尺魔高一丈啊!
【出售以下源代码】
1、基于磁盘过滤技术的扇区还原驱动源代码;
2、FAT12\FAT16\FAT32\NTFS文件系统的部分操作集代码,(FAT部分可读写文件,略加修改即可创建文件;NTFS部分可以解析出任意目录下文件的全部簇链,包括$MFT内含的小文件及使用LIST属性描述的文件);
3、文件系统只读保护HOOK,以只读的方式保护任何指定的目录下的所有子目录及文件,同时让指定的进程任意读写(路径名匹配算法极快);
以上三部分已经整合成一个驱动程序,用WindDDK 2003和VS 2003在IDE里面编译,可以很轻松地产生WIN2000\WIN2003\WINXP三种系统版本的发布或调试驱动程序。
4、应用层接口(已包含在DEMO程序里面),有C++Builder和DELPHI两种版本。
特点:
A、稳定性 - 各种操作系统下多次测试,在不切换状态的情况下,无蓝屏及其它错误发生。已在上千家网吧中实际运行使用。
B、速度 - 得益于高效的扇区重定位算法,接近未安装任何还原系统的硬盘本身速度,超过所有同类产品包括硬件还原卡。
C、功能可扩展性 - 文件系统的解析代
码并不是一个简单还原驱动所必需的,但是有了这些代码就可以实现一些很有用的功能,比如在游戏运行状态下无缝地更新所有游戏文件,甚至更新操作系统。这些功能是仅以扇区作为访问单位的磁盘过滤驱动无法做到的。此外,还可以实现文件粉碎功能。
D、MBR保护、分区DBR保护、阻止系统磁盘管理程序、页面文件处理、BOOT文件标志等细节都是考虑了的。
注:系统资源(物理内存或磁盘空间)耗尽时,提示“延缓写入失败”。
不足之处:
1、更新文件时,要锁定分区,然后切换状态。不能在程序运行时或文件句柄打开时更新文件(实际上是可以执行,但会导致系统不稳定)。另外,在状态切换后,有极低的概率导致系统不稳定。
2、每次切换分区状态,转储文件中已经使用的空间未回收。因为是临时解决方案,所以这里就简化处理了,可以分配较大的转储文件来避免这个问题。
以上两个不足之处是可以彻底改进的。