2) 通过文件关联加载 通过文件关联启动的木马病毒有着很强的迷惑性,它的原理是利用Windows提供的双击某一数据文件时,自动打开此数据文件相应的处理程序这一功能,将处理程序偷梁换柱成木马病毒程序,每当用户双击该数据文件希望自动打开处理程序时,启动的恰恰是木马病毒。例如,当用户双击一个.txt文本文件时,可能木马病毒就会替代Windows的记事本程序而自动加载到内存中运行。木马病毒常见的关联加载选项如下: HKEY_CLASSES_ROOT xtfileshellopencommand 关联TXT文件 HKEY_CLASSES_ROOTdllfileshellopencommand 关联DLL文件 HKEY_CLASSES_ROOTexefileshellopencommand 关联EXE文件 HKEY_CLASSES_ROOTcomfileshellopencommand 关联COM文件 HKEY_CLASSES_ROOT atfileshellopencommand 关联BAT文件 HKEY_CLASSES_ROOThtafileshellopencommand 关联HTA文件 HKEY_CLASSES_ROOTpiffileshellopencommand 关联PIF文件 HKEY_LOCAL_MACHINEsoftware xtfileshellopen command 关联TXT文件 HKEY_LOCAL_MACHINEsoftwaredllfileshellopen command 关联DLL文件 HKEY_LOCAL_MACHINEsoftwareexefileshellopen command 关联EXE文件 HKEY_LOCAL_MACHINEsoftwarecomfileshellopen command 关COM联文件 HKEY_LOCAL_MACHINEsoftware atfileshellopen command关联BAT文件 HKEY_LOCAL_MACHINEsoftwarehtafileshellopen command关联HTA文件 HKEY_LOCAL_MACHINEsoftwarepiffileshellopen command关联PIF文件 在上述十四处位置中,“COMMAND”子键的默认键值均应为“%d” %*,如果被改为VirusFileName.exe“%d” %*,则双击以上扩展名文件时,木马病毒VirusFileName将立即自动启动。3) Active-X控件 如果存在:HKEY_LOCAL_MACHINEsoftwareMicrosoft ActiveSetupInstalled componentskeynamestubpath子键,那么该子键的默认值如果是“C:pathtofileVirusFileName.exe”,VirusFileName.exe文件将先于外壳程序和其他任何通过Run键运行的程序执行,这将意味着该木马病毒程序会先于一些杀毒软件进入内存,而导致杀毒软件的失效。 木马病毒的检测 木马病毒一般利用注册表来加载自身,但是通过对注册表的扫描来检测木马是十分困难的。因为木马病毒的文件名可以千变万化,往往同一种木马其文件名可能完全不同,要有效地检测出木马病毒,必须通过动静结合的方法来实现。 静态检测法 目前,实践表明比较有效的静态检测法是首先建立一个完善的病毒特征库,通过提取疑似程序相同部位数据对比病毒特征库中的记录,相同则报警发现病毒,不同则通过检测。但是这种方法的缺点就是检测速度比较慢,如果文件个数较少尚可,一旦文件个数较多则会加大时间开销。这种方法之所以时间开销较大,主要是在特征字符串比较上所开销的时间较多,对于能够寄生在宿主文件中的文件型病毒和蠕虫病毒而言,为保证准确检测病毒,这种特征字符串的比较是必须的,而目前几乎所有的木马病毒都不具备寄生能力,而是以独立文件形式存在,这样就完全可以采用校验码的方法来更快速地实现木马病毒的检测。 校验码检测法是通过对典型木马病毒的可执行文件进行逐字节相加,将得到的16进制数据以排序方式保存在病毒特征库中,检测病毒时只要对疑似文件做同样的逐字节相加操作,然后在病毒特征库中折半查找,如果找到相同的检测码表明被检测文件是木马程序,没有找到则可以通过检测。 同时,为了保证检测的准确性,还可以使用诸如比较文件大小是否相同等一些简单辅助手段来检测。 动态检测法 实践表明仅仅采用静态检测法还很难阻止木马病毒的侵扰,如果木马病毒已经在系统中处于活动状态,那么它可以自行恢复被删除的木马程序文件和启动项,下次开机仍然能得到运行。因此,动态检测法就自然成为静态检测法的有效补充手段了,通过动态检测并清除正在运行中的木马病毒,结合静态删除木马程序文件与启动项,达到彻底清除木马病毒的目的。
(www.dngz.net)版权所有
动态检测法是指对内存中正在运行的进程进行检测,以发现是否有木马病毒正在运行。要想发现运行中的木马程序并不是一件简单的事,因为几乎所有的木马病毒为了防止被检测出来都运用了一些隐藏技术,能够有效地躲避一般的程序包括Windows的任务列表的查看。如果不能查看到内存中运行的木马进程,也就无法对其进行清除,所以找到系统中激活的木马进程是十分关键的。 木马病毒分成服务器端与客户端,在其工作过程中服务器端接受客户端的请求,并将结果返回到客户端中,在工作过程中双方必然要进行通信,因此几乎所有的木马病毒都要利用端口技术来完成通信任务。在同一个系统中相互进行通信的每个进程都要分配一个唯一的端口号,端口号不能重复,也就是端口号与进程之间具有一一对应的关系,这一点正如人类的指纹一样,通过对端口号的甄别可以达到识别运行中的不同进程的目的。 但是如何能够区分利用端口进行通信的进程是用户合法进程还是木马进程呢?目前,大多数杀毒软件通过在系统中搜索被打开的端口号,并与已知的木马病毒特征端口号加以比较来判断是否有木马正在活动。这种方法对付使用静态端口号的木马病毒十分有效,但是新出现的一些木马病毒为了躲避杀毒软件的检测,使用了一种动态端口号技术,这种技术允许木马的使用者自行指定工作端口号。例如,较新版本的冰河就可以由用户自行指定运行时的端口号。这就使静态检测端口号的方法无法有效检测出木马病毒。 要对付这样的木马病毒必须使用动态的端口检测表技术,我们称其为—黑白端口检测技术。这种技术是利用黑白两张端口表来对使用端口的进程进行过滤检查,如果进程使用的端口号在白表中,表明是合法进程,其通信不受任何阻碍;但是如果进程使用的端口号出现在黑表中,表明该进程很可能是非法进程,必须将该进程杀死。要达到有效检测木马病毒的目的,创建合适的黑白端口表十分重要。黑白端口表的创建可以分成两部分,预先可以先将已知的木马病毒通常使用的端口号设置到黑表中;将已知的合法进程如:数据库系统、IE、Outlook、FTP、Telnet等常用的端口号放入白表中,使用顺利通过访问。在系统运行过程中一旦发现有进程要求使用端口号进行通信,而该端口号又不在黑白表中,即向用户发出询问,由用户根据实际情况来决定将该端口号放入白表或黑表中。一般来说,如果用户正在启动一个网络程序,此时发出端口号查询是正常的,可以将该端口号记录在白表中;但是如果用户没有进行任何操作,而突然出现端口号查询就必须仔细检查到底是何进程需要通信,如果进程的文件名十分陌生,为安全起见可以先将其放入黑表中,如果以后发现的确是合法进程,可以通过手工的方法将端口号从黑表中移动到白表中。木马病毒的清除 通过前述可知,枚举出系统中所有进程以及它们所打开的端口,这完成木马病毒的检测与清除工作的关键任务。要做到这一点方法有多种,但最简单的就是调用NTDLL.dll中的几个未公开API,如NtQuerySystemInfomation,NtQueryInfomationProcess。其中NtQuerySystemInfomation函数提供了一个简单的途径以获得系统中所有的HANDLE(句柄),只要找到系统中的SOCKET句柄,就可以通过这个句柄得到该进程所使用的端口号,这样就完成了进程与端口之间的关联,我们正是通过这种关联来判断一个进程是否为木马进程。NtQuerySystemInfomation函数的原型如下: DWORD NtQuerySystemIn[form]ation( DWORD dwRecordType, PDWORD pdwHandleList, DWORD dwNumBytes, PDWORD pdwNumBytesRet ); 其中,第一个参数dwRecordType用于指定所要查询的系统信息类型,为了查询系统HANDLE列表,此项参数要设置为16,此数值是来自网上资料,由于这个函数是未公开函数暂时无法得到更详细的资料,第二个参数是一个指针,用来返回系统句柄列表,在调用函数之前,必须为这个指针分配足够的内存空间,否则函数调用会出错;第三个参数是指定为HandleList预先所分配的内存空间大小,单位是byte;第四个参数是函数调用后返回的HandleList的大小,如果函数调用成功,返回值将是0,否则可以使用GetLastError()获得详细的错误代码。 一旦NtQuerySystemIn[form]ation函数调用成功,系统中所有的句柄将被存放在pdwHandleList所指向内存空间中,其中,pdwHandleList所指向的第一个32位数,是这个缓冲区所包含的句柄数量,之后是顺序排列的句柄指针pHandleInfo,指向的是HANDLEINFO结构。HANDLEINFO结构定义如下: typedef struct _HandleInfo { USHORT dwPid; USHORT CreatorBackTraceIndex; BYTE ObjType; BYTE HandleAttributes; USHORT HndlOffset; DWORD dwKeObject; ULONG GrantedAccess; }HANDLEINFO, *PHANDLEINFO; 这个结构定义表明,句柄信息中包括了句柄所属进程的PID,只要获取句柄信息可以关联进程和端口了。不过,在NT系统中包含有各种各样的句柄:进程句柄、令牌句柄、文件句柄、窗口句柄……怎样才能判断出一个句柄究竟是不是SOCKET句柄呢?这就要通过HANDLEINFO结构中的ObjType属性了,根据已有资料分析,SOCKET句柄的类型值为0x1A,所以,只要将所有类型为0x1A的句柄取出,进行GetSockName操作就可以得到当前的进程/端口对应列表。不过此时我们得到的句柄都是属于其他的进程,根据在NT系统中进程保护的原则,一个进程不能够直接得到其他进程的各种信息,特别是句柄,不同进程中的同一句柄(句柄的数值相同)可能有完全不样同的意义。因此,得到SOCKET句柄后还必须进行一次转换,将其他进程的句柄转换为本进程的句柄,这个转换工作只要简单地调用DuplicateHandle函数就可以完成了。DuplicateHandle函数的调用方法略。 这样才可以通过getsockname、getsockopt等函数来获得SOCKET的各种属性了。示例代码段如下: ...... sockaddr_in name = {0}; name.sin_family = AF_INET; int namelen = sizeof(sockaddr_in); SOCKET s = (SOCKET)hMyHandle; char szSockType[6][6] = { "NUL", "TCP", "UDP", "RAW", "RDM","SEQ" }; iRet = getsockname( s, (sockaddr*)&name, &namelen ); if ( iRet != SOCKET_ERROR ) { int sockType = 0; int optlen = 4; iRet = getsockopt( s,SOL_SOCKET, SO_TYPE, (char*)&sockType, &optlen ); printf("PID=M PORT=] %s ",pHandleInfo->dwPid, ntohs( name.sin_port ), szSockType[sockType] ); } ...... 得到系统中正在运行的进程与其打开的端口信息后,就可以通过病毒库并结合黑白端口表来决定什么进程应该清除,什么进程可以放行了。 近来,在网上不断有新型木马病毒出现,有些可以隐藏到DLL或正常程序;有些则改变通信方式,进程间不再通过端口进行联系,而将要传递的信息嵌入到IGMP包中发出,以躲避杀毒软件的检测与清除,由于要编制这样的木马病毒程序有相当的难度,并非一般的编程爱好者可以胜任,因而这样的木马病毒还比较少见。但这意味着,木马病毒的检测与清除将是一个长期的话题。本文浅述了木马病毒的工作原理与其基本的检测与清除方法,希望能有助于读者的研究、学习,同时欢迎大家一块探讨木马病毒的预防与清除技术。好文章!学习学习