SocksV5 connection call



  • Gibt es jemand der sich mal mein SocksV5 client connect call ansehen möchte. Das ganze ist mit sockets gebaut.
    Wenn ja wäre ich um ein paar Antworten dankbar.

    1. Wie würdet ihr einen time-out timer bauen ?
    2. Was könnte man besser machen ? Obwohl ich eigentlich sehr zufrieden bin.

    Momentan können bis zu 8 SocksV5 Server angegeben werden + den destination Host.
    Auth. Methoden (no auth) und (username/password).



  • Die etwas gekürzten dateien.

    netlib.c

    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
    #include "netlib.h"
    
    int GetOctetsFromIpV4String(char *ip_str ,char *octet_str);
    int GetOctetsFromUShortPort(unsigned short dest_port ,char *octet_str_port);
    
    int GetAddrFromStr(char *iporname, SOCKADDR_IN *addr_struct)
    {
    	HOSTENT *header = 0;
    	unsigned long ip = 0;
    
    	if(iporname == NULL || addr_struct == NULL) {
    		return 1;
    	}
    
    	ip = inet_addr(iporname);
    	if(ip != INADDR_NONE) {
    		addr_struct->sin_addr.s_addr = ip;
    		return 0;
    
    	} else {
    
    		header = gethostbyname(iporname);
    		if(header == NULL) {
    			return 1;
    		} else {
    			memcpy(&(addr_struct->sin_addr) ,header->h_addr_list[0] ,4);
    		}
    
    	}
    
    	return 0;
    
    }
    
    int TcpConnectTo(char *host_str ,SOCKET *p_sock ,SOCKADDR_IN *addr_struct ,unsigned short port)
    {
    	int rc = 0;
    	long request = 0;
    	SOCKET sock = 0;
    	SOCKADDR_IN tmp_addr_struct;
    
    	/* Create and define socket */
    	sock = socket(AF_INET ,SOCK_STREAM ,0);
    	if(sock == INVALID_SOCKET) {
    		#ifdef OUTPUT_ON
    			printf("\nSocket(), error code :%i", WSAGetLastError());
    		#endif
    		return 1;
    	}
    
    	/* Define address struct */
    	memset(&tmp_addr_struct,0,sizeof(SOCKADDR_IN));
    	tmp_addr_struct.sin_family = AF_INET;
    	tmp_addr_struct.sin_port = htons(port);
    
    	/* Resolve hostname from string */
    	request = GetAddrFromStr(host_str, &tmp_addr_struct);
    	if(request) {
    		#ifdef OUTPUT_ON
    		printf("\nGetAddrFromStr(), error code :%i\n",WSAGetLastError());
    		#endif
    		return 1;
    	}
    
    	/* Connect to host */
    	rc = connect(sock ,(SOCKADDR*)&tmp_addr_struct ,sizeof(SOCKADDR));
    	if(rc == SOCKET_ERROR) {
    		#ifdef OUTPUT_ON
    			printf("\nConnect(), error code :%i\n",WSAGetLastError());
    		#endif
    		return 1;
    	}
    
    	*p_sock = sock;
    
    	memcpy(addr_struct  ,&tmp_addr_struct ,sizeof(tmp_addr_struct));
    
    	return 0;
    }
    
    int TcpConnectToOverSocksProxyChain(SOCKET *p_sock ,SOCKS_V5_HOST_ADDR_INFO_STRUCT *socks_host_list_struct ,DEST_HOST_ADDR_INFO *dest_addr_info ,int auth_method ,int nhosts )
    {
    	char octet_string[4];
    	char octet_str_port[2];
    	char tmp_dest_host[100];
    	char recvbuf[1000];
    	char sendbuf[1000];
    	size_t ulen = 0 ,plen = 0;
    	SOCKADDR_IN addr_struct;
    	SOCKET sock = 0;
    	int nh;
    
    	/* Socks v5 protocol ------------------------------------------------------------------------------------------------------- */
    
    	/* Connect to first socks server */
    	if( TcpConnectTo(&socks_host_list_struct->ip_elem[0][0] ,&sock ,&addr_struct ,socks_host_list_struct->port_elem[0][0]) ) {
    		#ifdef OUTPUT_ON
    		printf("Connection failed ...\n");
    		#endif
    		return 1;
    	} else {
    		#ifdef OUTPUT_ON
    		printf("Connect to socks server [%s:%i] succeeded ...\n",&socks_host_list_struct->ip_elem[0][0] ,socks_host_list_struct->port_elem[0][0]);
    		#endif
    	}
    
    	for(nh=1;nh < nhosts+1;nh++) {
    
    		/* Send socks version and auth methods */
    		#ifdef OUTPUT_ON
    		printf("Send socks version and auth. methods - no auth. or username/password ...\n");
    		#endif
    
    		sendbuf[0] = 0x05;		// Socks ver.	-	5
    		sendbuf[1] = 0x01;		// Methods	-	1
    		if(auth_method == 0) {
    			sendbuf[2] = 0x00;	// Method	0x00	-	no auth
    		} else {
    			sendbuf[2] = 0x02;	// Method	0x02	-	username/password
    		}
    
    		SendData(sock ,&sendbuf[0] ,3);
    
    		/* Recv reply - method accept/close */
    		RecvData(sock ,&recvbuf[0] ,2);
    
    		if((recvbuf[1] != 0x00) && (recvbuf[1] != 0x02)) {
    			#ifdef OUTPUT_ON
    			printf("Method 0x%.2x not accepts ...\n",auth_method);
    			#endif
    			return 1;
    		}
    
    		#ifdef OUTPUT_ON
    		printf("Method 0x%.2x accepts ...\n",recvbuf[1]);
    		#endif
    
    		/* If Auth. method '0x02', send username/password */
    		if((auth_method == 1) && (recvbuf[1] == 0x02)) {
    
    			ulen = strlen(&socks_host_list_struct->username[nh-1][0]);
    			plen = strlen(&socks_host_list_struct->password[nh-1][0]);
    
    			sendbuf[0] = 0x05;														// Socks ver.		-	V5
    			sendbuf[1] = (char) ulen;												// Username len
    			strcpy(&sendbuf[2] ,&socks_host_list_struct->username[nh-1][0]);		// Useername
    			sendbuf[ulen + 2] = (char) plen;										// Password len
    			strcpy(&sendbuf[ulen + 3] ,&socks_host_list_struct->password[nh-1][0]);	// Password
    
    			SendData(sock ,&sendbuf[0] ,(int)((ulen + plen) + 3));
    
    			/* Recv authoristation '0x00' else !'0x00' return 1 */
    			RecvData(sock ,&recvbuf[0] ,2);
    			if(recvbuf[1] != 0x00) {
    				#ifdef OUTPUT_ON
    				printf("Access denied ...\n");
    				#endif
    				return 1;
    			} else {
    				#ifdef OUTPUT_ON
    				printf("Access garanted ...\n");
    				#endif
    			}
    
    		}
    
    		/* Send request */
    		if(nh == nhosts) {
    			strcpy(tmp_dest_host ,&dest_addr_info->ip_elem[0]);
    			GetOctetsFromIpV4String(tmp_dest_host ,octet_string);
    			GetOctetsFromUShortPort(dest_addr_info->port_elem[0] ,octet_str_port);
    		} else {
    			strcpy(tmp_dest_host ,&socks_host_list_struct->ip_elem[nh][0]);
    			GetOctetsFromIpV4String(tmp_dest_host ,octet_string);
    			GetOctetsFromUShortPort(socks_host_list_struct->port_elem[nh][0] ,octet_str_port);
    		}
    
    		sendbuf[0] = 0x05;	//	Sock ver	-	5
    		sendbuf[1] = 0x01;	//	Command	-	connect
    		sendbuf[2] = 0x00;	//	Rsv			-	reserved
    		sendbuf[3] = 0x01;	//	addr type	-	ipv4 32bit
    
    		sendbuf[4] = octet_string[0];	//
    		sendbuf[5] = octet_string[1];	//// dest host ip
    		sendbuf[6] = octet_string[2];	//
    		sendbuf[7] = octet_string[3];	//
    
    		sendbuf[8] = octet_str_port[0];	//
    		sendbuf[9] = octet_str_port[1];	//// dest host port
    
    		SendData(sock ,sendbuf ,4+4+2);
    
    		/* Recv reply */
    		RecvData(sock ,recvbuf ,10);
    
    		if( recvbuf[1] == 0x00 ) {
    			if(nh == nhosts) {
    				#ifdef OUTPUT_ON
    				printf("Connect to host [%s:%i] succeeded ...\n",&dest_addr_info->ip_elem[0] ,dest_addr_info->port_elem[0]);
    				#endif
    			} else {
    				#ifdef OUTPUT_ON
    				printf("Connect to socks server [%s:%i] succeeded ...\n",&socks_host_list_struct->ip_elem[nh][0] ,socks_host_list_struct->port_elem[nh][0]);
    				#endif
    			}
    		}
    		if( recvbuf[1] == 0x01 ) {
    			#ifdef OUTPUT_ON
    			printf("General SOCKS server failure ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x02 ) {
    			#ifdef OUTPUT_ON
    			printf("Connection not allowed by ruleset ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x03 ) {
    			#ifdef OUTPUT_ON
    			printf("Network unreachable ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x04 ) {
    			#ifdef OUTPUT_ON
    			printf("Host unreachable ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x05 ) {
    			#ifdef OUTPUT_ON
    			printf("Connection refused ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x06 ) {
    			#ifdef OUTPUT_ON
    			printf("TTL expired ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x07 ) {
    			#ifdef OUTPUT_ON
    			printf("Command not supported ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x08 ) {
    			#ifdef OUTPUT_ON
    			printf("Address type not supported ...\n");
    			#endif
    			return 1;
    		}
    		if( recvbuf[1] == 0x09 ) {
    			#ifdef OUTPUT_ON
    			printf("to X'FF' unassigned ...\n");
    			#endif
    			return 1;
    		}
    
    	}
    
    	*p_sock = sock;
    
    	return 0;
    }
    
    int SendData(SOCKET sock ,char *sbuf ,int len)
    {
    	int r = 0;
    
    	do
    	{
    		r = send(sock ,&sbuf[0] ,len ,0);
    		if(r == SOCKET_ERROR) {
    			return SOCKET_ERROR;
    		}											
    	}
    	while(r != len);
    
    	return len;
    }
    
    int RecvData(SOCKET sock ,char *rbuf ,int len)
    {
    	int p = 0;
    	int r = 0;
    	int l = len;
    
    	do
    	{
    		r = recv(sock ,&rbuf[p] ,l ,0);
    		if(r == SOCKET_ERROR) {
    			return SOCKET_ERROR;
    		}
    		if(r == 0) {
    			return p;
    		}
    
    		p += r;
    		l -= r;												
    	}
    	while(p != len);
    
    	return len;
    }
    
    int GetOctetsFromIpV4String(char *ip_str ,char *octet_str)
    {
    	char *ptr = NULL;
    	int i = 0;
    
    	ptr = strtok((char *)ip_str, ".");
    	if(ptr == NULL) {
    		return 1;
    	}
    	while(ptr != NULL) {
    		octet_str[i] = (char)atoi(ptr);
    		i += 1;
    		ptr = strtok(NULL, ".");
    		if(ptr == NULL) {
    			return 1;
    		}
    	}
    
    	return 0;
    }
    
    int GetOctetsFromUShortPort(unsigned short dest_port ,char *octet_str_port)
    {
    	unsigned short dport = 0;
    
    	dport = htons(dest_port);
    	memcpy(&octet_str_port[0] ,&dport ,2);
    
    	return 0;
    }
    

    netlib.h

    * Define OUTPUT_ON */
    #define OUTPUT_ON
    
    /* Socks server address info struct */
    
    typedef struct {
    
    	char ip_elem[8][16];
    	unsigned short port_elem[8][1];
    	char username[8][256];
    	char password[8][256];
    
    } SOCKS_V5_HOST_ADDR_INFO_STRUCT;
    
    /* Destination address info struct */
    
    typedef struct {
    
    	char ip_elem[16];
    	unsigned short port_elem[1];
    
    } DEST_HOST_ADDR_INFO;
    
    /* Init winsock 2.2 */
    
    int InitWinSock2(void);
    
    /* Net - addr info */
    
    int GetAddrFromStr(char *iporname, SOCKADDR_IN *addr_struct);
    
    int TcpConnectTo(char *host_str ,SOCKET *p_sock ,SOCKADDR_IN *addr_struct ,unsigned short port);
    
    int TcpConnectToOverSocksProxyChain(SOCKET *p_sock ,SOCKS_V5_HOST_ADDR_INFO_STRUCT *socks_host_list_struct ,DEST_HOST_ADDR_INFO *dest_addr_info ,int auth_method ,int nhosts);
    
    int SendData(SOCKET sock ,char *sbuf ,int len);
    
    int RecvData(SOCKET sock ,char *rbuf ,int len);
    

    Hoffe habe alles hinzugefügt.



  • Niemand hier der mir ein bisschen meine Fehler aufzeigen möchte, oder wie ich dies oder das besser machen könnte?


Anmelden zum Antworten