2、进程的隐藏与自我保护 我们通过上面的讲解已经知道,进程是一个程序运行所必须的,因此检查进程也就成了查杀木马的关键环节,我们知道这一点,木马的作者们当然更知道,所以,如何隐藏自己的进程,就成了养马人处心积虑要实现的。 说到这里,有懂的朋友们可能要笑了,心里更可能在说“连无进程木马都不知道,还好意思在这里显摆呢”。 一个程序可以无进程么?可以吗?真的可以吗?我可以很负责任的告诉您,在Windows系统下一个程序一定、确定以及肯定的会有一个进程,没有进程是不可能的。 那所谓的“无进程木马”又是怎么回事儿呢? 第一种无进程木马是DLL注入型木马: 什么是DLL呢?DLL是动态链接库,当某一进程需要实现某一功能时,此功能可能是放在某一动态链接库文件中的,所以,当进程需要使用时就要将动态库文件加载到自己的进程中。举例来说,如果进程就是一个工厂,那么,调用DLL就是将工厂的某一部分工作外包给了DLL去做,而工作地点就在自己的工厂内。明白了吗?进程就是工作的厂地,即使外包出去了,也是需要地方干活的。“加载到自己的进程中”这一句是关键啊,并不是没有进程,而是用了其它程序的进程。像我们上面找了半天的那个服务:C:"WINDOWS"system32"wuauserv.dll,注意一下文件的扩展名,不就是DLL么,这就是一个典型的DLL文件,如果这是一个木马文件,那么,这就是一个典型的无进程木马,因为他没有自己的进程,我们在进程列表中看到的是Svchost.exe的进程。这个DLL是利用服务来加载的,在注册表中还有很多位置可以让一个DLL加载到其它进程中,这在后面自启动程序一节中我们要讲解。 但是,通过注册表来加载是可以的,但却不是唯一的,还可以通过另一个进程,来打开现有的进程,来将DLL注入到被打开的正常进程中,然后,执行注入的进程退出,这样,在进程列表中仍然看不到木马的进程。 第二种无进程木马是线程注入型的木马。 什么是线程呢?上面说了程序就像一个工厂工人工作的流程表,而进程就是将流程真正的运行起来,正式的开始动手取原料--加工---组装---验收等等工作。但是,我们需要明白的一点是,工人们是可以分成小组后同时进行几个环节的,第一组工人负责取原料、第二组工厂人负责加工、而第三组工人负责组装、第四组……这样,可以分工合作同时进行形成流水线。而这工厂里的一组一组工人,相对于进程与线程而言,就是一个进程中的一个个线程。线程注入又是咋回事呢?线程注入,就是木马程序将一个恶意线程放到了正常进程的线程序列中去执行,就像在工厂中多增加了一组自己的工人负责制造炸弹,这一组工人与其它的正常的几组工人没有什么关系,但却借用了人家的工厂去从事着非法的勾档。 线程注入与DLL注入的区别是,线程注入只是增加了一组工人,这组工人是在以工厂的名义在工作,对外的名义也是工厂的名字,出了问题是由工厂负责的。而DLL注入呢,是外包,可能会增加一组工人也可能会增加多组,是以DLL自己的名义在工厂内工作的,出了问题是由DLL来负责的。当然了,如果问题大了,工厂也会受牵连的。看下面的图03-8:



在狙剑的进程列表中,选中一个进程按鼠标右键,选择“查看线程”就可以查看此进程中的每一个线程,也就是查看每组工人的情况,还可以对某个线程执行暂停运行、结束运行等操作。




我们注意看上面的线程列表,最后一列,显示了一些DLL的名字,还有一个是EXPLORER.EXEEXPLORER.EXE就是进程名字,我查看的就是EXPLORER.EXE进程的线程列表。




明白我上面说的区别了么?ntdll有三组线程在工作,那是ntdll在完成外包业务所需要的自己的三组工人;EXPLORER.EXE有一组,那是工厂自己的工人,如果存在线程注入,那么就会多出一个EXPLORER.EXE线程。但是需要注意的是,有多个EXPLORER.EXE并不代表就一定有线程注入,因为一个工厂也可以同时存在多条流水线。但只有一个EXPLORER.EXE那么通常情况下就是没有线程注入,因为一个进程肯定会有至少一个线程的存在,也就是说,一个工厂必定至少要有一组工人,皮包公司在Windows世界是不允许的。




了解了什么是DLL注入型木马、什么是线程注入型木马后,查杀他们显然就很容易了。




DLL注入型的,查起来很简单,用上面说的方法“查看某一进程的模块列表---à再隐藏无微软签名的项”,就可以查出单个进程中被注入的模块;如果在全系统范围内查找,则使用“搜索无微软签名的模块”就可以将注入到其它进程中的模块找出来,而大多数工具都提供了“卸载模块”的功能,卸载后就可以删除了,或直接用“卸载后删除”的功能,但有一点是需要注意的,如果该木马使用了防卸载的技术,那么卸载此模块时就会发生异常,对此也不必担心,我们还有其它方法清掉它,比如:清除其自启动项,不让他有注入的机会;或直接删除其磁盘文件等。




相比较起来,查杀线程注入型的木马,就比较困难了,我们上面说了,线程注入的没有自己的文件,只是一段注入的代码。也就是说他只是混入工厂内的一组工人,并没有自己的工厂也没有自己招牌,想把他与正常的工人区分开,是很困难的。这里提供了一个线程注入的测试程序:http://www.zhulinfeng.com/bbs/dispbbs.asp?BoardID=3&ID=78&replyID=&skin=1




先试一试看看效果,运行后,会打开一个窗口,但你却在进程列表中找不到有新增加的进程,那窗口是如何来的呢?这就是由注入到Explorer.exe中的线程创建的。这时你再查看Explorer.exe的线程列表,会发现多出来了一个线程,而线程的“模块”那一列(图03-8)标的名字就是Explorer.exe,这时线程列表中已经有两个名字为Explorer.exe的线程了,但哪一个是好的,哪一个是后来注入的呢?通常情况下看“基址”那一列(图03-8),基址数值较大的那一个一般是起动起来较晚的,就是后来加入的了,选中那一个线程选择“结束线程”,发生了什么?是不是那个窗口被关闭了?(注意:如果是用狙剑查看的,那么在线程注入后,查看新线程时,要重新刷新进程列表,不然会发现不了新注入的线程)




当然了,上面只是做个试验,让朋友们亲身体会一下线程注入是怎么一回事儿。真正查杀起线程注入型的木马来,用上面的方法显然是不行的,首先,我们不知道他注入到了哪一个进程中。其次,即使一个进程中有多个以进程名为名字的线程我们也无法确定那多出来的线程就是木马线程。所以,我们仍然要从自启动项入手来禁止线程注入。

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

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