public static SocketConnectionResult TryCreateTunnel(Socket socks5Socket, string destAddress, int destPort, ProxyInfo proxy, IDnsResolver dnsResolver = null) { try { // SEND HELLO byte[] SendByte = BuildHelloMessage(proxy.Authenticate); var s = ""; for (var i = 1; i <= SendByte.Length; i++) { s += SendByte[i - 1] + ","; } Console.WriteLine("[Socks5.cs]send:" + s); socks5Socket.Send(SendByte); // RECEIVE HELLO RESPONSE - HANDLE AUTHENTICATION byte[] GetByte = new byte[255]; var len = socks5Socket.Receive(GetByte); Console.WriteLine("[Socks5.cs]len:" + len); if (len != 2) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[0] != SocksVersion) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[1] == (byte)Authentication.UsernamePassword) { if (!proxy.Authenticate) { // Proxy server is requesting UserPass auth even tho we did not allow it return(SocketConnectionResult.InvalidProxyResponse); } else { // We have to try and authenticate using the Username and Password // https://tools.ietf.org/html/rfc1929 socks5Socket.Send(proxy.AuthenticationMessage); if (socks5Socket.Receive(GetByte) != 2) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[0] != SubnegotiationVersion) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[1] != 0) { return(SocketConnectionResult.AuthenticationError); } } } else if (GetByte[1] != (byte)Authentication.NoAuthentication) { return(SocketConnectionResult.AuthenticationError); } if (dnsResolver != null && Helpers.GetAddressType(destAddress) == AddressType.DomainName) { var ipAddress = dnsResolver.TryResolve(destAddress); if (ipAddress == null) { return(SocketConnectionResult.HostUnreachable); } destAddress = ipAddress.ToString(); } // SEND REQUEST socks5Socket.Send(BuildRequestMessage(Command.Connect, Helpers.GetAddressType(destAddress), destAddress, destPort)); // RECEIVE RESPONSE int received = socks5Socket.Receive(GetByte); if (received < 8) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[0] != SocksVersion) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[1] > 8) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[1] != 0) { return((SocketConnectionResult)GetByte[1]); } if (GetByte[2] != 0) { return(SocketConnectionResult.InvalidProxyResponse); } if (GetByte[3] != 1 && GetByte[3] != 3 && GetByte[3] != 4) { return(SocketConnectionResult.InvalidProxyResponse); } AddressType boundAddress = (AddressType)GetByte[3]; if (boundAddress == AddressType.IPv4) { if (received != 10) { return(SocketConnectionResult.InvalidProxyResponse); } } else if (boundAddress == AddressType.IPv6) { if (received != 22) { return(SocketConnectionResult.InvalidProxyResponse); } } else { int domainLength = GetByte[4]; if (received != 7 + domainLength) { return(SocketConnectionResult.InvalidProxyResponse); } } return(SocketConnectionResult.OK); } catch (SocketException ex) { return(ex.ToConnectionResult()); } catch { return(SocketConnectionResult.UnknownError); } }
private void HandleRequest(Socket clientSocket) { Socket socks5Socket = null; bool success = true; try { if (TryReadTarget(clientSocket, out string hostname, out int port, out string httpVersion, out bool connect, out string request, out byte[] overRead)) { try { socks5Socket = CreateSocket(); socks5Socket.Connect(dnsResolver.TryResolve(ProxyList[0].Hostname), ProxyList[0].Port); } catch (SocketException ex) { SendError(clientSocket, ex.ToConnectionResult()); success = false; } catch (Exception) { SendError(clientSocket, Enums.SocketConnectionResult.UnknownError); success = false; } if (success) { SocketConnectionResult result; for (int i = 0; i < ProxyList.Length - 1; i++) { var proxy = ProxyList[i]; var nextProxy = ProxyList[i + 1]; result = Socks5.TryCreateTunnel(socks5Socket, nextProxy.Hostname, nextProxy.Port, proxy, ResolveHostnamesLocally ? dnsResolver : null); if (result != SocketConnectionResult.OK) { SendError(clientSocket, result, httpVersion); success = false; break; } } if (success) { var lastProxy = ProxyList.Last(); result = Socks5.TryCreateTunnel(socks5Socket, hostname, port, lastProxy, ResolveHostnamesLocally ? dnsResolver : null); if (result != SocketConnectionResult.OK) { SendError(clientSocket, result, httpVersion); success = false; } else { if (!connect) { SendString(socks5Socket, request); if (overRead != null) { socks5Socket.Send(overRead, SocketFlags.None); } } else { SendString(clientSocket, httpVersion + "200 Connection established\r\nProxy-Agent: MihaZupan-HttpToSocks5Proxy\r\n\r\n"); } } } } } else { success = false; } }
private void HandleRequest(Socket clientSocket) { Socket socks5Socket = null; bool success = true; try { if (TryRead(clientSocket, out string hostname, out int port, out string httpVersion, out bool connect, out string request, out byte[] overRead)) { Console.WriteLine("[HttpToSocks5Proxy---->]hostname: " + hostname); Console.WriteLine("[HttpToSocks5Proxy---->]port: " + port); Console.WriteLine("[HttpToSocks5Proxy---->]httpVersion: " + httpVersion); Console.WriteLine("[HttpToSocks5Proxy---->]connect: " + connect); Console.WriteLine("[HttpToSocks5Proxy---->]request: " + request); Console.WriteLine("[HttpToSocks5Proxy---->]overRead: " + overRead); try { Console.WriteLine("[HttpToSocks5Proxy---->]ProxyList[0].Hostname: " + ProxyList[0].Hostname); Console.WriteLine("[HttpToSocks5Proxy---->]ProxyList[0].Port: " + ProxyList[0].Port); socks5Socket = CreateSocket(); socks5Socket.Connect(dnsResolver.TryResolve(ProxyList[0].Hostname), ProxyList[0].Port); } catch (SocketException ex) { Console.WriteLine("[HttpToSocks5Proxy---->]SocketException: " + ex); SendError(clientSocket, ex.ToConnectionResult()); success = false; } catch (Exception ex) { Console.WriteLine("[HttpToSocks5Proxy---->]Exception: " + ex); SendError(clientSocket, Enums.SocketConnectionResult.UnknownError); success = false; } Console.WriteLine("[HttpToSocks5Proxy---->]success: " + success); if (success) { SocketConnectionResult result; Console.WriteLine("[HttpToSocks5Proxy---->]ProxyList.Length: (如果>=2,跑)" + ProxyList.Length); for (int i = 0; i < ProxyList.Length - 1; i++)//作者并没错,至少有两个才跑 { var proxy = ProxyList[i]; var nextProxy = ProxyList[i + 1]; Console.WriteLine("[HttpToSocks5Proxy---->]nextProxy.Hostname: " + nextProxy.Hostname); Console.WriteLine("[HttpToSocks5Proxy---->]nextProxy.Port: " + nextProxy.Port); result = Socks5.TryCreateTunnel(socks5Socket, nextProxy.Hostname, nextProxy.Port, proxy, ResolveHostnamesLocally ? dnsResolver : null); if (result != SocketConnectionResult.OK) { SendError(clientSocket, result, httpVersion); success = false; break; } } if (success) { var lastProxy = ProxyList.Last(); Console.WriteLine("[HttpToSocks5Proxy---->]lastProxy.Hostname: " + lastProxy.Hostname); Console.WriteLine("[HttpToSocks5Proxy---->]lastProxy.Port: " + lastProxy.Port); result = Socks5.TryCreateTunnel(socks5Socket, hostname, port, lastProxy, ResolveHostnamesLocally ? dnsResolver : null); Console.WriteLine("[HttpToSocks5Proxy---->]!!!"); if (result != SocketConnectionResult.OK) { Console.WriteLine("[HttpToSocks5Proxy---->]result != SocketConnectionResult.OK"); SendError(clientSocket, result, httpVersion); success = false; } else { if (!connect) { Console.WriteLine("[HttpToSocks5Proxy---->]connect fail"); SendString(socks5Socket, request); if (overRead != null) { socks5Socket.Send(overRead, SocketFlags.None); } } else { Console.WriteLine("[HttpToSocks5Proxy---->]connect success"); SendString(clientSocket, httpVersion + "200 Connection established\r\nProxy-Agent: MihaZupan-HttpToSocks5Proxy\r\n\r\n"); } } } } } else { success = false; } }