影子系统原理
"影子系统"是一种常见的单点还原保护系统.
当系统重启后, 做过的修改会全部还原回来,
不能防住邪恶的ring3穿透, 不知道最新版有没有提高安全性
核心思想就是"重定向".
在了解原理之前, 先了解一下windows的驱动模型
在windows驱动体系中, 存在几种类型的驱动, 功能驱动, 过滤驱动等. 功能驱动用于实现硬件或则其他一些设备的功能,
过滤驱动的作用是为了增加系统功能, 或者修改原有的功能, 过滤驱动挂接在功能驱动上面.
当windows下发IO请求时, 过滤驱动比功能驱动提前收到请求.
因此过滤驱动可以提前完成这些请求(不把请求往下发), 也可以什么都不做, 往下发请求, 等等,
这就起到一个过滤的作用.
另外, 还需要明白的是windows驱动是分层
,
在磁盘层, 只有相对扇区的操作, 不存在有文件系统层面上的东西.
影子系统创建了这样一种过滤设备挂到磁盘设备上, 监视磁盘数据操作. 现在假设系统要写第5000号扇区, 为了实现还原操作,
当接收到系统的请求时, 影子系统会把这个写操作重定向到系统未使用的扇区,这里假设为6000.
那什么样的扇区是未使用的呢, 通常MS文件系统会维护一个位图, 位图中置一的表示扇区已使用, 为0的表示未使用.
当系统读5000号扇区内容时, 影子系统过滤驱动提前截获到系统的请求, 再次重定向,使读转向6000号扇区.
这样数据不会实际写到5000号扇区, 只是写到了系统未使用的扇区. 重启以后, 系统还是原来的状态.
这里读者可能会有疑问, 如果系统要写6000号扇区, 怎么办?
因为影子系统是磁盘过滤驱动, 会提前收到系统请求, 因此再做一次重定向就好. 上面的情况是最简单的情况, 实际上系统读写请求, 一般不会是单独一个扇区. 在一次读写请求中, 读写扇区范围可能包含需要重定向和不需要重定向的扇区, 这时候操作比较复杂.
因此, 在开发还原系统时, 算法和数据结构非常重要.
国内还有一个挺出名的"雨过天晴"多点还原系统, 原理复杂N倍.
题外话, 说说什么叫ring3下穿透? 通常系统读写磁盘走正常的路线时, 还原系统可以拦截到读写请求, 实现过滤.
存在PassThrough指令, 当使用这些指令时, 可以绕过还原系统的监控, 把数据真正写入磁盘中.
使用这些PassThrougth只需要win32程序就可以实现, 因此称为ring3下穿透.