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?