Пример #1
0
        /// <summary>
        /// Creates a UDP association with native data types for transmission
        /// </summary>
        /// <param name="addressType"></param>
        /// <param name="port"></param>
        /// <param name="data"></param>
        public PacketUDP(SOCKS5Protocol.ATYP addressType, IPAddress address, ushort port, byte[] data)
        {
            RSVx2 = SOCKS5Protocol.RSVx2;
            ATYP  = addressType;
            ADDR  = address.GetAddressBytes();

            if (ATYP == SOCKS5Protocol.ATYP.IPV4 && ADDR.Length != 4)
            {
                throw new UDProxyException("Invalid UDP packet parameter: Incorrect IPv4 address length");
            }

            if (ATYP == SOCKS5Protocol.ATYP.IPV6 && ADDR.Length != 16)
            {
                throw new UDProxyException("Invalid UDP packet parameter: Incorrect IPv6 address length");
            }

            PORT = BitConverter.GetBytes(port);
            DATA = data;
        }
Пример #2
0
        public PacketRequest(MemoryStream stream)
        {
            VER  = (byte)stream.ReadByte();
            CMD  = (SOCKS5Protocol.CMD)stream.ReadByte();
            RSV  = (byte)stream.ReadByte();
            ATYP = (SOCKS5Protocol.ATYP)stream.ReadByte();

            // Get IP address
            switch (ATYP)
            {
            case SOCKS5Protocol.ATYP.IPV4:
                ADDR = new byte[4];
                break;

            case SOCKS5Protocol.ATYP.IPV6:
                ADDR = new byte[16];
                break;

            case SOCKS5Protocol.ATYP.DOMAIN:
                int bytes = stream.ReadByte();
                ADDR = new byte[bytes];
                break;

            default:
                ATYP = SOCKS5Protocol.ATYP.INVALID;
                ADDR = new byte[4];
                break;
            }
            stream.Read(ADDR, 0, ADDR.Length);

            // Endian check (f*****g network byte order)
            // When held in a received packet, port byte order is little endian
            // When held in a reply/transmission packet, port byte order is big endian
            stream.Read(PORT, 0, 2);
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(PORT);
            }

            stream.Close();
        }
Пример #3
0
        /// <summary>
        /// Creates a UDP association packet from a received one
        /// </summary>
        /// <param name="stream"></param>
        public PacketUDP(MemoryStream stream)
        {
            stream.Read(RSVx2, 0, 2);
            FRAG = (byte)stream.ReadByte();
            ATYP = (SOCKS5Protocol.ATYP)stream.ReadByte();

            // TODO: Turn this into external logic plz
            // Get IP address
            switch (ATYP)
            {
            case SOCKS5Protocol.ATYP.IPV4:
                ADDR = new byte[4];
                break;

            case SOCKS5Protocol.ATYP.IPV6:
                ADDR = new byte[16];
                break;

            case SOCKS5Protocol.ATYP.DOMAIN:
                int bytes = stream.ReadByte();
                ADDR = new byte[bytes];
                break;

            default:
                ATYP = SOCKS5Protocol.ATYP.INVALID;
                ADDR = new byte[4];
                break;
            }
            stream.Read(ADDR, 0, ADDR.Length);
            stream.Read(PORT, 0, 2);
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(PORT);
            }

            // Trim the fat bitch!
            DATA = new byte[(stream.Length - stream.Position)];
            stream.Read(DATA, 0, DATA.Length);
            stream.Close();
        }
Пример #4
0
        public PacketReplyRequest(PacketRequest packet)
        {
            if (packet.ATYP == SOCKS5Protocol.ATYP.INVALID)
            {
                // We were given an invalid ATYP, so no more processing.
                REP  = SOCKS5Protocol.REP.ILLEGAL_ADDRESS;
                ATYP = SOCKS5Protocol.ATYP.INVALID;
                throw new UDProxyException("Given an illegal address type.");
            }

            if (!Enum.IsDefined(typeof(SOCKS5Protocol.CMD), packet.CMD))
            {
                // We were given an invalid command, so no more processing
                REP = SOCKS5Protocol.REP.ILLEGAL_COMMAND;
                throw new UDProxyException("Given an illegal request command.");
            }

            ATYP = packet.ATYP;
            ADDR = packet.ADDR;

            // Our listening port for UDP, so the client knows where to transmit to
            PORT = (ushort)UDProxy.gConfiguration.Config["ListenPort"];
        }
Пример #5
0
 public PacketUDP(SOCKS5Protocol.ATYP addressType, string domain, ushort port, byte[] data)
 {
     throw new NotImplementedException();
 }