4、自启动项的隐藏、保护与查杀




自启动项的隐藏与保护,跟进程的差不多,不外乎还是HOOK,系统提供给程序开发人员对注册表操作的功能函数常用的有如下几个:RegCreateKey RegOpenKey用于打开创建注册键;RegDeleteKeyRegDeleteValue用于删除注册键及注册值;RegEnumKeyRegEnumValue用于枚举注册键及注册值;还有RegQueryValu来获取值。另外还有一套*Ex函数,其实功能都是一样的。




而系统查看或删除注册键与值时,也是用的上面的几个API。而上面的一些个API是用于应用层的,它们又会调用系统内核中的Nt*系统的功能服务来进行接下来的处理(*代表了Nt开头的那些与注册表相关的系统服务),而Nt*系统服务又调用了Cm*底层功能代码来进行操作,当然了,最终的操作都要实现在HIVE文件上面去。




进程篇中的SSDT-HOOKSSDT-INLINEHOOK在注册表HOOK时是完全有效的,HOOK应用层的RegCreateKeyRegOpenKeyRegDeleteKey都可以实现注册键的防删除,而HOOK RegEnumKey就可以实现注册键的隐藏,这种HOOK可以对付系统与大多数应用层的安全工具的检查;而HOOK NtCreateKey等则同样可以实现隐藏与防删除且层次更深,而HOOK Cm*系统注册表操作函数,则更加邪恶,且已经有这类程序出现。总之,在注册表操作的任何一个环节进行HOOK,都可以实现隐藏与防删除的目的。




我们再来看看图03-33






在安装了著名的虚拟光驱程序Daemon Tools后,此工具的驱动会禁止用户删除其注册项,SPTD.sys就是它的驱动。再看下图03-34






打开狙剑,选择“扩展功能”àSSDT检查”就可以看到sptd.sys对注册表相关函数的HOOK




有了进程篇的相关例子,这里就不再细说了,原理都是一样的,还有对Inline-HOOK的检测可以用“内核代码扫描”。内核代码扫描不仅能找到Inline-HOOK Nt*系列函数木马,同样能找到Inline-HOOK Cm*系列函数的木马。只不过HOOK Cm*系统函数的木马层次更深一些而已。




而如果直接用狙剑的自启动项管理对自启动项进行操作,则无须手动检查与恢复HOOK,狙剑在扫描与清除自启动项时,会自动恢复相关的HOOK(有些HOOK有防恢复机制,也很难用手工来恢复,所以也就没必要非手工恢复它,交给工具去做就可以了)。




注册表由于其特殊性,使得我们多了一个检查与清除木马自启动项的终极手段,那就是直接操作HIVE文件,当然了,HIVE文件的重要性使得系统对其保护很严密,这对直接操作HIVE文件造成了一定的麻烦,而风险性也进一步的提高。这使得当前绝大多数安全软件,对操作HIVE文件来查杀木马都望而却步,但其效果却无疑是目前最好的。




我们先看看下图03-35






打开狙剑,选择“其它功能”à“注册表编辑器”就可以打开如上图所示的狙剑注册表编辑器,这个编辑器跟系统自带的那个Regedit.exe最大的不同就是,狙剑注册表编辑器是直接操作的HIVE文件,而没有使用任何的Reg*Nt*Cm*等系统的注册表操作函数,这样,所有的注册表相关HOOK对这里的操作将完全没有任何效果。




注意看上图的:HKEY_LOCAL_MACHINE"SYSTEM键,再与我们上面讲到的,复制System注册表文件后,用Regedit.exe的加载配置单元,加载后的内容是不是一样的?都缺少CurrentControlSet这一个子键。




在左侧的列表中按右键,可以选择“仅显示自启动相关项”,这时与自启动无关的项将被隐藏,方便使用注册表编辑器进行木马的查找。而如何使用注册表编辑器在HIVE级别上清除木马的自启动项呢?




我们看下图03-36






仍然以我们上面用到的系统还原的驱动为例来说明,找到这个键:




HKEY_LOCAL_MACHINE"SYSTEM"CurrentControlSet"Services"sr




注意在右则,是这个驱动的注册内容,在上面按右键,可弹出操作菜单,里面提供了几个功能“清除项值”、“修改项值”、“修改项名”。




l         清除项值:这个功能用于一般的自启动项,结果是会将“数据”那一栏的内容清零。比比如我们可以将ImagePath一项的数据清零,那么对于一般的驱动来说这个操作就可以禁止驱动的加载了。




l         修改项值:这个功能是修改“数据”那一栏的内容,这个用来做什么呢?呵,充分发挥想像,可以做很多事情。比如:将Start那一项的值改为4 ! 为什么改为4呢?如果上面注册表基础知识那一章看得仔细就应该知道,改为4是禁用此驱动的意思。或将ImagePath一项的数据中原来的Sr.sys改为:SS.sys 只改了一个字母,但驱动的加载是铁定会失败的,因为系统会在加载时努力的寻找SS.sys,结果当然是找不到了。




l         修改项名:这个修改的是第一列的项名字,也就是“StartImagePath……”等。呵,如何用,我就不多说了,相信也不用我多说了。项名字都是固定了,稍加改动就会使得系统认为这是无效项。




操作HIVE无疑是最底层的也是功能强大的,但用起来肯定不如使用自启动项管理方便,所以,一般情况下,这个是用不到的。




但一旦遇到变态的木马时,有这个功能,会让我们感到心里有底。比如:一旦清除木马的启动项,系统马上就蓝屏的情况我就遇到过,这是木马变态般的自我保护,而其保护的基理就是注册了注册表改变通知的消息,一旦其注册表项被改变,他就会接到系统的通知,而他一旦接到通知,就会马上使系统崩溃,让我们对其所做的修改无效。




为什么马上系统崩溃就会使修改无效呢?这是因为系统的缓存机制在起作用,正常情况下,我们的修改只体现在了缓存中,系统通常是5秒钟为间隔的将缓存中的数据向磁盘中更新,而修改后马上崩溃,将使得系统来不及向磁盘中写入修改后的信息,导致修改无效。(后面删除文件一章中我们还会讲到这个。)




对这个变态的木马,我的处理,只是简单的将其“Start”中的值改为了4,重启系统后,它就自然死亡了。原理也很简单,直接操作HIVE文件绕过了系统所有的注册表操作环节,系统也不知道我们做了更改,即然系统都不知道,木马自然也得不到通知了。




总之,越向底层走,功能越强大,但操作就越不方便,风险也就越大。像狙剑的“终极修复”就是一个例子。终极修复其实也是一个操作注册表文件的例子,在系统初装时,系统会在Windows"Repair目录下,保存一份注册表HIVE文件的完整备份,这是最原始的也是最简洁干净的注册表文件。




终极修复利用的就是这个备份的注册表文件,用这一套文件取代现有文件,将会使得系统的全部配置回复到初装系统时的状态,那些木马病毒的自启动项自然也就不存在了。回复后的系统将是高效的、简洁的、干净的。好像微软的官方网站上也曾有过利用这种方法修复崩溃系统的思路,但现实中,却偶有修复后,无法进入系统的情况发生。原因肯定是安全相关的,但具体机理却一直不清楚,微软在安全方面的确开放的资料很少很少。




因为这种风险的存在,使得这种修复被灌以了“终极”这个名字,终极的意思就是最终的手段,不到最后关头切勿使用。而有的朋友看漫画看多了,认为终极就是最利害的意思,为此强烈批评狙剑的终极修复其实原理很简单,不配终极这个词,这实在是让人无言以对。




至此,自启动项的内容我们就聊完了,下面我们准备继续聊的就是文件篇,还喜欢这篇文章的朋友们,还请多支持多转载,毕竟写这个东西是很辛苦的,能让更多的人看到,也算充分发挥了其价值,也算我的熬夜辛苦没有白废,大家的支持就是我继续下去的动力。




最后再习惯性的加上一段:此文作者为MuseHero您可任意在网络上传播与转载,但请保持完整性,并标明作者与出处。

--------------------------------------------------------------------------------------
本文转自狙剑作者的blog----MuseHero.blog.tianya.cn

Identify the aspects of your application that vary and separate them from what stays the same.