木马病毒,木马病毒的全面解剖

木马病毒的全面解剖 - 故障解答 - 电脑教程网

木马病毒的全面解剖

日期:2006-12-08   荐:
.Wxu211 近年来,随着社会及家庭网络应用的大量普及,计算机信息安全越来越成为人们重视与关心的焦点问题。在用户享受宽带网络带来的便利与快捷的同时,也为各类严重威胁计算机信息安全的病毒提供了方便之门。据有关部门连续三年调查表明,2001年约73%的计算机用户曾感染过病毒,其中,感染三次以上的用户高达59%;到了2002年,受感受的用户上升到近84%;2003年上半年又增加到85%,并呈现出继续上升趋势。 在众多病毒当中,木马病毒由于具备能够隐蔽地随时向外发送指定信息,甚至具备远程交互能力而成为黑客们钟爱的后门工具。然而对于用户而言,木马病毒的危害是巨大的,它使用户的计算机随时暴露于黑客的控制监视之下,黑客们可以轻易地窃取自己感兴趣的数据并传输到指定的计算机中,这较之传统病毒只能破坏用户数据的危害又大了许多。因此,有效地检测与清除木马病毒对保障计算机信息安全有着重要意义。 为了帮助大家了解、清除并预防木马病毒,我们特别组织了这个小专题,和大家一起关门杀“马”,清除后患。 木马长什么样子? 木马病毒程序又称特洛伊木马程序,在Internet标准中对特洛伊木马程序的定义是:特洛伊木马程序是一种程序,它能提供一些有用的,或是仅仅令人感兴趣的功能,但是它还有用户所不知道的其他的功能,例如在你不了解的情况下拷贝文件或窃取你的密码。从该定义中我们可以清楚地知道木马程序通常在提供一些功能的同时还在后台隐藏着另外一些不被用户所知的功能,而这些隐藏的功能才是木马程序真实的目的。 木马病毒程序一般分为服务器端和客户端两个部分,服务器端程序一般被伪装成具有吸引力的软件,欺骗用户运行并在运行后自动安装在受害者计算机中,以后程序将随该计算机每次运行而自动加载。而客户端一般安装在控制者计算机中。当客户端启动后就会在网络中扫描远程主机上事先约定好的端口,这时如果服务器端正在运行就会与客户端连接上,随后服务器端将在被控计算机中接受并执行客户端发出的各种指令,并向客户端返回数据。 成功进入被控主机的木马病毒程序通常首先要想方设法为自己下次的运行做好准备,这时寻找一处能够让自身在下次开机时能够自动启动的地方是大多数木马程序要进行的一项重要工作。能够实现这个要求的方法有许多种,比如将执行程序文件名登记在程序菜单中的启动项就可以让该程序每次在开机后随Windows自动运行,但是在这样的地方很容易被用户查觉并清除。因此,木马程序会寻找一些更为隐蔽的地方藏身。 木马程序作为一种病毒与其它的病毒程序一样都需要在运行时隐藏自己的行踪,然而与传统的文件型病毒寄生于正常可执行程序体内,通过寄主程序的执行而执行的方式不同,大多数木马程序都有一个独立的可执行文件。在Windows系统中,每一个正在运行中的程序在任务列表中都会被列出其进程号与模块名,因而一旦木马程序执行就会在系统中有迹可寻。但目前更新、更隐蔽的方法已经出现,那就是驱动程序及动态链接库技术。驱动程序及动态链接库技术和一般的木马不同,它基本上摆脱了原有的木马监听端口工作模式,而采用替代系统文件的方法,即改写驱动程序或动态链接库。这样做的结果是:系统中没有增加新的文件、不需要打开新的端口(所以不能用端口监视的方法查杀)、没有新的进程(所以使用进程查看的方法发现不了它,也不能用kill进程的方法终止它的运行),因此使用简单的文件扫描法、端口监视、进程扫描等现有技术,均无法有效检测与清除该木马病毒。这种新型的木马病毒,正常运行时几乎没有任何的症状,而一旦木马的控制端向被控端发出特定的信息后,隐藏的程序就立即开始运作。此时只有通过停止一切网络访问后,动态监视网络数据流来检测是否有木马病毒正在运行,或利用微软的“动态链接库数字签名”技术静态扫描系统文件,以发现是否有系统文件被篡改。      木马病毒藏在哪里?目前,大多数的木马病毒程序为达到下次随计算机启动而自动加载的目的,一般都会将自身隐藏于系统的一些启动项中,利用Windows系统在启动过程中会自动加载某些特定位置所指向的程序的特点,达到每次跟随系统启动而加载的目的。木马病毒最常见的几种隐藏方式有以下几种: 1、 Win.ini文件 在Win.ini文件中的[Windows]字段中,包含“Load=”和“Run=”两项,通常情况下此两处均应为空,如果发现后面跟的路径与文件名是不熟悉的文件,很有可能就是木马程序了。当然,也有一些木马病毒会将自己伪装成大家十分熟悉的名字,而诱使你上当,如“AOL Trojan”木马,它把自身伪装成command.exe文件,如果不注意可能不会发现它不是真正的系统启动文件。 2、 System.ini文件 在System.ini文件的[386Enh]字段中,可以通过增加“Driver=路径程序名”的方式,使指定的程序随Windows的启动而自动加载。 3、 启动加载文件 Windows 98/ME在启动时,也会加载Winstart.bat和Autoexec.bat文件中的程序,当系统以命令行方式启动时,会加载Dosstart.bat和Autoexec.bat文件中的程序。由于现在很少有程序会通过这三个文件自动加载,所以通常只要将这三个文件内容清空即可。当然,通过这种方式启动的木马病毒程序也十分少见,毕竟这里并不是利于藏身的好地方。 4、 隐藏真实程序扩展名 由于大量的宣传,用户已经逐渐了解到随意执行一些程序,可能会对计算机系统带来灾难性的后果。因此,当用户不能确定一个程序的来源与功能时,可能不会轻易地执行它,而数据文件包括文档文件的打开是相对安全的,因此可能会毫不犹豫地打开它。然而,有些木马病毒正是通过将自己的.exe、.com等程序文件扩展名隐藏起来,伪装成一个.txt或.jpg的数据文件来欺骗用户,当用户双击打开这种文件时,一个潘多拉盒子也就被打开了。在Windows系统的默认情况下,已知文件类型的扩展文件名是不显示出来的,为了了解一个文件的真实后缀名,建议用户取消“隐藏已知文件类型的扩展名”前的复选框。设置方法为:打开“我的电脑”,点击“工具->文件夹选项”,在打开的对话框中点击“查看”,取消“隐藏已知文件类型的扩展名”前的复选框即可。 5、注册表 注册表内浩如烟海的分支与数据,在Windows系统流行近十年后的今天仍然给人一种神秘的印象。正是由于注册表数据繁杂、重要,任何的错误修改都有可能导致系统的故障,用户往往不敢或很少主动去操作注册表,因而这里也成为木马病毒最好的藏身所在。注册表中有许多地方能够让木马病毒实现自动加载,目前,大多数查杀木马病毒的程序都将注册表视为一个检测的重点区域。 1) 随系统启动加载 HKEY_LOCAL_MACHINESoftwareMicrosoftWindows CurrentVersionRun HKEY_LOCAL_MACHINESoftwareMicrosoftWindows CurrentVersionRunOnce HKEY_LOCAL_MACHINESoftwareMicrosoftWindows CurrentVersionRunOnceEx HKEY_LOCAL_MACHINESoftwareMicrosoftWindows CurrentVersionRunServices HKEY_LOCAL_MACHINESoftwareMicrosoftWindows CurrentVersionRunServicesOnce HKEY_CURRENT_USERSoftwareMicrosoftWindows CurrentVersionRun HKEY_CURRENT_USERSoftwareMicrosoftWindows CurrentVersionRunOnce  .

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包中发出,以躲避杀毒软件的检测与清除,由于要编制这样的木马病毒程序有相当的难度,并非一般的编程爱好者可以胜任,因而这样的木马病毒还比较少见。但这意味着,木马病毒的检测与清除将是一个长期的话题。本文浅述了木马病毒的工作原理与其基本的检测与清除方法,希望能有助于读者的研究、学习,同时欢迎大家一块探讨木马病毒的预防与清除技术。

好文章!学习学习

标签: