打印

[其他] 浅谈木马

浅谈木马

还记得在2003年11月下旬,许多计算机都开始感染一种名为“PWSteal.Lemir.Gen”的病毒,这是一个盗取《传奇》密码的木马程序。截止笔者写稿时,大多数防毒软件还只能发现病毒文件是“C:\Windows\system32\sysmodule32.dll”,却不能杀除。 这是因为有一个病毒进程正在调用它,而且即使在DOS下将其删除,病毒进程仍能将其恢复。所以问题的关键就是找到病毒进程并停止它。使用“Ctrl+Alt+Del”启动Windows任务管理器,查看所有进程后发现系统中居然有两个“Explorer.exe”的进程!大家恐怕都遇到过“Explorer崩溃”的错误,所以“Explorer.exe”是系统进程的事实早已广为人知,这样一来就很容易让病毒蒙混过关。比较两个“Explorer.exe”进程,发现它们的名称显示、用户名等信息都一模一样。但据经验可知,正常的“Explorer.exe”进程通常会占用10MB或更多内存,所以其中占用内存较小的那个“Explorer.exe”(约4MB)就是病毒进程。
 右键单击病毒进程选择“结束进程”,这时再删除“Sysmodule32.dll”,果然成功。但令人沮丧的是,不久它又被恢复了,看来只有先找到这个病毒进程对应的可执行文件的位置并删除它,才能彻底根治。然而Windows任务管理器没有这个能力。所以我们要借助第三方进程管理软件,这里向大家推荐Process Explorer,下载地址:http://nj.onlinedown.net/soft/19289.htm(v8.10,388kB,免费软件),在Process Explorer界面中双击病毒进程显示“Explorer.exe”位于“C:\Windows\system32\”,通常木马程序都是隐藏和只读属性,为了能看到它,请打开“我的电脑”,选择“工具”→“文件夹选项”→“查看”标签,勾选“显示所有文件和文件夹”。这下木马程序终于显身了,原来它的名字是“Expl0rer.exe”(中间那个字符是数字“0”,而不是字母“o”)!找到“元凶”,下面就可以开始行动了:
 1.如果使用的是Windows XP,右键单击“我的电脑”→“属性”,选择“系统还原”标签,关闭系统还原。
 2.启动Windows任务管理器,关闭“Expl0rer.exe”进程;
 3.根据文件“Expl0rer.exe”的日期属性,搜索“Sysmodule32.dll”的备份,在“C:\Windows\system32\”下找到“Sysmodule64.dll”。
 4.删除“Sysmodule32.dll”、“Expl0rer.exe”和“Sysmodule64.dll”这3个文件。
 5.删除注册表中所有关于“Expl0rer.exe”的键值。
 从这个实例可以看出,一个普通的单进程木马是不可能在任务管理器中“隐身”的,因此大多数单进程木马的“诡计”是对进程名进行伪装。通常的伪装手段是将进程名改为类似于某个系统进程的名称,如“Falling Star”木马程序的进程名为“Internet.exe”,与输入法进程名“Internat.exe”只差一个字母。上文中的例子就更巧妙了,因为字母“o”与数字“0”在进程管理器中看起来是完全一样的。另一类方法是将木马程序的文件名改成系统中某文件的名称,而扩展名不变。如著名的冰河木马服务端进程名“Kernel32.exe”就和Win9X中的“Kernel32.dll”系统文件名一样。最后一类是木马进程名与系统进程名毫无区别,只是存放位置不同,如“蓝色代码”的进程名就和“Svchost.exe”系统进程完全一样。
 那么如何辨识操作系统中“系统进程”的真伪呢?答案只有一个,就是用户必须清楚,正常情况下自己系统中都有哪些进程。应用程序的进程是比较容易“对上号”的,关键是系统进程,Windows XP正常运行必须有若干基础进程,它们分别是“Smss.exe、“Csrss.exe”、“Winlogon.exe”、“Services.exe”、“Lsass.exe”、“Svchost.exe”(一般有4个或更多)、“Spoolsv.exe”、“Explorer.exe”和“System Idle Process”,这些进程是无法关闭的。另外,Windows XP正常运行所需的8个基本服务,我们也应该认识(见2003年第18、19期《大众软件》中的“Windows XP服务详解”一文),认识系统进程和服务及它们之间的关系是辨别真伪的基础,再配合像“Process Explorer”这样的工具,发现可疑进程就简单多了。
二、我是流氓我怕谁!——多进程木马的霸道
 从技术的角度讲,多进程木马又分为:延时多进程木马和同时多进程木马。前者的代表应属“黑洞2001”,而后者的典型则是“生日快乐”。那么这两种多进程木马究竟比单进程木马高明在何处?这需要先了解这两个木马的进程特点。
 “黑洞2001”运行后通常在系统中保持一个进程(默认的进程名为“Windows.exe”,定制者可自定义),并将“Windows.exe”添加到注册表“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows \CurrentVersion\RunServices”中,开机后“Windows.exe”就会打开默认的“2001”端口开始工作。相信看过第一部分的读者很容易发现这个可疑进程,但使用通常方法并不能彻底删除它。因为“Windows.exe”并不是直接与进程关联,而是暗中还有另一个执行文件在起作用,它用于恢复“Windows.exe”文件,操作完成后就立刻从任务管理器中消失,所以很难察觉。那么,我们究竟如何追查“黑洞2001”的第二进程呢?
 虽然无法直接找到那个神秘的执行文件,但可以通过监视“Windows.exe”的方法顺藤摸瓜。道理很简单:当X文件被操作时,第二进程启动并恢复“Windows.exe”,那么这个X文件的类型就是与神秘程序相关联的文件类型。推荐使用“Windows超级监视”工具,下载地址:http://nj.onlinedown.net/soft/19289.htm(v3.0,171kB,免费软件),它能实时监视硬盘上任何文件操作,并及时闪烁务栏按钮提示用户。通过它发现当打开文本文件时,“Windows.exe”文件会被恢复。关联的文件类型找到后问题迎刃而解,搜索注册表文本关联项“HKEY_LOCAL_MACHINE \Software\CLASSES\txtfile\shell\open\ command”,发现TXT文件的默认关联设置“NOTEPAD.EXE %1”被改成“S_SERVER.EXE %1”。这个“S_Server.exe”就是“黑洞2001”的第二进程。下面就简单了,在硬盘上搜索“S_Server.exe”,把它和“Windows.exe”一起删掉。然后在注册表中删除或恢复有关二者的所有信息。
 如果说延时多进程木马尚带三分狡黠,那么同时多进程木马简直就是赤裸裸的霸道了。以“生日快乐”为例,它运行后会自我复制3份拷贝至系统目录下,分别名为“WinServices.exe”、“Nav32_loader.exe”和“Tcpsvs32.exe”,并设置属性为“隐藏”。接着便在电脑中随机生成大量的病毒文件,扩展名包括“SCR”、“EXE”和“COM”,还会修改注册表中“EXE”文件的关联。最后这3个可执行文件同时运行形成3个进程。通常此类木马程序的多个进程会有分工,以“生日快乐”为例,其中一个为主进程,负责远程控制,另两个则为辅助进程。一个辅助进程被称为监视进程,负责检查木马程序是否被删除或停止;另一个被称为守护进程,它驻留在内存里与主进程同步,一旦主进程被停止,它就重启该进程,并将自身数据赋与它。由于该木马程序的症状很明显,所以对于相关进程也就毫不掩饰了,但3个进程相互扶持,保证木马程序一直运行,所以很难同时关闭3个进程并清除程序。
 别着急,还有DOS呢。尽管我们在Windows下对它无可奈何,但如果进程压根运行不了,执行文件总不会自己跑吧。用Win98启动盘引导至DOS下,找“Attrib.exe”,执行“Attrib WinServices.exe -h -r”,去掉其隐藏和只读属性,以相同操作对待其它两个文件,然后将它们删除(熟悉Windows XP的用户也可将系统启动到控制台模式下,完成上述操作)。删除文件后重启电脑,恢复注册表中的EXE文件关联为“HKEY_CLASSES_ROOT\Exefile\shell\open\command”键值为:"%1" %*,删除“HKEY_LOCAL_MACHINE\ Software\Microsoft\Windows\CurrentVersion\Run”中的相关子键,恢复IE默认首页。这样,“生日快乐”就彻底偃旗息鼓了。
 纵观两种多进程木马程序的特点,主要手段就是拥有多个进程,并且在进程名上几乎不做伪装。它们大多采取的策略是进程间的“相互守望”,用户无法彻底清除它们。多进程木马程序“自认为”技术过硬,因此也就不去伪装进程名了,颇有“我是流氓我怕谁”的霸道。
 至此,大家对于各种带进程的木马程序应该已经是“软硬不吃”了,进程成为木马程序的照妖镜,而其执行文件成为绊脚石,看来对于木马程序而言,只有完全摆脱进程才是生存之道,于是“无”进程木马悄然而至……
三、电脑中的寄生虫——“无”进程木马的隐身术
 首先要肯定一点,只要是以进程形式运行的程序,都不能逃脱“Ctrl+Alt+Del”的法眼。所以要实现无进程,就不能有可执行文件。但没有可执行文件的木马程序又如何运行呢?答案是:Windows中有一类特殊的可执行文件——“DLL”文件,因此这类无进程木马程序又被称为“DLL木马”。
 最初的DLL木马十分简单,称为:静态特洛伊DLL。它的工作原理是替换系统中常用的DLL文件,将正常的调用转发给原DLL,然后截获并处理自已所需的消息。由于它伪装成系统进程调用文件,不会产生进程,也就成为了“无”进程的隐形木马程序。但随着微软数字签名技术和文件恢复功能的出现,这种DLL木马还未形成气候便迅速衰亡。
 为了“与时俱进”,动态嵌入式DLL木马应运而生。所谓“动态嵌入”,就是一种将代码嵌入正在运行的进程中的技术。动态嵌入的方法有很多种,最常见的是用“钩子”、API函数以及“远程线程”技术等。如金山词霸,就是使用“钩子”技术将自己“钩”在系统函数上实现即时翻译的。因此动态嵌入式DLL木马的工作原理就是将自身嵌入到正在运行的受信任系统进程中,然后作为这个进程的子线程运行。这样一来,任务管理器中只会出现那个被嵌入的受信任系统进程,而不会出现木马程序的DLL文件,从而实现“无”进程。被DLL木马嵌入的那个系统进程通常被称为宿主,如果没有宿主,DLL木马就像一堆破烂毫无用处。因此,宿主最好是系统必不可少而又被绝对信任的系统进程,“Explorer.exe”当然是最好的选择。同理,前面介绍过的“Svchost.exe”、“Smss.exe”等无法结束的系统进程都是DLL木马的最爱。
 应当承认,动态嵌入式DLL木马达到了前所未有的隐蔽程度和技术高度。不过也正是因为技术难度大,使得一般的木马编写者无力涉足,所以这种木马程序并没有大面积蔓延。排除这种木马只能依靠经验、耐心和适当的工具软件。如果使用常规手段无法追查到木马程序的进程,即可怀疑中了动态嵌入式DLL木马。在“Process Explorer”菜单中选择“View”→“Lower Pane View”→“DLLs”,然后点击任何一个进程,便会在下面窗口中显示出与之关联的DLL文件。如果在系统安装之初就做了系统DLL文件列表备份,对照比较也许能圈定被怀疑的DLL文件(事实上随便哪个进程都会调用几十个DLL文件,因此纠察工作异常痛苦)。仔细查看被怀疑的DLL文件的创建时间、版本、是否经过压缩等属性进行进一步判断。最后可以尝试将该DLL文件移至回收站,若系统长时间没有异常反应既可断定其为木马程序。
 “无”进程木马虽然厉害,但开发难度确实很高。于是很多木马程序编写者退而求其次,选择开发技术难度相对较小且隐蔽性好的NT-Service木马程序……
 你究竟有几个好妹妹——“Svchost.exe”是木马程序的新摇篮?
 虽然读者现在已经认识到“Svchost.exe”是系统进程,却不知道为什么总会有那么多“Svchost.exe”进程。那么用户的系统中到底该有几个“Svchost.exe”进程,最多又能有几个?回答这些问题必须先了解Windows的共享进程。
 微软将Windows系统服务分为独立进程和共享进程两种,在WinNT时代,只有Services.exe是多个服务的共享进程。在Win2000中随着系统服务的增加,很多服务也采用了共享进程方式,它们均由Svchost.exe启动。Win2000一般会有2个Svchost.exe进程,一个是RPC(Remote Procedure Call)服务进程,另一个是由很多服务组成的共享进程。到了WinXP时代,一般有4个或更多的“Svchost.exe”进程,而在Windows Server 2003中就更多了。如此看来采用共享进程启动服务将是微软操作系统发展的一个趋势。
 “Svchost.exe”本身只是作为服务宿主,自己并不实现任何服务功能,所有“Svchost.exe”启动的服务都是以动态链接库DLL文件实现。这些服务安装时会将可执行程序指向“Svchost.exe”,而启动这些服务时“Svchost.exe”就会调用相应服务的DLL文件来启动服务。 那么“Svchost.exe”如何知道某一服务对应那个DLL文件呢?这并不是由服务的可执行程序路径中的参数来决定,而是通过服务在注册表中Parameters子键下ServiceDll键值得到。如RPC(Remote Procedure Call)服务的此键值为“ServiceDll"=REG_EXPAND_SZ:"%SystemRoot%\system32\rpcss.dll”,则启动RPC服务时,Svchost就会调用rpcss.dll。
 既然这些服务都是用共享进程方式由“Svchost.exe”启动,那为什么系统中又会有多个“Svchost.exe”进程呢?原因在于微软把这些服务分为几组,每组服务对应一个“Svchost.exe”。具体的分组情况在注册表中的“HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\Windows NT\CurrentVersion\Svchost”之下可以看到。每个“REG_MULTI_SZ”类型的键都代表一个组,而其键值则代表了组内所有的服务,其中“Netsvcs”组中的服务最多。“REG_MULTI_SZ”键共有6个,所以系统中最多有6个“Svchost.exe”进程。由于系统本身的共享进程服务共属于4个组,所以,系统本身的“Svchost.exe”进程应该有4个。
 详细认识“Svchost.exe”进程的意义在哪里?很简单,越来越多的系统服务以共享进程方式启动,共享进程极有可能成为木马程序的新摇篮。它的技术实现简单,只要将木马写成DLL文件,并注册成系统服务交给共享进程启动即可,根本无需动态嵌入那样高深的技术。一旦它成为“大组”成员隐蔽性就很强(所谓“大组”就是指像“Netsvcs”这样成员很多的组)。
 进程与木马的关系始终纠缠不清,事实上单一性的木马已经越来越少, “无”进程的DLL木马也可以是多进程或服务型木马。本文只是简单探讨一下进程与木马程序的关系,而实际上木马的防治与端口、通信数据等都有密切关系,请大家切不可在搞清楚了进程后放松其他方面,唯有多管齐下才是最佳的选择。
 编者注:为方便读者,文章中涉及的所有需要输入的链接及代码,我们会集结成一个帖子,发表在“大众软件网”→“晶合后院”→“论坛”→“实用软件”版中,该帖标题为“2004年第2期中所有需要录入的链接及代码”。
 
 进程

 每一个正常的应用程序运行之后,都会在系统中产生一个进程。每个进程都会对应一个不同的PID(Progress ID, 进程标识符)。而每个进程会被系统分配一个虚拟的内存空间地址段,一切相关的程序操作都会在这个虚拟空间中进行。进程就是系统核心资源分配和调度的独立单位,当进程被终止时程序也就结束了。
 程序与进程对应,但程序不等于进程。任务管理器将二者作了明确的划分。事实上进程是由程序、数据和进程控制块(PCB)3部分组成,其较严格的定义是:具有一定独立功能的应用程序,在结合所必须的数据集合后的一次行动。进程和程序的区别在于程序是静态的,而进程是动态的。一个进程可以执行一个或几个程序,一个程序也可以生成多个进程。
 进程可分为系统进程和用户进程两类,系统进程的优先级通常高于一般用户进程。但用户可使用任务管理器自己定义其优先级别。操作系统的并发性和共享性正是通过进程的活动体现出来的。
 
 文件关联型木马程序

 什么是文件关联?简单地说,就是操作系统将不同类型的文件指定给不同的程序打开。对于系统中已注册的各类型文件,用不同的图标显示它们,双击它时则会启动相应的关联程序来打开它。所有这些设置信息都存放在注册表中。
 文件关联型木马程序正是利用文件关联死而复生的。通常它会将自身复制为两份,分别用a和b代替。a作为服务端与系统同时启动。b则与某个类型文件关联,比如与TXT文件关联。当a被发现并删除后,服务端暂时被关闭,木马程序也暂时被删除。不过用户一旦查看任何TXT文件,b马上被激活并再次生成a,于是木马程序重新被植入。
 
 DLL文件

 DOS时代,写程序是一件繁琐的事情,因为每个程序的代码都是独立的,程序员们把很多常用的代码集合放进一个独立的文件里,并把这个文件称为“库”(Library)。在写程序的时候,把这个库文件加入编译器,就能使用这个库包含的所有功能而不必自己再去写一大堆代码了,这个技术被称为“静态链接”(Static Link)。到了Windows时代,这种函数库技术得到了发展,一种新的被称为“动态链接”(Dynamic Link)的技术及“动态链接库”(Dynamic Link Library)产生了,其相应的文件扩展名为DLL。
 DLL文件是Windows的基础,所有的应用程序接口(API)函数都要通过DLL来实现,所以DLL文件实际上也是一种可执行文件。但DLL文件并没有程序逻辑,而是由多个功能函数构成,因此它不能主动独立运行。Windows在加载DLL的时候,需要一个入口函数,也就是需要一个进程主动调用DLL文件。由于DLL文件不能独立运行,Windows任务管理器中也就不会出现有关DLL的进程。鉴于此,有人就把实现木马功能的代码加上一些特殊代码写成DLL文件,并导出相关的API。在用户看来,这只是一个普通的DLL文件,但其实这个DLL文件中携带了完整的木马功能,这就是“DLL木马”的概念。
 
 进程与线程

 进程是应用程序的运行实例,每个进程都有自己独立的虚拟地址空间,而一个进程除主线程外还可建立若干子线程。可以把线程看成是操作系统分配CPU时间的基本实体。进程中的线程是并行执行的,每个线程占用CPU的时间由系统来划分。系统不停地在各线程之间切换,它对线程的中断是汇编语言级的。系统为每个线程分配一个CPU时间片,某个线程只有在分配的时间片内才有对CPU的控制权。实际上,在计算机中同一时间只有一个线程在运行。由于系统为每个线程划分的时间片很小(低于20ms),所以看上去似乎多个线程是在同时运行的。
 虽然在进程中进行费时的工作不会导致系统的挂起,但会导致进程本身的挂起,使程序处于“未响应”状态,这时用户就会误认为进程死锁。但如果进程开启多线程的话,一个线程专门负责费时的工作,而别的线程就可以与用户进行交互了

TOP

唉,现在得木马病毒,动不动都是ROOTKIT和加驱动进RING0,越来越先进.
现在真牛了,越来越先进了,放不胜防啊

TOP

曾经的经典现在都过时了
牛人用牛B技术,次点的就用破坏技术
地球果然很危险···

TOP

虽然长知识了^但是觉得地球的确危险了^
站在防线上的不在是一个人    全民皆防

TOP

Processed in 0.779055 second(s), 5 queries, Gzip enabled