1、常见木马技术和手动检测方法所有病毒 case, Symantec 用户抱怨的无非两项,一是查不到病毒,二是不断的查到相同的病毒(绝大多数是木马 downloader, backdoor.trojan)。木马是什么?是一个有恶意行为程序。杀毒软件怎么查杀它?特征码和行为分析。如果一个木马在技术上或者创意上做的稍微好些,我觉得杀毒软件对于已经中毒的电脑很难起到作用,经常是查到了一部分,落掉一部分,而落掉的部分又会监控、恢复被查杀的部分,造成上面所说的第二种情况,而这又一定会包含第一种情况。木马既然是程序,恶意程序,那它运行也不免会露出蛛丝马迹,程序运行的两个必要条件进程(模块,线程)和加载(自启动
2、和触发)。那我们查找木马也从这两个大的方向入手,理论上可以找出所有木马,但是这跟做数学题一样,大方法是有的,但是操作过程千变万化的。工欲善其事,必先利其器。首先要找几个适合自己的工具:主工具我个人喜欢用冰刃,它能干大部分的检查启动项和进程监控。兵刃功能上的不足,利用其他的软件补充。FileMon 和 RegMon 可以查找针对特定文件和注册表的进程信息;ProceXP 可以模块反向查找进程,也可以看出进程之间的调用关系;SSDTHook 修复,SSDT InlineHook 修复工具(兵刃可以看到 SSDT,但没有修复功能),但是冰刃也可以看到绝大多数的使用隐藏技术的进程和线程;SRENG 可
3、以显示进程、模块、驱动的签名(可以提高我们的效率),以及强大的自启动项检测;Symantec Process Viewer 会 hook 住 ntcreateprocess, ntcreateprocessxp, ntopenkey, ntterminateprocess 四个 SSDT 服务函数,会监控开机到当前所有运行过的进程,能起到参考作用;TCPView 可以实时查看创建连接和已经连接的端口和相应的进程;MD5 计算工具;Mr.Google 和百度。具体方法:第一部分看进程(模块,线程)。最笨的木马都有自己的进程,还不隐藏,还起个大家都知道的名字。这个太简单了,简单 google 一下
4、,用任务管理器都能发现。有些木马本身是修改了或替换了的原有的正常的 exe 文件,或者系统文件,因此不要完全依赖于进程名字,MD5 值还是有必要看下的;有些是隐藏进程的(Rootkit 技术,比如 Hook 在 WIN32API 或者 SSDT 的 ntquerysysteminfomation),所幸冰刃可以看得到大部分隐藏进程。除此之外,如果木马没有技术来修改文件修改时间,有的木马唯恐别人不认识它,占用内存,CPU 很高,向外发包,这些是更笨的木马,任务管理器以及 TCPview(发包的) 很容易确定进程。高级的木马首先是隐藏自己做的很好的,这些木马只干该干的事情,并且最大程度上减少对系统
5、的影响。我相信用户如果真的中了这个级别的木马,SAV 又发现不了,用户就不会找我们,因为他自己也不知道。就怕 SAV 能发现它(毕竟 SAV 是自动的,特征码加行为检测),但是又不彻底。因为此类木马很多都会有个影子程序在监控,并恢复被删除的恶意程序。影子程序怎么做?无非是恢复文件,恢复注册表,创建进程,动态注入 dll 或者线程。如果影子程序本身是一个进程,那我们的目的还是查出这个进程。分别用FileMon;RegMon ;冰刃的监控进程创建;动态注入 dll 首先需要创建被删除的恶意 dll 文件,用 FileMon;线程动态注入我还没找到一个直接根据这个线索找到可疑进程的方法(不清楚冰刃监
6、控进程创建是否可行),不过也可以用稍微笨一点的方法比如枚举所有进程等方法;另外第二部分查看加载项也是可行的,因为影子程序本身也是需要启动的。由于影子程序本身基本上不做恶意行为,本身不包含恶意代码,而应子程序释放的木马文件在影子程序处肯定以加密后的资源形势存在,因此就很难被 SAV 自动查到了(除非其他用户提交了样本,SRC 又加到病毒定义里面,不过把影子程序都加到病毒定义,那病毒定义文件得多大?),因此经常会发生 SAV 总是在相同的位置发现相同的病毒文件的情况了。如果每个病毒都有自己独立的进程,查木马就是查找进程,那我们就太好做了,但是没有这个么好的事情。相当一部分的木马没有自己独立的进程,
7、只是以模块(绝大多数情况下是 dll 文件,偶尔有 ocx 插件)形势注入到系统进程,比如 iexplore.exe, explorer.exe, svchost.exe, winlogon.exe, smss.exe, csrss.exe 等等。此时做可疑动作的进程就是这些系统进程了,找到这些进程病毒代表我们找到了木马。此时在找到宿主进程文件的前提下,用冰刃查找该进程所调用的模块,可以发现一般有上百个之多,头大了;用 symantec process viewer 比兵刃强点,能查到这些模块对应文件的创建时间;有的杀毒软件的进程读取器(例如 KV2007)还可以过滤掉所有 microsoft
8、 签名的 dll 文件,这样会方便一些。但是万幸任何一个 dll 不可能自动注入到某一个进程,或者需要静态加载,或者需要动态加载,或者替换加载。静态加载需要在系统自启动项中有加载的语句(例如rundll32.exe 加载, winlogon.exe 加载,以服务的形式被 svchost.exe 加载等等),这些项的查找利用 Sreng.exe 应该都不难找到。如果是动态加载,那么肯定会有一个进程(模块、线程)运行,做这个 dll 注入的动作,可以尝试(不能保证)用 FileMon 或者冰刃的监控进程创建去监控动态加载过程;但是更多的情况下需要从观察进程(模块)以及自启动项来查找,毕竟这个动态加
9、载的命令不是系统给的,一定是有特定的进程(模块,线程)做这个事情,而这个进程本身也是需要加载的,因此也可以使用查找加载项的方法。替换加载通常是把正常的 dll 改名,然后木马文件本身再改名为原来的正常的 dll 文件名,这样进程按照规定正常加载就会加载到木马 dll 文件,而这个木马 dll 会在宿主进程需要调用该 dll 的正常功能的时候,会进行函数转发到原来的 dll 文件,这样也不会影响原来程序的功能,对于此类的注入,手动方法也许能用的也就剩下 MD5 验证了。提到模块,那就需要提到线程,进程注入型的木马注入到进程中的是一个模块,也就是说,必须有一个模块文件的存在,这样我们可以找到这个模
10、块并通过对其文件进行签名验证来找出注入木马;而线程注入型的木马,注入到进程中的却只是一段代码,是没有文件存在的,虽然可以利用冰刃的查看线程查看每个进程的各个线程,但通过这个想发现并找出哪一个线程是木马的,我估计全世界没多少人。好在线程加载自己本身不能完成,需要加载程序去做这个事情,我们找不到可疑线程,找到可疑的加载程序(进程、模块、线程)也是一样的。记得中学的时候说到的解题方法,在我们 TS 部门经常会用到两个不同方向的思路,穷举排除法和逆推分析法。就说一个 Rtvscan.exe 占用 CPU 高的问题,如果根据经验,查KB,查资料把可能的原因都列出来,然后和用户的情况作比较,最终找到符合情
11、况的一种,这就是穷举排除法; 如果对 Rtvscan.exe第二部分看加载这个部分我想看过上面的 dll 注入部分的话会受到一定的启发。任何一种木马不是系统生来就有的,肯定是后天装上的。那这个木马不管是进程还是模块,也是需要启动的,这个启动(也就是加载)过程,想一想也就两种:随着系统启动自己启动,触发某个动作启动。随着系统启动自己启动,大部分的木马会有这种方式,但是路径就五花八门了。最常见的HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun有很多的初级木马都会在这里有体现,除此之外此前总结过以下的有可能的系统自启动项加载位置1
12、.Run 键Run 键是最常见的病毒自启动之处,该键位置是HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRun和HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun,其下的所有程序在每次启动登录时都会按顺序自动执行。 HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun和 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentV
13、ersionPoliciesExplorerRun,也会自动执行。2.RunOnce 键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunOnce和 HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunOnce,与 Run 不同的是, RunOnce 下的程序仅会被自动执行一次。3.RunServicesOnce 键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServicesOnce和 HKE
14、Y_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRunServicesOnce,其中的程序会在系统加载时自动启动执行一次。4.RunServices 键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunServices和 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunServices, RunServices 继 RunServicesOnce 之后启动。5.RunOnceEx 键HKEY_CURRE
15、NT_USERSOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx和HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx,该键是 Windows XP/2003 特有的自启动注册表项,6.windows 键HKEY_CURRENT_USERSoftwareMicrosoftWindowsNTCurrentVersionWindows,该键下有 load 键值,一般情况下其值为空,如果这里有加载自启动程序,则有可能是可疑文件。7.Winlogon 键 HKEY_CURRENT_
16、USERSOFTWAREMicrosoftWindows NTCurrentVersionWinlogon和 HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon,下面的 Notify、Userinit 、Shell 键值也会有自启动的程序,而且其键值可以用逗号分隔,从而实现登录的时候启动多个程序。其中 Notify 一般为空,Shell 一般为 Explorer.exe,Userinit 一般为 C:WINDOWSsystem32userinit.exe。8.其他注册表位置还有一些其他键值,经常会有一些程序在这
17、里自动运行,如:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystemShell,HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionShellServiceObjectDelayLoad,HKEY_CURRENT_USERSoftwarePoliciesMicrosoftWindowsSystemScripts,HKEY_LOCAL_MACHINESoftwarePoliciesMicrosoftWindowsSystemScripts 。Syman
18、tec 的 KB 中也有检查注册表,查找可疑文件的方法:Title: Common loading points for viruses, worms, and Trojan horse programs on Windows NT/2000/XP/2003Document ID: 2001060517115206 Web URL: http:/ Common loading points for viruses, worms, and Trojan horse programs on Windows 98/95/3.1xDocument ID: 1999052415383948 Web UR
19、L: http:/ Possible loading points for viruses and security risks on computers that run Red Hat Enterprise Linux and SuSE LinuxDocument ID: 2005101812364548 Web URL: http:/ win.ini 文件和 system.ini 文件。Win.ini 位于 C:Windows 下 ,其windows 字段中有启动命令“load=” 和“run=”,通常“=”后面是空白的,如果后面跟着程序,很可能就是病毒程序。System.ini 位于
20、C:Windows 下,其boot 字段一般为 shell=Explorer.exe 如果后面跟着程序,很可能就是木马程序; 其386Enh字段内的“driver=路径程序名” ,也有可能有病毒程序加载项;其mic、drivers、drivers32三个字段,也有可能有病毒程序加载项。4)其他方法:可以通过查找 msconfig,以及查看服务中的 automatic 的服务的方法,有时也可以找出可疑文件。其实从实际当中的例子来看,除了上面的HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionRun之外,HKEY_LOCAL_MACHI
21、NESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon 也是最近很多木马自启动加载的地方。除此之外,很重要的自启动方式服务启动。所有的服务启动项都会在HKEY_LOCAL_MACHINESYSTEMCurrentControlSetService 下面列出来,但是基本上看起来没什么头绪。这些服务自启动又会分为 win32 服务应用程序和驱动程序,用 SRENG 可以很清楚的看出这两部分。Win32 服务应用程序就是系统当中管理工具服务里面的内容,包括 Symantec Antivirus服务。其主文件可以是单独的 exe 文件,例如 rtvsca
22、n.exe;也可以是一个 dll 文件,会被svchost.exe 进程调用而自动启动(svchost.exe 的作用就是用同一个进程提供不同的系统或者非系统的服务,从而节省系统资源;而这恰好也成了很多木马很好的自启动加载点,很多时候我们看到 svchost.exe 做一些异常的事情,或者从冰刃的创建进程查看看到svchost.exe 创建木马进程,肯定就是有恶意的 dll 以 win32 服务的形势被 svchost.exe 加载)。驱动程序启动也是很多木马(驱动级木马)自启动加载的地方。首先自启动加载首先需要一个 sys 文件,通常位置是 C:windowssystem32drivers
23、目录里面;另外会在控制面板设备管理器非即插即用设备里面会有该设备驱动的信息。SAV 的 SAVRT 驱动,SEP 的sysplant 驱动都是此类。对于此类的木马,我们往往需要在先关掉保护进程的前提下,卸载该设备,删除注册表,在删除 sys 文件。以上是自启动木马,除此之外是触发式木马。触发式木马是当你进行某一操作时会触发木马的启动机制,使得木马启动,如果你永远不进行这一操作,而木马则永远不会启动。这样,事实上对于自启动木马,我们仔细查找各个启动项,总能找到蛛丝马迹;不过触发是木马就可以充分发挥作者的想象空间了,对我们来说也是更大的挑战。最常见的也是我们首先要检查的当然就是 Autorun.i
24、nf 了,这个臭名昭著,一般都会关联到同一个目录下的一个 exe 文件。通常此文件会以隐藏文件的形式出现,更有些恶毒的会加上“注册表监控并回写”来为文件隐藏护航,你一旦更改系统为“显示所有文件”,它马上会再次改为“不显示隐藏文件”。更有甚者,很多最新的木马对这个 autorun.inf 和关联的 exe 文件使用rootkit 技术,隐藏的更为隐蔽。处理方法:使用冰刃,它可以显示所有的隐藏文件大部分的使用的 rootkit 保护的文件,由于 autorun.inf 和关联的 exe 文件通常都是木马的安装文件,大可直接删除。删除后,隐藏文件恢复到注册表HKLMSoftwareMicrosoft
25、WindowsCurrentVersionExporlerAdvancedFolderHiddenShowAll 下的 checkvalue 值改为 1。另外 autorun.inf 修改了硬盘的打开属性,删除后盘附打不开,在注册表中搜索该 exe 文件名称,找到后删除。另一种常见的触发方式是修改文件关联。文件关联就是某一类型的文件与某一程序的对应关系,我们的系统中有无数种文件格式,比如:图片文件(以.bmp .jpg .gif 等为扩展名)、音乐文件(mp3 mp4 等).当你双击一个图片时,系统会调用看图程序来打开并显示图片,而不是调用播放器来播放图片,系统为什么会知道要调用看图程序而不是
26、调用播放器呢?这就是因为文件关联的存在,在注册表中,图片文件已经与看图程序关联在了一起,相应的,音乐文件与播放器关联在了一起,大多数类型的文件都与某一特定程序有关联。这样,系统才知道,打开什么样的文件需要调用什么程序。木马就是把某一特定类型文件的关联改为了与它自己关联,这时你一旦打开这一类型的文件就会触发木马的启动。由于木马启动后,会由它再调用正常的关联程序,所以,文件仍然会正常打开,而你也就不知道其实你的操作已经将木马启动了起来。木马会改哪种文件的关联呢?这只有木马的作者才知道。系统中又有多少文件关联可供它改呢?HKEY_CLASSIS_ROOT 下的子项全部都是,怎么也得上千个吧。这样,只
27、要你打开被关联格式的文件,就会触发木马,一般该木马还会指向到原来的关联进程,这个文件也可以正常打开,因此用户是注意不到的。如果这个木马的关联文件是一个影子程序的话,那由于影子程序不具备病毒特征,所以 SAV 全面扫描也不会将它找出来,你找到并清除的都是影子程序的释放体,这就又会造成总是在相同的位置发现相同的病毒了。如何检查文件关联,找个进线程监控的工具程序,例如冰刃的“创建进程监控”或者 FileMon,然后不断的打开你常用的各种文件,并检查打开文件时程序的运行情况,比如:你找开了个.rar 文件,进程监视中应该显示,“WinRAR.exe 由 Explorer.exe 启动运行”,那是正常的
28、。如果显示的是其它程序由 Explorer.exe 运行,而 WinRAR.exe 又是由那个其它程序来启动的,那就是被改了。当然,也可以打开注册表查看每个文件关联,是否是正常的。这个方法理论上可行,但是那么多的文件关联如何能检查完?因此打开例如冰刃的“创建进程监控”或者 FileMon,然后等待木马再次出现,观察这段时间内的所有的创建和被调用的进程会更有效。找到文件关联后,清除恶意文件后最好还要找个正常的机器导出一份正常的相应的文件关联注册表项,导入到有问题的电脑;如果是非系统的文件关联相对来说还好办,例如 rar 压缩文件,直接删除恶意文件,然后再次找开 rar 时,会提示你选择打开此种类
29、型文件的程序,这时选择 WinRar.exe,然后勾选上总是用这种程序来打开此类型文件就可以了。除此之外,还有些触发并不是很明显的文件操作,比如当你打开的网站时,可能要解释执行脚本语言,而用什么来解释执行呢?系统也是在注册表中寻找相应程序的,比如:VBS、JScript 等键,基本都在 HKEY_CLASSES_ROOT 主键下。有些杀毒程序比如金山毒霸会用自己的 DLL 在这几个键下注册,以便执行脚本语言时先行检查这些脚本语言是否具有病毒特征。但反过来木马同样也会利用这几个键,让用户一打开网站就执行木马。当然 BHO也可以让用户一打开网站就执行木马;某些 ARP 欺骗也可以达到这个效果。总之,兵无常势,水无常形,大家还是多发挥创造性思维,欢迎大家分享自己在这方面的经验。