private byte[] _requestSocks4(TypeSocks tSocks) { byte[] bRequest = new byte[300]; bRequest[0] = (byte)tSocks; bRequest[1] = (byte)OperationSocks.Connect; return(bRequest); }
/// <summary> /// Create request for Socks4/Socks5 /// </summary> /// <param name="tSocks">Type Socks</param> /// <param name="username">For auth Socks4</param> /// <returns></returns> private byte[] _requestSocks(TypeSocks tSocks, string username = "") { byte[] bRequest = new byte[50]; var port = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)80)); bRequest[0] = (byte)tSocks; bRequest[1] = (byte)OperationSocks.Connect; if (tSocks == TypeSocks.Socks5) { bRequest[2] = 0x00; bRequest[3] = (byte)TypeAddressSocks.HostName; var hostName = Encoding.ASCII.GetBytes("google.com"); bRequest[4] = (byte)hostName.Length; Array.Copy(hostName, 0, bRequest, 5, hostName.Length); bRequest[5 + hostName.Length] = port[0]; bRequest[6 + hostName.Length] = port[1]; } else { bRequest[2] = port[0]; bRequest[3] = port[1]; var ip = Encoding.ASCII.GetBytes("173.194.32.191"); bRequest[4] = ip[0]; bRequest[5] = ip[1]; bRequest[6] = ip[2]; bRequest[7] = ip[3]; if (string.IsNullOrEmpty(username)) { bRequest[8] = 0; } else { var bUser = Encoding.ASCII.GetBytes(username); Array.Copy(bUser, 0, bRequest, 8, bUser.Length); bRequest[8 + bUser.Length] = 0; } } return(bRequest); }
/// <summary> /// Определяет тип Socks по IP и порту /// </summary> /// <param name="ip"></param> /// <param name="port"></param> /// <returns>Возвращает тип Socks - Socks4 или Socks5</returns> public static TypeSocks GetTypeSocks(IPEndPoint ipEnd) { var type = TypeSocks.Error; if (PingIp(ipEnd.Address)) { Socket socket = new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = 7000, ReceiveTimeout = 7000 }; try { socket.Connect(ipEnd); } catch (SocketException ex) { socket.Close(); } if (socket.Connected) { byte[] bSend = new byte[11]; byte[] bReceived = new byte[20]; bSend[0] = (byte)TypeSocks.Socks5; bSend[1] = 0x01; // connection bSend[2] = (byte)AuthSocks.NonAuth; try { //Сначала проверяем на Socks5 socket.Send(bSend, 0, 3, SocketFlags.None); socket.Receive(bReceived, bReceived.Length, 0); TypeSocks.TryParse(bReceived[0].ToString(), out type); if (TypeSocks.Socks5 != type) { socket.Close(); Thread.Sleep(10000); //Проверяем на Socks4 bReceived = new byte[10]; socket = new Socket(ipEnd.AddressFamily, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = 7000, ReceiveTimeout = 7000 }; try { socket.Connect(ipEnd); } catch (SocketException ex) { socket.Close(); } if (socket.Connected) { var bPort = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)80)); bSend[0] = (byte)TypeSocks.Socks4; bSend[2] = bPort[0]; bSend[3] = bPort[1]; var bIP = IPAddress.Parse("173.194.32.191").GetAddressBytes(); bSend[4] = bIP[0]; bSend[5] = bIP[1]; bSend[6] = bIP[2]; bSend[7] = bIP[3]; bSend[8] = 0x00; socket.Send(bSend, 0, 9, SocketFlags.None); socket.Receive(bReceived, bReceived.Length, 0); if (bReceived[1] == 90) { type = TypeSocks.Socks4; } } } } catch { } finally { socket.Close(); } } } return(type); }