Exemplo n.º 1
0
 public Log(StreamWriter stream, ProxySettings settings)
 {
     Stream = stream;
     MemoryStream = new MemoryStream();
     MinecraftStream = new MinecraftStream(MemoryStream);
     Settings = settings;
 }
Exemplo n.º 2
0
 public Proxy(ILogProvider logProvider, ProxySettings settings)
 {
     LogProvider = logProvider;
     Settings = settings;
     LocalReader = new PacketReader(PacketContext.ClientToServer);
     RemoteReader = new PacketReader(PacketContext.ServerToClient);
 }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 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());
 }
Exemplo n.º 5
0
        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');
        }
Exemplo n.º 6
0
        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);
        }