S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

深入浅出dll插入型木马病毒的原理,查杀与防范

写在前面:很多人的系统经常出现莫名其妙的问题,上网也经常弹出各类奇怪的窗口,各类木马病毒呈爆炸式的增长,大多是中了木马或病毒所致,一直想写一篇比较深入的关于dll插入型木马病毒的原理,查杀与防范的文章,可惜囿于时间所限,一直也只是打腹稿,未能成型,五一回家终于有了时间,于是就有了这篇文章

                 深入浅出dll插入型木马病毒的原理,查杀与防范
         
       在文章开始前,我觉得有必要说明一些名词,先列表如下

Rootkit:可能你对这个名词并不太陌生,rising的卡卡上网助手的宣传里就提到过采用很多Anti-rootkit技术,那说明Rootkit肯定不是什么好东西,呵呵,其实这最早是个linux下的名词,一般是指用来隐藏直接可获得管理员权限的后门的技术工具,后来衍生到了win下。

dll:简单说DLL 是一个包含可由多个程序同时使用的代码和数据的库,所以dll也叫动态链接程序库,当exe程序运行时,会同时调用很多dll文件来实现扩展功能。

dll插入:把一个实现了后门功能的代码写成一个DLL文件,然后插入到一个EXE文件当中,使其可以执行,这样就不需要占用进程,也就没有相对应的PID号,也就可以在任务管理器中隐藏。我们可以这样理解,dll好比一个寄生虫,而exe则是宿主,把dll注入到exe程序运行的空间中,我们的dll才能活下来,一旦exe程序被终止,dll也随之死去。



    相信看了上面的列表,大家应该对dll插入有了一个大概的影象,其实dll插入技术也叫“远程线程注入技术”,并不是什么很新鲜的玩意,属于rootkit技术中的一种,而rootkit技术大致可分为ring0(内核级别)和ring3(用户级别)两类,ring3下有很多技术如:远程线程注入技术,hook api 技术,端口复用技术等等,而要达到ring0级别的话,就要涉及到驱动开发了,如果你想深入了解rootkit,可以去www.rootkit.com上去看看。

    假设我们已经编好了dll中的相关代码,那么如何让它运行呢,从开始我已经提过,我们要找一个宿主,也就是一个exe进程来加载我们的dll,而加载dll又可以分为以下几种方式:

   一:利用系统中的rundll32.exe加载

经常会有人在注册表的启动项中会发现类似键值
rundll32.exe c:\temp\XXX.dll dllmain
那么是什么意思呢?,其实rundll32.exe这个程序顾名思义,运行32位的dll程序,功能就是以命令行的方式调用动态链接程序库,其命令行下的使用方法为:
Rundll32.exe  dll的名字 调用的函数名
如果我们的dll中编写了test()这个函数,那么调用方式就是:Rundll32.exe  C:\dlltest.dll  test
这样dll中的函数就得到运行了。



二:替换系统中的DLL文件
这可以说是上面的升级版了,它把实现了后门功能的代码做成一个和系统匹配的DLL文件,并把原来的DLL文件改名。遇到应用程序请求原来的DLL文件时, DLL后门就启一个转发的作用,把"参数"传递给原来的DLL文件;如果遇到特殊的请求时(比如客户端),DLL后门就开始,启动并运行了,但是实现却不太容易,所以没有流行开来。


三:就是我们要说的dll注入技术了
      其意义是将DLL文件嵌入到正在运行的系统进程当中。在Windows系统中,每个进程都有自己的私有内存空间,但还是有种种方法来进入其进程的私有内存空间,来实现动态嵌入式。
       有什么好处呢,首先是实现了隐藏,任务管理器中看不见我们的dll后门,其次windows和linux 不同,不能删除正在运行的程序,这就是为什么经常删东西时候会提示“xxx正在运行,无法删除。可能最重要的是可以穿透绝大多数防火墙了,设想防火墙肯定不会阻拦ie,那我们把dll插入ie进程,不就穿透防火墙了吗。
   
    那么我们如何实现把dll注入到exe中呢?dll自己又没长腿,呵呵,我们需要一个dlllorder.exe,再哪弄?自己写呗,把代码写到dlllorder.exe中,只要运行dlllorder.exe,相应的dll文件就可以注入到任何程序中了。有了dlllorder就好办了,只要能让系统每次自动启动dlllorder,后门的生存期就大大增长了,至于如何自启动,有注册表,服务,BHO,activex,计划任务等等,太多了,就不介绍了。


dll木马的防范与清除

对于第一类dll文件
下次看到进程中有rundll32.exe,则只要找到它调用的dll就可以kill掉隐藏的程序了
  

对于第三类dll文件

第一招:  对于dll的隐藏地,temp,system32,windows这三个文件夹是最常见的,如果你哪天发现temp里某个dll文件无法删除,那么几乎可以肯定这个文件有问题了,
     安装好系统和所有的应用程序之后,备份system32目录下的EXE和DLL文件:打开CMD,来到WINNT\system32目录下,执行:
复制内容到剪贴板
代码:
dir *.exe >exefirst.txt   dir *.dll   >dllfirst.txt
这样,就会把所有的EXE和DLL文件备份到exe.txt和dll.txt文件中,日后,如发现异常,可以使用相同的命令再次备份EXE和DLL文件
复制内容到剪贴板
代码:
  dir *.exe >exeSecond.txt       dir *.dll   >dllSecond.txt
并使用:
复制内容到剪贴板
代码:
fc exefirst.txt exeSecond.txt >dllresult.txt    fc dllfirst.txt dllSecond.txt   >exeresult.txt
其意思为使用FC命令比较两次的EXE文件和DLL文件,并将比较结果保存到exedll.txt文件中。通过这种方法,我们就可以发现多出来的EXE和DLL文件,并通过文件大小,创建时间来判断是否是DLL后门。


第二招
运用相关工具如,icesword ,ring防火墙,重点检测ie,exeplorer桌面进程中是否有未知的dll加载文件,其实我更喜欢用ring防火墙,里面有未知dll都以红色显示,很方便看


第三招

通过创建时间来查找,利用win中的搜索文件功能,设定时间,查找可以文件


第四招

定期检查系统自动加载的地方,如注册表启动项,服务列表,win.ini,system.ini。。。。,可以去网上搜索更多启动的地方


第五招

用相关工具查看端口列表,如果你不想用cmd的话,注意下每个tcp连接后的应用程序路径,也可以发现可以文件


第六招

         当我们运用前面几招找出了可疑文件,如何删除呢?如何杀“寄生虫”? 最简单的办法就是让“宿主”死去   ,结束被插入了的exe进程,类似ie,桌面这类进程可以直接用任务管理器kill,这里提一下,kill桌面exeplorer进程时,会发现任务栏消失了,那么怎么删dll呢,按ctrl+alt+del调出任务管理器,依次点菜单栏的 文件--新建任务,这时候会出现一个“创建新任务”的窗口,点下方的“浏览”找到插入桌面的dll文件,也就是“寄生虫”了,呵呵,右键删之,删了后在“创建新任务”的窗口运行栏中输入“exeplorer"确定后,我们的宿主就复活了,哈哈,体内的寄生虫也没了。

   如果插入的是crss.exe等系统核心进程呢?无法杀死宿主咋办?没关系,我们还有安全模式啊,开机按f8进入安全模式,找到你确定的可疑文件,删之,这个世界终于清净了。。。。




  写在后面:现实中分析,查杀可疑文件当然没有这么简单,但只要核心抓住了就可以了,不管它72变,照样现出原形,最后祝所有人远离木马,病毒!打字打的可真累啊,虽然很泛泛,希望对那些对系统不太熟悉的网友能有所帮助~


参考了部分网络文章和书籍,一并感谢


                                                                                    by willy
                                                                                  2007.5.2

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理