首页
社区
课程
招聘
[原创]逆向Sysnap的注册表保护驱动[附源码]
发表于: 2009-6-9 17:33 12909

[原创]逆向Sysnap的注册表保护驱动[附源码]

2009-6-9 17:33
12909
第一次发文,错误在所难免,请多包涵
来自: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通过!

http://pickup.mofile.com/8427921618447897

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 243
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scm
2
支持原创,但我觉得还是把原文发上来的好。
2009-6-9 17:48
0
雪    币: 471
活跃值: (3703)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
文章和代码发到这里来比较好
2009-6-9 18:08
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
4
good ....俺那个驱动花了一天.抄了点代码...BUG多多就放上来了....
2009-6-9 18:31
0
雪    币: 564
活跃值: (42)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
5
不错......
2009-6-9 18:44
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
。。。。。。我打开了帖子,本来以为能看了。。。。
想不到还要再开一个百度。。。。
2009-6-9 18:45
0
雪    币: 217
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
第一次发帖,发现帖子的格式老是和我编辑时的有差异,所以就没放上文章,
说明对这里的环境还不太熟悉,请各位谅解!
2009-6-10 09:07
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不是大米译过了吗
2009-6-10 09:35
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
地址失效。。
2009-6-13 14:25
0
雪    币: 1769
活跃值: (54)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
链接失效,无法下载。
2009-6-13 19:00
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
11
我上传一下吧~
上传的附件:
2009-6-14 10:31
0
雪    币: 471
活跃值: (3703)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
代码链接失效,请重新上传一下,多谢
2009-6-14 11:03
0
雪    币: 471
活跃值: (3703)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
13
哇,老V果然是好人,多谢
2009-6-14 11:04
0
雪    币: 252
活跃值: (13)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
我怎么编译不能过啊,在ntddk.h下已经加了
struct {
            ULONG OutputBufferLength;
            ULONG InputBufferLength;
            ULONG FsControlCode;
            PVOID Type3InputBuffer;
        } FileSystemControl;

1>d:\WINDDK\2600\ylb\RegProtect\RegProtect.c(1293) : error C2039: 'FileSystemControl' : is not a member of '__unnamed'
1>        d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16457) : see declaration of '__unnamed'
1>d:\WINDDK\2600\ylb\RegProtect\RegProtect.c(1294) : error C2039: 'FileSystemControl' : is not a member of '__unnamed'
1>        d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16457) : see declaration of '__unnamed'
1>d:\WINDDK\2600\ylb\RegProtect\RegProtect.c(1295) : error C2039: 'FileSystemControl' : is not a member of '__unnamed'
1>        d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16457) : see declaration of '__unnamed'
1>d:\WINDDK\2600\ylb\RegProtect\RegProtect.c(1296) : error C2039: 'FileSystemControl' : is not a member of '__unnamed'
1>        d:\WINDDK\2600\inc\ddk\wxp\ntddk.h(16457) : see declaration of '__unnamed'
2009-6-14 18:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
果然强悍

支持源码顶起
2009-6-14 20:33
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
16
可怜的孩子...那个东西要加在那个typedef struct _IO_STACK_LOCATION里啊~

另外直接用ntifs.h就行了,当做FS驱动编译多方便啊~

在source里写上 DRIVERTYPE=FS
2009-6-14 22:19
0
游客
登录 | 注册 方可回帖
返回
//