网络安全 频道

透视木马程序开发技术 病毒源代码详解

4、木马程序的建立连接的隐藏

木马程序的数据传递方法有很多种,其中最常见的要属TCP,UDP传输数据的方法了,通常是利用Winsock与目标机的指定端口建立起连接,使用send和recv等API进行数据的传递,但是由于这种方法的隐蔽性比较差,往往容易被一些工具软件查看到,最简单的,比如在命令行状态下使用netstat命令,就可以查看到当前的活动TCP,UDP连接。

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

Active Connections

Proto Local Address Foreign Address State

TCP 192.0.0.9:1032 64.4.13.48:1863 ESTABLISHED

TCP 192.0.0.9:1112 61.141.212.95:80 ESTABLISHED

TCP 192.0.0.9:1135 202.130.239.223:80 ESTABLISHED

TCP 192.0.0.9:1142 202.130.239.223:80 ESTABLISHED

TCP 192.0.0.9:1162 192.0.0.8:139 TIME_WAIT

TCP 192.0.0.9:1169 202.130.239.159:80 ESTABLISHED

TCP 192.0.0.9:1170 202.130.239.133:80 TIME_WAIT

C:\Documents and Settings\bigball>netstat -a

Active Connections

Proto Local Address Foreign Address State

TCP Liumy:echo Liumy:0 LISTENING

TCP Liumy:discard Liumy:0 LISTENING

TCP Liumy:daytime Liumy:0 LISTENING

TCP Liumy:qotd Liumy:0 LISTENING

TCP Liumy:chargen Liumy:0 LISTENING

TCP Liumy:epmap Liumy:0 LISTENING

TCP Liumy:microsoft-ds Liumy:0 LISTENING

TCP Liumy:1025 Liumy:0 LISTENING

TCP Liumy:1026 Liumy:0 LISTENING

TCP Liumy:1031 Liumy:0 LISTENING

TCP Liumy:1032 Liumy:0 LISTENING

TCP Liumy:1112 Liumy:0 LISTENING

TCP Liumy:1135 Liumy:0 LISTENING

TCP Liumy:1142 Liumy:0 LISTENING

TCP Liumy:1801 Liumy:0 LISTENING

TCP Liumy:3372 Liumy:0 LISTENING

TCP Liumy:3389 Liumy:0 LISTENING

TCP Liumy:netbios-ssn Liumy:0 LISTENING

TCP Liumy:1028 Liumy:0 LISTENING

TCP Liumy:1032 msgr-ns19.msgr.hotmail.com:1863 ESTAB

TCP Liumy:1112 szptt61.141.szptt.net.cn:http ESTABLI

TCP Liumy:1135 202.130.239.223:http ESTABLISHED

TCP Liumy:1142 202.130.239.223:http ESTABLISHED

TCP Liumy:1162 W3I:netbios-ssn TIME_WAIT

TCP Liumy:1170 202.130.239.133:http TIME_WAIT

TCP Liumy:2103 Liumy:0 LISTENING

TCP Liumy:2105 Liumy:0 LISTENING

TCP Liumy:2107 Liumy:0 LISTENING

UDP Liumy:echo *:*

UDP Liumy:discard *:*

UDP Liumy:daytime *:*

UDP Liumy:qotd *:*

UDP Liumy:chargen *:*

UDP Liumy:epmap *:*

UDP Liumy:snmp *:*

UDP Liumy:microsoft-ds *:*

UDP Liumy:1027 *:*

UDP Liumy:1029 *:*

UDP Liumy:3527 *:*

UDP Liumy:4000 *:*

UDP Liumy:4001 *:*

UDP Liumy:1033 *:*

UDP Liumy:1148 *:*

UDP Liumy:netbios-ns *:*

UDP Liumy:netbios-dgm *:*

UDP Liumy:isakmp *:*
但是,黑客还是用种种手段躲避了这种侦察,就我所知的方法大概有两种,一种是合并端口法,也就是说,使用特殊的手段,在一个端口上同时绑定两个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也正是使用了这一办法来校验消息的。
0
相关文章