⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxy.cpp

📁 自己写的socks5代理完整源代码!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
psockinfo=(LPSOCKINFO)info;
sourcesock=psockinfo->sourcesock;
destsock=psockinfo->destsock;
TRACE("deail send thread ok!\r\n");
while(true){
     eventid=GetSocketEventId(sourcesock);
	 switch(eventid){
	    case FD_CLOSE:
		   TRACE("s fdclosed\r\n");
		   closesocket(destsock);
		   return 1;
		   break;
		default:break;
		}
     eventid=GetSocketEventId(destsock);
	 switch(eventid){
	    case FD_CLOSE:
		   closesocket(sourcesock);
		   TRACE("d fdclosed\r\n");
		   return 1;
		   break;
		default:break;
		}
     datalen=recv(destsock,data,sizeof(data),0);
	 if(datalen==0){
	   closesocket(sourcesock);
	   closesocket(destsock);
	   TRACE("d fdclosed\r\n");
	   break;
	   }
	 if(datalen>0){
	    while(!send(sourcesock,data,datalen,0));
		}
	 Sleep(1);
	 }
return 1;
}
//
UINT UdpDeailThread(LPVOID info){
LPCLIENTINFO pclientinfo;
sockaddr_in source_sock_addr,dest_sock_addr,from_sock_addr;
SOCKET tcp_sourcesock,udp_listensock;
char data[MAXDATALEN],senddata[MAXDATALEN];
long eventid;
int datalen,socklen,index,DestPort;
unsigned char ATYP;
char ip[250];
pclientinfo=(LPCLIENTINFO)info;
udp_listensock=pclientinfo->udpsock;
tcp_sourcesock=pclientinfo->clientsock;
source_sock_addr=pclientinfo->remotesock;
TRACE("UDP deail recive thread ok!\r\n");
while(true){
     eventid=GetSocketEventId(tcp_sourcesock);
	 switch(eventid){
	    case FD_CLOSE:
		   TRACE("tcp_sourcesock fdclosed\r\n");
		   closesocket(tcp_sourcesock);
		   closesocket(udp_listensock);
		   return 1;
		   break;
		default:break;
		}
	 socklen=sizeof(from_sock_addr);
     datalen=recvfrom(udp_listensock,data,sizeof(data),0,(sockaddr *)&from_sock_addr,&socklen);
	 /*
	 if(datalen==0){
	   closesocket(sourcesock);
	   closesocket(destsock);
	   TRACE("s fdclosed\r\n");
	   break;
	   }
	 */
	 if(datalen>0){
	    if(from_sock_addr.sin_addr.S_un.S_addr!=source_sock_addr.sin_addr.S_un.S_addr){
		   while(!sendto(udp_listensock,data,datalen,0,(sockaddr *)&source_sock_addr,sizeof(source_sock_addr)));
		   }
		else if(datalen>8){
           ATYP=data[3];
		   switch(ATYP){
             case ATYP_IPV4:
		           memcpy((void *)&DestPort,(const void *)&data[8],2);
			       //DestPort=110;
                   ZeroMemory(ip,sizeof(ip));
                   wsprintf(ip,"%d.%d.%d.%d",(unsigned char)data[4],(unsigned char)data[5],(unsigned char)data[6],(unsigned char)data[7]);
			       //strcpy(ip,"mail.sdu.edu.cn");
			       TRACE(ip);
			       break;
		     case ATYP_IPV6:
		           closesocket(tcp_sourcesock);
		           closesocket(udp_listensock);
			       TRACE("ipv6 ok!\r\n");
			       return 0;
			       break;
		     case ATYP_DOMAIN:
		           index=data[4];
			       memcpy((void *)&DestPort,&data[index+5],2);
			       ZeroMemory(ip,sizeof(ip));
			       memcpy((void *)ip,(const void *)&data[5],index);
                   ip[index]='\0';
			       TRACE(ip);
			       break;
		     default:
		           closesocket(tcp_sourcesock);
		           closesocket(udp_listensock);
			       TRACE("default ok!\r\n");
			       return 0;		      
		           break;
             }
           if(ATYP==ATYP_IPV4) memcpy((void *)senddata,(const void *)data[10],datalen-10);
		   else memcpy((void *)senddata,(const void *)data[index+7],datalen-index-7);
           dest_sock_addr.sin_family=AF_INET;
		   dest_sock_addr.sin_port=DestPort;
		   if(ATYP==ATYP_IPV4) dest_sock_addr.sin_addr.S_un.S_addr=inet_addr(ip);
		   else dest_sock_addr.sin_addr.S_un.S_addr=GetDomainIp(ip);
		   while(!sendto(udp_listensock,senddata,datalen-index-7,0,(sockaddr *)&dest_sock_addr,sizeof(dest_sock_addr)));
		   }  
		}
	 Sleep(1);
	 }
return 1;
}
//
UINT ProxyServerThread(LPVOID info){
LPCLIENTINFO pclientinfo;
SOCKET ClientSock,connectsock,listensock,newsock;
sockaddr_in remotesock_addr,sock_addr,localsock_addr;
char data[MAXDATALEN];
int datalen,methodlen,i,index;
unsigned char CMD,ATYP;
int DestPort,socklen;
char ip[250];
struct in_addr ipaddr;
pclientinfo=(LPCLIENTINFO)info;
ClientSock=pclientinfo->clientsock;
remotesock_addr=pclientinfo->remotesock;
CString remoteip;
ipaddr.S_un.S_addr=remotesock_addr.sin_addr.S_un.S_addr;
remoteip.Format("%s",inet_ntoa(ipaddr));
TRACE(remoteip);
TRACE(" connect ok...\r\n");
CString temp;
datalen=recv(ClientSock,(char *)data,sizeof(data),0);
if(datalen>2){
  if(data[0]!=PROXYVERSION){
     TRACE("remote server send data no socks5 \r\n");
     SendMethodToClient(ClientSock,NOMETHOD);
	 closesocket(ClientSock);
	 return 1;
	 }
  methodlen=data[1];
  for(i=2;i<(methodlen+2);i++){
      if(data[i]==NOAUTHLOGIN){
	     TRACE("send method ok!\r\n");
	     SendMethodToClient(ClientSock,NOAUTHLOGIN);
		 break;
		 }
	  }
  }
else{
     TRACE("remote server send data wrong!\r\n");
     SendMethodToClient(ClientSock,NOMETHOD);
	 closesocket(ClientSock);
	 return 1;
	 }
datalen=recv(ClientSock,(char *)data,sizeof(data),0);
temp.Format("%d",datalen);
TRACE(temp);
if(datalen>=10){
   TRACE("get cmd ok!");
   CMD=data[1];
   ATYP=(unsigned char)data[3];
   switch(ATYP){
         case ATYP_IPV4:
		      memcpy((void *)&DestPort,(const void *)&data[8],2);
			  //DestPort=110;
              ZeroMemory(ip,sizeof(ip));
              wsprintf(ip,"%d.%d.%d.%d",(unsigned char)data[4],(unsigned char)data[5],(unsigned char)data[6],(unsigned char)data[7]);
			  //strcpy(ip,"mail.sdu.edu.cn");
			  TRACE(ip);
			  break;
		 case ATYP_IPV6:
			  DestPort=*(int *)&data[20];
			  SendRepToClient(ClientSock,REP_ATYP_WRONG,GetLocalIp(),0);
			  closesocket(ClientSock);
			  TRACE("ipv6 ok!\r\n");
			  return 0;
			  break;
		 case ATYP_DOMAIN:
		      index=data[4];
			  memcpy((void *)&DestPort,&data[index+5],2);
			  ZeroMemory(ip,sizeof(ip));
			  memcpy((void *)ip,(const void *)&data[5],index);
              ip[index]='\0';
			  TRACE(ip);
			  break;
		 default:
			  SendRepToClient(ClientSock,REP_ATYP_WRONG,GetLocalIp(),0);
			  TRACE("default ok!\r\n");
			  closesocket(ClientSock);
			  return 0;		      
		      break;
		 }
   sock_addr.sin_family=AF_INET;
   sock_addr.sin_port=DestPort;
   if(ATYP==ATYP_DOMAIN) sock_addr.sin_addr.S_un.S_addr=GetDomainIp(ip);
   else sock_addr.sin_addr.S_un.S_addr=inet_addr(ip);   
   localsock_addr.sin_family=AF_INET;
   localsock_addr.sin_port=htons(8001);
   localsock_addr.sin_addr.S_un.S_addr=INADDR_ANY;  
   if(CMD==CMD_CONNECT){
      TRACE("to connect remote ip...\r\n");
	  connectsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	  if(connect(connectsock,(const sockaddr *)&sock_addr,sizeof(sock_addr))==INVALID_SOCKET){
	    SendRepToClient(ClientSock,REP_TTL_TIMEOUT,GetLocalIp(),0);
	    closesocket(ClientSock);
	    return 0;
		}
	  socklen=sizeof(sock_addr);
	  if(getsockname(connectsock,(sockaddr *)&sock_addr,&socklen)==SOCKET_ERROR)
	    TRACE("get sock name err\r\n");	       
      SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),ntohs(sock_addr.sin_port));
	  sockinfo.sourcesock=ClientSock;
	  sockinfo.destsock=connectsock;
	  TRACE("connect ok...\r\n");
      AfxBeginThread(ReciveThread,(LPVOID)&sockinfo);  
	  AfxBeginThread(SendThread,(LPVOID)&sockinfo);
	  //AfxBeginThread(DeailThread,(LPVOID)&sockinfo);  
      }
   else if(CMD==CMD_BIND){
      TRACE("to bind remote ip...\r\n");
      listensock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	  if(bind(listensock,(sockaddr *)&localsock_addr,sizeof(localsock_addr))==SOCKET_ERROR){
	    SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0);
	    closesocket(ClientSock);
		TRACE("to bind remote failed...\r\n");
	    return 0;
		}
	  listen(listensock,10);	  	  	     
      TRACE("to bind remote ok...\r\n");
      SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),7895);
      newsock=accept(listensock,(sockaddr *)NULL,(int *)NULL);
      if(newsock==INVALID_SOCKET){
	    SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0);
	    closesocket(ClientSock);
		TRACE("to accpet remote failed...\r\n");
	    return 0;
		}
      SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),7895);
	  sockinfo.sourcesock=ClientSock;
	  sockinfo.destsock=newsock;
	  TRACE("accept ok...\r\n");
      AfxBeginThread(ReciveThread,(LPVOID)&sockinfo);  
	  AfxBeginThread(SendThread,(LPVOID)&sockinfo); 
	  }
   else if(CMD==CMD_UDP){
      TRACE("to udp remote ...\r\n");
      TRACE("to bind remote ip...\r\n");
      listensock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
	  if(bind(listensock,(sockaddr *)&localsock_addr,sizeof(localsock_addr))==SOCKET_ERROR){
	    SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0);
	    closesocket(ClientSock);
		TRACE("to bind remote failed...\r\n");
	    return 0;
		}	  	  	     
      TRACE("to bind remote ok...\r\n");
      SendRepToClient(ClientSock,REP_SUCCESS,GetLocalIp(),8001);
	  UdpClientInfo.clientsock=ClientSock;
	  UdpClientInfo.remotesock=sock_addr;
	  UdpClientInfo.udpsock=listensock;
	  TRACE("udp thread ok...\r\n");
      AfxBeginThread(UdpDeailThread,(LPVOID)&UdpClientInfo); 
      }
   else{
	  SendRepToClient(ClientSock,REP_FAILED,GetLocalIp(),0);
	  closesocket(ClientSock);
	  return 0;
      }
   }
return 1;
}
//
UINT StartSocks5Proxy(LPVOID info){
SOCKET NewSock;
int socklen;
sockaddr_in serversock,remotesock_addr;
serversock.sin_family=AF_INET;
serversock.sin_addr.S_un.S_addr=INADDR_ANY;
serversock.sin_port=htons(Socks5ListenPort);
Socks5ListenSock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(Socks5ListenSock==INVALID_SOCKET) return 0;
if(bind(Socks5ListenSock,(const sockaddr *)&serversock,sizeof(serversock))==SOCKET_ERROR) return 0;
listen(Socks5ListenSock,BACKUP);
socklen=sizeof(remotesock_addr);
TRACE("start sock5 proxy thread while\r\n");
while(true){
  while(!CanSockProxy) Sleep(1);
  NewSock=accept(Socks5ListenSock,(sockaddr *)&remotesock_addr,&socklen);
  TRACE("waitting ok...\r\n");
  if(NewSock==INVALID_SOCKET){
     Sleep(1);
	 continue;
	 }
  ZeroMemory((void *)&TcpClientInfo,sizeof(CLIENTINFO));
  TcpClientInfo.clientsock=NewSock;
  TcpClientInfo.remotesock=remotesock_addr;
  TRACE("start proxy thread\r\n");
  AfxBeginThread(ProxyServerThread,(LPVOID)&TcpClientInfo);
  Sleep(100);
  }
return 1;
}
//
CProxy::CProxy()
{
WSADATA WsaData;
WORD wsaVer;
wsaVer=MAKEWORD(2,0);
WsaStartupOk=false;
CanSockProxy=false;
//ListenPort=LISTENPORT;
if(WSAStartup(wsaVer,&WsaData)!=SOCKET_ERROR) WsaStartupOk=true;
}

CProxy::~CProxy()
{
if(WsaStartupOk){
  WSACleanup();
  }
}
int CProxy::StartProxy(int listenport)
{
Socks5ListenPort=listenport;
CanSockProxy=true;
AfxBeginThread(StartSocks5Proxy,(LPVOID)NULL);
return 1;
}


int CProxy::StopProxy()
{
CanSockProxy=false;
return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -