第一次发文,错误在所难免,请多包涵 
来自:http://hi.baidu.com/devxa/blog

逆向Sysnap的注册表保护驱动
2009-06-09 17:25

前两天在网上闲逛偶得一款注册表保护软件,个人使用后感觉效果还不错,由于好奇其驱动的实现细节于是拿IDA剁了一把发现其中原理比较巧妙,特拿来和大家分享。先说下保护驱动的总体思路:

1.         获取系统盘在物理磁盘上的扇区偏移量;

2.         查询注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\hivelist获取SYSTEM 、SOFTWARE和CURRENTUSER对应的hive文件全路径;

3.         逐一打开各个hive文件,通过FSCTL_GET_RETRIEVAL_POINTERS接口来获取文件运行时分布(其实就是文件所占用的扇区分布图);

4.         Object Hook替换掉磁盘驱动disk.sys的IRP_MJ_WRITE派遣例程

5.         IAT Hook替换掉Atapi.sys驱动IoStartPacket例程的导入地址;

6.         在磁盘驱动disk.sys的IRP_MJ_WRITE的Hook例程和Atapi.sys驱动IoStartPacket的Hook例程中过滤写请求,根据写请求的磁盘扇区偏移量来判断是否是在操作我们要保护的hive文件,如果是则直接失败返回,否则,放过!

7.         驱动接收上层应用的控制,相应两个IO控制码,一个是打开保护,另外一个是关闭保护;

总体思路就是这样,可以看到我们从这个驱动中可以学习到“磁盘读写方法、内核中注册表操作方法以及IAT Hook和Object Hook”等知识。这其中有一个巧妙地地方:作者直接以失败返回的方式来禁止操作受保护的hive文件,而没有使用重定向机制,起初我认为这样会导致系统不可用,但是后来测试发现由于hive文件通常都不会太大,系统一般都会在系统的Cache中缓存hive文件内容,所以,你会发现上层对hive的更改虽然没有被写入磁盘,但对系统却没有副作用!还有一点需要说明,逆向中发现作者关于读写磁盘部分的代码和机器狗读写磁盘的代码几乎相同,这部分内容可以参照下面这篇文章:[转]机器狗穿透还原的磁盘级文件读写完整驱动代码

这里面有几个特殊地方需要说明:第一,如何获取系统盘在物理磁盘上的扇区偏移量,回答这个问题需要大家去翻翻磁盘分区的相关知识(Google关键词“MBR”)。驱动首先从物理磁盘0扇区位置读取1个扇区大小(512字节)的MBR区内容,然后从MBR的0x1BE位置开始读取第一个磁盘分区的相关信息(比如:分区的类型、分区所占扇区总数以及分区的开始LBA等关键信息),后而直接读取磁盘获取第一个磁盘分区的*伪MBR区*根据FAT、FAT32等信息来计算第一个磁盘分区在物理磁盘上的扇区偏移量。第二,作者在获得hive文件运行时分布后是通过一个巨大的静态数组来保存其扇区分布的,所以在理论上存在数组不够用的可能;

最后要说明一点的是,由于作者Blog中发布的驱动在Windows 2000上测试总是蓝屏,后调试发现是在获取hive文件运行时分布时分配的缓冲区过小以及IoCallDriver后对IRP的处理不当引起的,还有在Windows 2000上发现通过ZwQuery接口总是无法获取到Atapi.sys模块的基址(冰剑也无法获取),后来我改用PsLoadedModuleList方法来获取,所以我对代码总体上做了一部分优化和调整。总体上在2000到Vista(32位x86)系统测试还算正常,不过用到正规的产品中去还有很多工作要做 :-), 下面附上源码共大家交流,在WDK环境下Build通过!

上传的附件 RegShadow.rar