public Log(StreamWriter stream, ProxySettings settings) { Stream = stream; MemoryStream = new MemoryStream(); MinecraftStream = new MinecraftStream(MemoryStream); Settings = settings; }
public Proxy(ILogProvider logProvider, ProxySettings settings) { LogProvider = logProvider; Settings = settings; LocalReader = new PacketReader(PacketContext.ClientToServer); RemoteReader = new PacketReader(PacketContext.ServerToClient); }
public Proxy(NetworkStream client, NetworkStream server, Log log, ProxySettings settings) { Client = client; Server = server; Log = log; ClientStream = new MinecraftStream(new BufferedStream(Client)); ServerStream = new MinecraftStream(new BufferedStream(Server)); CryptoServiceProvider = new RSACryptoServiceProvider(1024); ServerKey = CryptoServiceProvider.ExportParameters(true); Settings = settings; }
public FileLogProvider(ProxySettings settings, string file) { int number = 1; while (stream == null) { try { stream = new StreamWriter(file, true); } catch (IOException) { file = number + file; number++; } } stream.AutoFlush = true; this.settings = settings; stream.WriteLine("Log opened on " + DateTime.Now.ToLongDateString() + " at " + DateTime.Now.ToLongTimeString()); stream.WriteLine("Settings:"); stream.WriteLine(settings.ToString()); }
static void Main(string[] args) { ProxySettings = new ProxySettings(); // Load plugins into AppDomain foreach (var plugin in Directory.GetFiles(Directory.GetCurrentDirectory(), "*.dll")) { try { Assembly.LoadFile(plugin); } catch { } } LoadPlugins(); bool remoteSet = false, localSet = false; // Interpret command line args for (int i = 0; i < args.Length; i++) { var arg = args[i]; if (arg.StartsWith("-")) { switch (arg) { case "--authenticate-clients": ProxySettings.AuthenticateClients = true; break; case "--local-endpoint": ProxySettings.LocalEndPoint = ParseEndPoint(args[++i]); break; case "--remote-endpoint": ProxySettings.RemoteEndPoint = ParseEndPoint(args[++i], 25565); break; case "--filter": ProxySettings.PacketFilter = ParseFilter(args[++i]); break; case "--unfilter": var filter = ParseFilter(args[++i]); ProxySettings.PacketFilter.RemoveAll(p => filter.Contains(p)); break; case "--omit-client": ProxySettings.LogClient = false; break; case "--omit-server": ProxySettings.LogServer = false; break; case "--username": ProxySettings.Username = args[++i]; break; case "--password": ProxySettings.Password = args[++i]; break; case "--help": DisplayHelp(); return; default: var eventArgs = new UnrecognizedArgumentEventArgs { Argument = arg, Args = args, Index = i, Handled = false }; if (UnrecognizedArgument != null) UnrecognizedArgument(null, eventArgs); if (!eventArgs.Handled) { Console.WriteLine("Invalid command line arguments. Use --help for more information."); return; } break; } } else { if (!remoteSet) { ProxySettings.RemoteEndPoint = ParseEndPoint(arg, 25565); remoteSet = true; } else if (!localSet) { ProxySettings.LocalEndPoint = ParseEndPoint(arg); localSet = true; } else { var eventArgs = new UnrecognizedArgumentEventArgs { Argument = arg, Args = args, Index = i, Handled = false }; if (UnrecognizedArgument != null) UnrecognizedArgument(null, eventArgs); if (!eventArgs.Handled) { Console.WriteLine("Invalid command line arguments. Use --help for more information."); return; } } } } if (ProxySettings.Password == null) { // Grab lastlogin if possible var login = LastLogin.GetLastLogin(); if (login != null) { if (ProxySettings.Username == null) ProxySettings.Username = login.Username; ProxySettings.Password = login.Password; } } Listener = new TcpListener(ProxySettings.LocalEndPoint); Sessions = new List<Proxy>(); Listener.Start(); Listener.BeginAcceptTcpClient(AcceptClient, null); Console.WriteLine("Proxy started on " + ProxySettings.LocalEndPoint); Console.WriteLine("Press 'q' to exit."); ConsoleKeyInfo cki = new ConsoleKeyInfo(); do { cki = Console.ReadKey(); } while (cki.KeyChar != 'q'); }
static void Main(string[] args) { settings = new ProxySettings(); // TEST CODE //PacketReader reader = new PacketReader(PacketContext.ClientToServer); //byte[] key = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; //var encrypter = new BufferedBlockCipher(new CfbBlockCipher(new AesFastEngine(), 8)); //encrypter.Init(true, new ParametersWithIV(new KeyParameter(key), key, 0, 16)); //reader.Decrypter = new BufferedBlockCipher(new CfbBlockCipher(new AesFastEngine(), 8)); //reader.Decrypter.Init(false, new ParametersWithIV(new KeyParameter(key), key, 0, 16)); //reader.EncryptionEnabled = true; //byte[] data = new byte[] { 0 }; //data = encrypter.ProcessBytes(data); //Array.Copy(data, 0, reader.Buffer, reader.Index, data.Length); //var packets = reader.TryReadPackets(data.Length); //data = new byte[] { 1, 2, 3, 4, 0, 1, 2, 3, 4, 0 }; //data = encrypter.ProcessBytes(data); //Array.Copy(data, 0, reader.Buffer, reader.Index, data.Length); //packets = reader.TryReadPackets(data.Length); //data = new byte[] { 1, 2, 3 }; //data = encrypter.ProcessBytes(data); //Array.Copy(data, 0, reader.Buffer, reader.Index, data.Length); //packets = reader.TryReadPackets(data.Length); //data = new byte[] { 4, 0 }; //data = encrypter.ProcessBytes(data); //Array.Copy(data, 0, reader.Buffer, reader.Index, data.Length); //packets = reader.TryReadPackets(data.Length); // END TEST CODE bool setRemote = false; string username = null, password = null; for (int i = 0; i < args.Length; i++) { var arg = args[i]; switch (arg) { case "--username": case "-u": username = args[++i]; break; case "--password": case "-p": password = args[++i]; break; case "--suppress-client": case "-sc": settings.LogClient = false; break; case "--suppress-server": case "-ss": settings.LogServer = false; break; case "--enable-profiling": case "-pr": settings.EnableProfiling = true; // TODO break; case "--filter": case "-f": string filter = args[++i]; string[] ids = filter.Split(','); settings.FilterPackets = new byte[ids.Length]; int j = 0; foreach (var id in ids) settings.FilterPackets[j++] = byte.Parse(id, NumberStyles.HexNumber); break; case "--!filter": case "-!f": string exclude = args[++i]; string[] xids = exclude.Split(','); settings.UnloggedPackets = new byte[xids.Length]; int k = 0; foreach (var id in xids) settings.UnloggedPackets[k++] = byte.Parse(id, NumberStyles.HexNumber); break; case "--endpoint": case "-ep": settings.LocalEndPoint = ParseEndPoint(args[++i]); break; case "--suppress-packet": case "-sp": string packet = args[++i].ToLower(); string[] parts = packet.Split(':'); if (parts[1].Contains("c")) settings.ClientSupressedPackets.Add(byte.Parse(parts[0], NumberStyles.HexNumber)); if (parts[1].Contains("s")) settings.ServerSupressedPackets.Add(byte.Parse(parts[0], NumberStyles.HexNumber)); break; case "--persistent-session": case "-ps": settings.SingleSession = false; break; case "--output": case "-o": settings.FileName = args[++i]; break; case "--port": settings.LocalEndPoint.Port = int.Parse(args[++i]); break; default: if (!setRemote) { settings.RemoteEndPoint = ParseEndPoint(arg); setRemote = true; } else { DisplayHelp(); return; } break; } } if (username == null) { var login = Minecraft.GetLastLogin(); if (login != null) { username = login.Username; password = login.Password; } } else if (password == null) { Console.Write("Password for " + username + ": "); password = ReadPassword(); } if (username != null && password != null) { var session = Minecraft.DoLogin(username, password); if (string.IsNullOrEmpty(session.Error)) settings.UserSession = session.SessionID; else { Console.WriteLine("Login failed."); return; } } LocalListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); LocalListener.Bind(settings.LocalEndPoint); LocalListener.Listen(10); LocalListener.BeginAccept(AcceptConnection, null); Console.WriteLine("Listening on " + settings.LocalEndPoint + "; Press any key to exit."); Console.ReadKey(true); }