还原精灵、冰点、影子系统等还原产品在关键的技术原理上没有本质区别,都是在磁盘过滤驱动一层对特定的扇区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、病毒、木马的混蛋们来说,要绕过一个标准的磁盘过滤驱动是很容易的。所以在驱动安装及防止非法穿透上要不断地改进,做还原驱动做到这步就跟做杀毒软件的有点类似了,道高一尺魔高一丈啊!
WINDOWS下的磁盘还原及穿透技术内幕
最新推荐文章于 2023-08-17 17:01:29 发布