Пример #1
0
        private byte[] _requestSocks4(TypeSocks tSocks)
        {
            byte[] bRequest = new byte[300];
            bRequest[0] = (byte)tSocks;
            bRequest[1] = (byte)OperationSocks.Connect;

            return(bRequest);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }