Beispiel #1
0
        private ProxyToken HandleV5RequestData(DataAdapterToStream stm)
        {
            SocksProxyToken ret = null;
            IPAddress addr = null;
            string addrName = null;
            bool ipv6 = false;
            ushort port = 0;

            int ver = stm.ReadByte();
            int code = stm.ReadByte();
            stm.ReadByte(); // Reserved
            int type = stm.ReadByte();

            if ((ver == 5) && (code == 1))
            {
                byte[] data = null;

                switch (type)
                {
                    case 1: // IPv4
                        {
                            data = GeneralUtils.ReadBytes(stm, 4);
                            addr = new IPAddress(data);
                            addrName = addr.ToString();
                        }
                        break;
                    case 3: // Domain name
                        {
                            int nameLen = stm.ReadByte();
                            if (nameLen > 0)
                            {
                                data = GeneralUtils.ReadBytes(stm, nameLen);
                                addrName = Encoding.ASCII.GetString(data);
                            }
                        }
                        break;
                    case 4: // IPv6
                        data = GeneralUtils.ReadBytes(stm, 16);
                        addr = new IPAddress(data);
                        addrName = addr.ToString();
                        ipv6 = true;
                        break;
                    default:
                        break;
                }

                port = ReadUShort(stm);

                if ((addrName != null) && (port > 0))
                {
                    _logger.LogVerbose(CANAPE.Net.Properties.Resources.SocksProxyServer_V5ConnectionLog, addrName, port);
                    ret = new SocksProxyToken(addr, addrName, port, IpProxyToken.IpClientType.Tcp, ipv6, stm, 5);
                }
            }

            return ret;
        }
Beispiel #2
0
        private IDataAdapter HandleSocksV4Response(SocksProxyToken token)
        {
            DataAdapterToStream stm = token.Adapter;
            byte[] resp = new byte[8];
            resp[1] = token.Status == NetStatusCodes.Success ? REQUEST_SUCCEEDED : REQUEST_FAILED;

            stm.Write(resp, 0, resp.Length);

            if(token.Status == NetStatusCodes.Success)
            {
                // Clear adapter value so it wont get disposed
                token.Adapter = null;
                return new StreamDataAdapter(stm);
            }
            else
            {
                return null;
            }
        }
Beispiel #3
0
        private IDataAdapter HandleSocksV5Response(SocksProxyToken token)
        {
            DataAdapterToStream stm = token.Adapter;
            byte[] returnData = new byte[10];

            returnData[0] = 5;
            if(token.Status == NetStatusCodes.Success)
            {
                returnData[1] = 0;
            }
            else
            {
                // General failure
                returnData[1] = 1;
            }

            // Write out data in one go, otherwise Java has a habit of breaking
            returnData[2] = 0;
            returnData[3] = 1;
            stm.Write(returnData, 0, returnData.Length);

            if (token.Status == NetStatusCodes.Success)
            {
                // Clear adapter value so it wont get disposed
                token.Adapter = null;
                return new StreamDataAdapter(stm);
            }
            else
            {
                return null;
            }
        }
Beispiel #4
0
        private ProxyToken HandleSocksv4Request(DataAdapterToStream stm)
        {
            SocksProxyToken ret = null;

            int req = stm.ReadByte();
            ushort port = ReadUShort(stm);
            byte[] addrBytes = GeneralUtils.ReadBytes(stm, 4);
            IPAddress addr = new IPAddress(addrBytes);
            string addrName = addr.ToString();

            // Discard username
            ReadZString(stm);

            if ((addrBytes[0] == 0) && (addrBytes[1] == 0) && (addrBytes[2] == 0) && (addrBytes[3] != 0))
            {
                StringBuilder builder = new StringBuilder();
                _logger.LogVerbose(CANAPE.Net.Properties.Resources.SocksProxyServer_V4AUsed);
                addrName = ReadZString(stm);
                addr = null;
            }

            if (req == 1)
            {
                _logger.LogVerbose(CANAPE.Net.Properties.Resources.SocksProxyServer_V4ConnectionLog, addrName, port);
                ret = new SocksProxyToken(addr, addrName, port, IpProxyToken.IpClientType.Tcp, false, stm, 4);
            }

            return ret;
        }