写在前面:很多人的系统经常出现莫名其妙的问题,上网也经常弹出各类奇怪的窗口,各类木马病毒呈爆炸式的增长,大多是中了木马或病毒所致,一直想写一篇比较深入的关于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