/// <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; }
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(); }
/// <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(); }
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"]; }
public PacketUDP(SOCKS5Protocol.ATYP addressType, string domain, ushort port, byte[] data) { throw new NotImplementedException(); }