Example #1
0
        public static byte[] BuildSocks4Command(byte command, HostPortCollection dstHost)
        {
            dstHost.UseHost = false; // 4A Doesnt work
            byte[] destAddr = dstHost.UseAvaiableHost ? new byte[] { 0, 0, 0, 1 } : dstHost.Addr.GetAddressBytes();

            byte[] destPort    = new byte[] { Convert.ToByte(dstHost.Port / 256), Convert.ToByte(dstHost.Port % 256) };
            byte[] userIdBytes = string.Empty.GetBytes(Encoding.ASCII);

            byte[] hostBytes = dstHost.UseAvaiableHost ? dstHost.Host.GetBytes(Encoding.ASCII) : null;
            var    rqLen     = dstHost.UseAvaiableHost && hostBytes != null ? 10 + userIdBytes.Length + hostBytes.Length : 9 + userIdBytes.Length;

            byte[] request = new byte[rqLen];

            //  set the bits on the request byte array
            request[0] = 0x04;//SOCKS4_VERSION_NUMBER
            request[1] = command;
            destPort.CopyTo(request, 2);
            destAddr.CopyTo(request, 4);
            userIdBytes.CopyTo(request, 8);         // copy the userid to the request byte array
            request[8 + userIdBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId
            if (dstHost.UseAvaiableHost && hostBytes != null)
            {
                hostBytes.CopyTo(request, 9 + userIdBytes.Length);         // copy the host name to the request byte array
                request[9 + userIdBytes.Length + hostBytes.Length] = 0x00; // null (byte with all zeros) terminator for userId
            }

            return(request);
        }
Example #2
0
        public override async Task <Stream> OpenStreamAsync(HostPortCollection dstSrv)
        {
            var socket = new TcpClient();

            if (await SwallowExceptionUtils.TryExec(() => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected)
            {
                var buf       = new byte[2];
                int bytesRead = 0;
                var nStream   = socket.GetStream();

                await nStream.WriteAsync(Socks5Payload, 0, Socks5Payload.Length);

                bytesRead = await nStream.ReadAsync(buf, 0, 2);

                if (bytesRead != 2)
                {
                    Status = ProxyStatus.ProtocolError;
                    socket.Close();
                    socket.Dispose();
                }

                if (buf[0] == 0x05 && buf[1] == 0x00)
                {
                    //Continue...
                    var cmd = ProxyCommandBuildUtils.BuildSocks5Command(0x01, dstSrv); //0x01 = SOCKS5_CMD_CONNECT
                    await nStream.WriteAsync(cmd, 0, cmd.Length);

                    Array.Clear(cmd, 0, cmd.Length);
                    bytesRead = await nStream.ReadAsync(cmd, 0, cmd.Length);

                    if (bytesRead > 2 && cmd[1] == 0x00)
                    {
                        return(nStream);
                    }
                    else
                    {
                        Status = ProxyStatus.ProtocolError;
                        Debugger.Break();
                    }
                }
                else
                {
                    Status = buf[0] == 0x02 ? ProxyStatus.PasswordRequired : ProxyStatus.ProtocolError;
                }
                nStream?.Close();
                nStream?.Dispose();
            }
            else
            {
                Status = ProxyStatus.ConnectionFail;
            }

            return(null);
        }
Example #3
0
        public override async Task <Stream> OpenStreamAsync(HostPortCollection dstSrv)
        {
            var socket = new TcpClient();

            if (await SwallowExceptionUtils.TryExec(() => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected)
            {
                var nStream = socket.GetStream();
                var cmd     = ProxyCommandBuildUtils.GenerateHttpConnectCommand(dstSrv.Host, dstSrv.Port);

                await nStream.WriteAsync(cmd, 0, cmd.Length);

                return(nStream);
            }
            return(null);
        }
Example #4
0
        public static byte[] BuildSocks5Command(byte command, HostPortCollection dstHost)
        {
            byte addressType = dstHost.UseAvaiableHost ? GetDstAddrType(dstHost.Host) : GetDstAddrType(dstHost.Addr);

            byte[] destAddr = dstHost.UseAvaiableHost ? GetHostBytes(dstHost.Host) : dstHost.Addr.GetAddressBytes();
            byte[] destPort = new byte[] { Convert.ToByte(dstHost.Port / 256), Convert.ToByte(dstHost.Port % 256) };

            byte[] request = new byte[4 + destAddr.Length + 2];
            request[0] = 5;    //SOCKS5_VERSION_NUMBER
            request[1] = command;
            request[2] = 0x00; //SOCKS5_RESERVED
            request[3] = addressType;
            destAddr.CopyTo(request, 4);
            destPort.CopyTo(request, 4 + destAddr.Length);

            return(request);
        }
Example #5
0
        public override async Task <Stream> OpenStreamAsync(HostPortCollection dstSrv)
        {
            var socket = new TcpClient();

            if (await SwallowExceptionUtils.TryExec(
                    () => socket.ConnectAsync(_proxyInformation.Addr, _proxyInformation.Port)) && socket.Connected)
            {
                var buf       = new byte[8];
                int bytesRead = 0;

                var nStream = socket.GetStream();
                var cmd     = ProxyCommandBuildUtils.BuildSocks4Command(0x01, dstSrv); //SOCKS4_CMD_CONNECT

                await nStream.WriteAsync(cmd, 0, cmd.Length);

                bytesRead = await nStream.ReadAsync(buf, 0, buf.Length);

                if (bytesRead > 1 && buf[1] == 0x5A)
                {
                    return(nStream);
                }
                else
                {
                    if (buf[1] == 0xFF)
                    {
                        //May be socks5?
                        Debugger.Break();
                    }
                    Status = ProxyStatus.ProtocolError;
                }
            }
            else
            {
                Status = ProxyStatus.ConnectionFail;
            }
            socket.Close();
            socket.Dispose();
            return(null);
        }
Example #6
0
 public HttpConnect(HostPortCollection proxyInformation) : base(proxyInformation)
 {
 }
Example #7
0
 public Socks4(HostPortCollection proxyInformation) : base(proxyInformation)
 {
 }