常见木马技术和手动检测方法所有病毒case,Symantec用户抱怨的无非两项,一是查不到病毒,二是不断的查到相同的病毒(绝大多数是木马downloader,backdoor.trojan)。木马是什么?是一个有恶意行为程序。杀毒软件怎么查杀它?特征码和行为分析。如果一个木马在技术上或者创意上做的稍微好些,我觉得杀毒软件对于已经中毒的电脑很难起到作用,经常是查到了一部分,落掉一部分,而落掉的部分又会监控、恢复被查杀的部分,造成上面所说的第二种情况,而这又一定会包含第一种情况。木马既然是程序,恶意程序,那它运行也不免会露出蛛丝马迹,程序运行的两个必要条件—进程(模块,线程)和加载(自启动和触发)。那我们查找木马也从这两个大的方向入手,理论上可以找出所有木马,但是这跟做数学题一样,大方法是有的,但是操作过程千变万化的。工欲善其事,必先利其器。首先要找几个适合自己的工具:主工具我个人喜欢用冰刃,它能干大部分的检查启动项和进程监控。兵刃功能上的不足,利用其他的软件补充。FileMon和RegMon可以查找针对特定文件和注册表的进程信息;ProceXP可以模块反向查找进程,也可以看出进程之间的调用关系;SSDT—Hook修复,SSDT—Inline—Hook修复工具(兵刃可以看到SSDT,但没有修复功能),但是冰刃也可以看到绝大多数的使用隐藏技术的进程和线程;SRENG可以显示进程、模块、驱动的签名(可以提高我们的效率),以及强大的自启动项检测;SymantecProcessViewer会hook住ntcreateprocess,ntcreateprocessxp,ntopenkey,ntterminateprocess四个SSDT服务函数,会监控开机到当前所有运行过的进程,能起到参考作用;TCPView可以实时查看创建连接和已经连接的端口和相应的进程;MD5计算工具;Mr.Google和百度。具体方法:第一部分看进程(模块,线程)。最笨的木马都有自己的进程,还不隐藏,还起个大家都知道的名字。这个太简单了,简单google一下,用任务管理器都能发现。有些木马本身是修改了或替换了的原有的正常的exe文件,或者系统文件,因此不要完全依赖于进程名字,MD5值还是有必要看下的;有些是隐藏进程的(Rootkit技术,比如Hook在WIN32API或者SSDT的ntquerysysteminfomation),所幸冰刃可以看得到大部分隐藏进程。除此之外,如果木马没有技术来修改文件修改时间,有的木马唯恐别人不认识它,占用内存,CPU很高,向外发包,这些是更笨的木马,任务管理器以及TCPview(发包的)很容易确定进程。高级的木马首先是隐藏自己做的很好的,这些木马只干该干的事情,并且最大程度上减少对系统的影响。我相信用户如果真的中了这个级别的木马,SAV又发现不了,用户就不会找我们,因为他自己也不知道。就怕SAV能发现它(毕竟SAV是自动的,特征码加行为检测),但是又不彻底。因为此类木马很多都会有个影子程序在监控,并恢复被删除的恶意程序。影子程序怎么做?无非是恢复文件,恢复注册表,创建进程,动态注入dll或者线程。如果影子程序本身是一个进程,那我们的目的还是查出这个进程。分别用FileMon;RegMon;冰刃的监控进程创建;动态注入dll首先需要创建被删除的恶意dll文件,用FileMon;线程动态注入我还没找到一个直接根据这个线索找到可疑进程的方法(不清楚冰刃监控进程创建是否可行),不过也可以用稍微笨一点的方法比如枚举所有进程等方法;另外第二部分查看加载项也是可行的,因为影子程序本身也是需要启动的。由于影子程序本身基本上不做恶意行为,本身不包含恶意代码,而应子程序释放的木马文件在影子程序处肯定以加密后的资源形势存在,因此就很难被SAV自动查到了(除非其他用户提交了样本,SRC又加到病毒定义里面,不过把影子程序都加到病毒定义,那病毒定义文件得多大?),因此经常会发生SAV总是在相同的位置发现相同的病毒文件的情况了。如果每个病毒都有自己独立的进程,查木马就是查找进程,那我们就太好做了,但是没有这个么好的事情。相当一部分的木马没有自己独立的进程,只是以模块(绝大多数情况下是dll文件,偶尔有ocx插件)形势注入到系统进程,比如iexplore.exe,explorer.exe,svchost.exe,winlogon.exe,smss.exe,csrss.exe等等。此时做可疑动作的进程就是这些系统进程了,找到这些进程病毒代表我们找到了木马。此时在找到宿主进程文件的前提下,用冰刃查找该进程所调用的模块,可以发现一般有上百个之多,头大了;用symantecprocessviewer比兵刃强点,能查到这些模块对应文件的创建时间;有的杀毒软件的进程读取器(例如KV2007)还可以过滤掉所有microsoft签名的dll文件,这样会方便一些。但是万幸任何一个dll不可能自动注入到某一个进程,或者需要静态加载,或者需要动态加载,或者替换加载。静态加载需要在系统自启动项中有加载的语句(例如rundll32.exe加载,winlogon.exe加载,以服务的形式被svchost.exe加载等等),这些项的查找利用Sreng.exe应该都不难找到。如果是动态加载,那么肯定会有一个进程(模块、线程)运行,做这个dll注入的动作,可以尝试(不能保证)用FileMon或者冰刃的监控进程创建去监控动态加载过程;但是更多的情况下需要从观察进程(模块)以及自启动项来查找,毕竟这个动态加载的命令不是系统给的,一定是有特定的进程(模块,线程)做这个事情,而这个进程本身也是需要加载的,因此也可以使用查找加载项的方法。替换加载通常是把正常的dll改名,然后木马文件本身再改名为原来的正常的dll文件名,这样进程按照规定正常加载就会加载到木马dll文件,而这个木马dll会在宿主进程需要调用该dll的正常功能的时候,会进行函数转发到原来的dll文件,这样也不会影响原来程序的功能,对于此类的注入,手动方法也许能用的也就剩下MD5验证了。提到模块,那就需要提到线程,进程注入型的木马注入到进程中的是一个模块,也就是说,必须有一个模块文件的存在,这样我们可以找到这个模块并通过对其文件进行签名验证来找出注入木马;而线程注入型的木马,注入到进程中的却只是一段代码,是没有文件存在的,虽然可以利用冰刃的查看线程查看每个进程的各个线程,但通过这个想发现并找出哪一个线程是木马的,我估计全世界没多少人。好在线程加载自己本身不能完成,需要加载程序去做这个事情,我们找不到可疑线程,找到可疑的加载程序(进程、模块、线程)也是一样的。记得中学的时候说到的解题方法,在我们TS部门经常会用到两个不同方向的思路,穷举排除法和逆推分析法。就说一个Rtvscan.exe占用CPU高的问题,如果根据经验,查KB,查资料把可能的原因都列出来,然后和用户的情况作比较,最终找到符合情况的一种,这就是穷举排除法;如果对Rtvscan.exe第二部分看加载这个部分我想看过上面的dll注入部分的话会受到一定的启发。任何一种木马不是系统生来就有的,肯定是后天装上的。那这个木马不管是进程还是模块,也是需要启动的,这个启动(也就是加载)过程,想一想也就两种:随着系统启动自己启动,触发某个动作启动。随着系统启动自己启动,大部分的木马会有这种方式,但是路径就五花八门了。最常见的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run有很多的初级木马都会在这里有体现,除此之外此前总结过以下的有可能的系统自启动项加载位置1.Run键Run键是最常见的病毒自启动之处,该键位置是[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]和[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run],其下的所有程序在每次启动登录时都会按顺序自动执行。[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run],也会自动执行。2.RunOnce键[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]和[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce],与Run不同的是,RunOnce下的程序仅会被自动执行一次。3.RunServicesOnce键[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]和[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce],其中的程序会在系统加载时自动启动执行一次。4.RunServices键[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices],RunServices继RunServicesOnce之后启动。5.RunOnceEx键[HKEY_CURRENT_USER\\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx],该键是WindowsXP/2003特有的自启动注册表项,6.windows键[HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows],该键下有load键值,一般情况下其值为空,如果这里有加载自启动程序,则有可能是可疑文件。7.Winlogon键[HKEY_CURRENT_USER\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon]和[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Winlogon],下面的Notify、Userinit、Shell键值也会有自启动的程序,而且其键值可以用逗号分隔,从而实现登录的时候启动多个程序。其中Notify一般为空,Shell一般为Explorer.exe,Userinit一般为C:\WINDOWS\system32\userinit.exe。8.其他注册表位置还有一些其他键值,经常会有一些程序在这里自动运行,如:[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System\Shell],[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad],[HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows