Pages

Sunday, 29 April 2012

清除dll后门方法大比拼

当 安全意识提升到一定高度的时候,”后门”的危害自然不用多说。随着杀毒软件的”大力支持”,传统”后门”已经可以通过”查端口”、”看进程”堵住。然而, 如果”后门”开到了动态链接程序库,也就算将后门做成了DLL(动态链接程序库)文件,然后由某一个EXE做为载体,或者使用Rundll32.exe来 启动,这样就不会有进程,不开端口等特点,也就实现了进程、端口的隐藏。
实际上,动态链接程序库(Dynamic Link Library,简称DLL),作用在于为应用程序提供扩展功能。应用程序想要调用DLL文件,需要跟其进行”动态链接”从编程的角度,应用程序需要知道 DLL文件导出的API函数方可调用。由此可见,DLL文件本身并不可以运行,需要应用程序调用。正因为DLL文件运行时必须插入到应用程序的内存模块当 中,所以DLL文件无法删除,而且由于这是Windows内部机制造成的,所以正在运行的程序不能关闭。于是,DLL后门由此而生。如何处理这些特殊的 DLL文件?
以三款比较有名的DLL后门例,分别为”SvchostDLL.dll”、”BITS.dll”,下面详细讲解其手工清除方法。
宿主Svchost
在介绍清除dll后门方法之前,先来简单的介绍一下svchost.exe这个系统的关键服务:
  Svchost只是做为服务的宿主,本身并不实现什么功能,如果需要使用Svchost来启动服务,则某个服务是以DLL形式实现的,该DLL 的载体Loader指向svchost,所以,在启动服务的时候由svchost调用该服务的DLL来实现启动的目的。使用svchost启动某个服务的 DLL文件是由注册表中的参数来决定的,在需要启动服务的下边都有一个Parameters子键,其中的ServiceDll表明该服务由哪个DLL文件 负责,并且这个DLL文件必须导出一个ServiceMain()函数,为处理服务任务提供支持。
在注册表的HKEY_LO CAL_MACHINE\SOFTWARE\ Microsoft\WindowsNT\Current Version\Svchost,里边存放着Svchost启动的组和组内的各个服务,其中netsvcs组的服务最多。要使用Svchost启动某个服 务,则该服务名就会出现在HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下。
这里有四种方法来实现:
  1、添加一个新的组,在组里添加服务名。
  2、在现有组里添加服务名。
  3、直接使用现有组里的一个服务名,但是本机没有安装的服务。
  4、修改现有组里的现有服务,把它的ServiceDll指向自己的DLL后门。
PortLess BackDoor
这是一款功能非常强大的DLL后门程序,除了可以获得Local System权限的Shell之外,还支持如”检测克隆帐户”、”安装终端服务”等一系列功能,适用Windows2000/xp/2003等系统。程序 使用svchost.exe来启动,平常不开端口,可以进行反向连接,对于有防火墙的主机来说,这个功能破坏能力很强。
  后门的Loader把SvchostDLL.dll插入Svchost进程当中,所以,先打开Windows优化大师中的Windows进程管 理2.5,查看Svchost进程中的模块信息,可以看到,SvchostDLL.dll已经插入到Svchost进程中了,在根据上述原理,可以断定, 在”管理工具”-”服务”中会有一项新的服务。通过查看可以证明:此服务名称为:IPRIP,由Svchost启动,-k netsvcs表示此服务包含在netsvcs服务组中。
  我们把该服务停掉,然后打开注册表编辑器(开始-运行–regedit),来到HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\ Services\IPRIP下,查看其Parameters子键。Program键的键值SvcHostDLL.exe为后门的 Loader;ServiceDll的键值C:\WINNT\system32\ svcho stdll.dll为调用的DLL文件,这正是后门的DLL文件。现在我们删除IPRIP子键(或者用SC来删除),然后在来到 HKEY_LOCAL_MACHINE \SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下,编辑netsvcs服务组,把49 00 70 00 72 00 69 00 70 00 00 00删除,这里对应的就是IPRIP的服务名。然后退出,重启。重启之后删除WINNT\system32目录下的后门文件即可。
  PortLess BackDoor使用的就是svchost的第三种方法。所以,清除PortLess BackDoor的方法就是在注册表的Svchost键下做文章。
BITS.dll
  这是榕哥的作品,也是DLL后门,和SvchostDLL.dll原理基本一样,不过这里使用的是上边介绍的第四种方法,即”修改现有组里的现 有服务,把它的ServiceDll指向自己的DLL后门”。换句话说,该后门修改现有的某一个服务,把其原有服务的DLL指向自己(也就是 BITS.dll),这样就达到了自动加载的目的;其次,该后门没有自己的Loader,而是使用系统自带的Rundll32.exe来加载。我们还是用 Windows 进程管理2.5来查看,我们可以看到bits.dll已经插入到Svchost进程当中。
现在来看看具体的清除方法,由于该后门是修改现有服务,而我们并不知道具体是修改了哪个服务,所以,在注册表中搜索bits.dll,最后在 HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\ Services\RasAuto下搜索到了bits.dll,查看Parameters子键下的ServiceDll,其键值为C:\WINNT \system32\bits.dll。原来,该后门把RasAuto服务原来的DLL文件替换为bits.dll了,这样来实现自动加载。知道了原因就 好办了,现在我们把ServiceDll的键值修改为RasAuto服务原有的DLL文件,即%SystemRoot%\System32 \rasauto.dll,退出,重启。之后删除WINNT\system32目录下的bits.dll即可。
防范DLL
也许大家已经了解了如何清除DLL后门,但在现实中,DLL后门并不会使用默认的文件名,所以用户也就不能肯定是否中了DLL后门。对于DLL后门,system32目录下是个好地方,大多数后门也是如此,所以这里要非常注意。
  1、安装好系统和所有的应用程序之后,备份system32目录下的EXE和DLL文件:打开CMD,来到WINNT\system32目录 下,执行:dir *.exe>exe.txt & dir *.dll>dll.txt,这样,就会把所有的EXE和DLL文件备份到exe.txt和dll.txt文件中;日后,如发现异常,可以使用相同 的命令再次备份EXE和DLL文件(这里我们假设是exe0.txt和dll0.txt),并使用:fc exe.txt exe0.txt>exedll.txt & fc dll.txt dll0.txt>exedll.txt,其意思为使用FC命令比较两次的EXE文件和DLL文件,并将比较结果保存到exedll.txt文件 中。通过这种方法,我们就可以发现多出来的EXE和DLL文件,并通过文件大小,创建时间来判断是否是DLL后门。
  2、使用内存/模块工具来查看进程调用的DLL文件,比如Windows优化大师中的Windows 进程管理 2.5。这样,可以发现进程到底调用了什么DLL文件,在结合上边用FC命令比较出来的结果,又能进一步来确定是否中了DLL后门。如果没有优化大师,可 以使用TaskList,这个小工具也可以显示进程调用的DLL文件(Tasklist /M),而且还有源代码,方便修改。
  3、通后门连接需要打开特定的端口,DLL后门也不例外,不管它怎么隐藏,连接的时候都需要打开端口。我们可以用netstat -an来查看所有TCP/UDP端口的连接,以发现非法连接。大家平时要对自己打开的端口心中有数,并对netstat -an中的state属性有所了解。当然,也可以使用Fport来显示端口对应的进程,这样,系统有什么不明的连接和端口,都可以尽收眼底。
  4、定期检查系统自动加载的地方,比如:注册 表,Winstart.bat,Autoexec.bat,win.ini,system.ini,wininit.ini,Autorun.inf,Config.sys 等。其次是对服务进行管理,对系统默认的服务要有所了解,在发现有问题的服务时,可以使用Windows 2000 Server Resource Kit中的SC来删除。
  通过使用上面的方法,笔者想大多数DLL后门都可以”现形”,事实上,只要我们平时多做一些备份,那对查找DLL后门会起到事半功倍的效果.