示例#1
0
        public override void HandlePacket(object sender, string packet_raw)
        {
            Packet packet = Packet.Deserialize(packet_raw);

            if (packet.Type == "ConnectPipePacket")
            {
                ConnectPipePacket_PacketProcessor connectPipePacket_PacketProcessor
                    = new ConnectPipePacket_PacketProcessor(Connection, ConnectPipePacket.Deserialize(packet_raw),
                                                            new Dictionary <Guid, Client> {
                    { SlaveGlobalData.LocalClient.UniqueId, SlaveGlobalData.LocalClient }
                });

                connectPipePacket_PacketProcessor.Process();
                return;
            }
            if (packet.Type == "DisconnectPipePacket")
            {
                DisconnectPipePacket_PacketProcessor disconnectPipePacket_PacketProcessor
                    = new DisconnectPipePacket_PacketProcessor(Connection, DisconnectPipePacket.Deserialize(packet_raw),
                                                               new Dictionary <Guid, Client> {
                    { SlaveGlobalData.LocalClient.UniqueId, SlaveGlobalData.LocalClient }
                });

                disconnectPipePacket_PacketProcessor.Process();
                return;
            }
            if (packet.Type == "ConnectShellPacket")
            {
                ConnectShellPacket_PacketProcessor connectShellPacket_PacketProcessor
                    = new ConnectShellPacket_PacketProcessor(Connection, ConnectShellPacket.Deserialize(packet_raw),
                                                             new Dictionary <Guid, Client> {
                    { SlaveGlobalData.LocalClient.UniqueId, SlaveGlobalData.LocalClient }
                },
                                                             SlaveGlobalData.MasterServerInfo.RemoteServer);

                Shell shell = connectShellPacket_PacketProcessor.Process();
                if (shell == null)
                {
                    return;                // fuckup
                }
                SlaveGlobalData.ShellListenerLoop = new PacketListenerLoop(shell.Connection, new Shell_PacketHandler(shell.Connection, SlaveGlobalData.LocalClient, shell));
                SlaveGlobalData.ShellInstance     = shell;

                SlaveGlobalData.ShellOutputChangedHandler = (s, e) =>
                {
                    Shell_IO_ChangedPacket shell_IO_Changed = new Shell_IO_ChangedPacket(ChangeType.Output, e.Change);
                    shell.Connection.SendPacket(shell_IO_Changed);
                };

                shell.ShellOutputChanged += SlaveGlobalData.ShellOutputChangedHandler;

                Task.Run(() => SlaveGlobalData.ShellListenerLoop.Run());
            }
        }
        public override void HandlePacket(object sender, string packet_raw)
        {
            Packet packet = Packet.Deserialize(packet_raw);

            if (packet.Type == "Shell_IO_ChangedPacket")
            {
                Shell_IO_ChangedPacket shell_IO_changed = Shell_IO_ChangedPacket.Deserialize(packet_raw);
                if (shell_IO_changed.ChangeType == ChangeType.Input)
                {
                    ShellInstance.Write(shell_IO_changed.Change);
                }
            }
            if (packet.Type == "SetShellStatePacket")
            {
                SetShellStatePacket setShellState = SetShellStatePacket.Deserialize(packet_raw);
                if (setShellState.ShellUniqueId != ShellInstance.UniqueId)
                {
                    ShellStateSetPacket result_fail = new ShellStateSetPacket(setShellState.ClientUniqueId, setShellState.ShellUniqueId,
                                                                              setShellState.ShellState, false);
                    Connection.SendPacket(result_fail);
                    return;
                }

                switch (setShellState.ShellState)
                {
                case ShellState.Running:
                    ShellInstance.Start();
                    break;

                case ShellState.Stopped:
                    ShellInstance.Stop();
                    break;
                }

                ShellStateSetPacket result_success = new ShellStateSetPacket(setShellState.ClientUniqueId, setShellState.ShellUniqueId,
                                                                             setShellState.ShellState, true);
                Connection.SendPacket(result_success);
            }
            if (packet.Type == "DisconnectShellPacket")
            {
                DisconnectShellPacket disconnectShellPacket = DisconnectShellPacket.Deserialize(packet_raw);
                if (disconnectShellPacket.ClientUniqueId != Client.UniqueId)
                {
                    ShellDisconnectedPacket result_fail = new ShellDisconnectedPacket(Client.UniqueId, ShellInstance.UniqueId, false);
                    Connection.SendPacket(result_fail);
                    return;
                }
                if (disconnectShellPacket.ShellUniqueId != ShellInstance.UniqueId)
                {
                    ShellDisconnectedPacket result_fail = new ShellDisconnectedPacket(Client.UniqueId, ShellInstance.UniqueId, false);
                    Connection.SendPacket(result_fail);
                    return;
                }

                ShellInstance.Stop();
                ShellInstance.ShellOutputChanged         -= SlaveGlobalData.ShellOutputChangedHandler;
                SlaveGlobalData.ShellOutputChangedHandler = null;
                SlaveGlobalData.ShellInstance             = null;
                if (SlaveGlobalData.ShellListenerLoop != null)
                {
                    SlaveGlobalData.ShellListenerLoop.AbortLoop = true;
                    SlaveGlobalData.ShellListenerLoop           = null;
                }
                DisconnectPipePacket disconnectPipePacket = new DisconnectPipePacket(Client.UniqueId, PipeType.Shell);
                Client.Pipes.MainPipe.SendPacket(disconnectPipePacket);

                ShellDisconnectedPacket result_success = new ShellDisconnectedPacket(Client.UniqueId, ShellInstance.UniqueId, true);
                Connection.SendPacket(result_success);
            }
        }
示例#3
0
        public override void HandlePacket(object sender, string packet_raw)
        {
            Packet packet = Packet.Deserialize(packet_raw);

            if (packet.Type == "AuthenticateConnectionPacket")
            {
                AuthenticateConnectionPacket_PacketProcessor authenticateConnectionPacket_PacketProcessor
                    = new AuthenticateConnectionPacket_PacketProcessor(Connection, AuthenticateConnectionPacket.Deserialize(packet_raw));
                Client client = authenticateConnectionPacket_PacketProcessor.Process();
                MasterListener.ConnectedClients.Add(client.UniqueId, client);

                /////////////////////////////////////////////////////////////////////
                Task.Run(() =>
                {
                    //Thread.Sleep(1000);
                    //ConnectShellPacket shell_packet = new ConnectShellPacket(client.UniqueId);
                    //client.Pipes.MainPipe.SendPacket(shell_packet);
                    //Console.WriteLine($"Told client {client.UniqueId} to spawn a new shell.");
                });
                /////////////////////////////////////////////////////////////////////
                return;
            }
            if (packet.Type == "ConnectPipePacket")
            {
                ConnectPipePacket connectPipePacket = ConnectPipePacket.Deserialize(packet_raw);
                ConnectPipePacket_PacketProcessor connectPipePacket_PacketProcessor
                    = new ConnectPipePacket_PacketProcessor(Connection, connectPipePacket, MasterListener.ConnectedClients);

                connectPipePacket_PacketProcessor.Process();

                if (connectPipePacket.PipeType == PipeType.Ping)
                {
                    // Exception in packet handling (dosłownie wyjątek, nie błąd)
                    if (!MasterListener.ConnectedClients.ContainsKey(connectPipePacket.ClientId))
                    {
                        return;
                    }
                    PacketListenerLoop parent_loop = sender as PacketListenerLoop;
                    TcpConnection      connection  = parent_loop.Connection;
                    parent_loop.AbortLoop = true;
                    Task.Run(() =>
                    {
                        // Redirect connection to the ping service
                        MasterListener.PingService.AddClient(MasterListener.ConnectedClients[connectPipePacket.ClientId], false);
                        MasterListener.PingService.ConnectedClients[connectPipePacket.ClientId].WaitForTimeout();
                        Console.WriteLine("Stop redirecting ping pipe");
                        Task.Run(() => parent_loop.Run());
                    });
                }
                return;
            }
            if (packet.Type == "DisconnectPipePacket")
            {
                DisconnectPipePacket_PacketProcessor disconnectPipePacket_PacketProcessor
                    = new DisconnectPipePacket_PacketProcessor(Connection, DisconnectPipePacket.Deserialize(packet_raw), MasterListener.ConnectedClients);

                disconnectPipePacket_PacketProcessor.Process();
                return;
            }
            if (packet.Type == "ShellConnectedPacket")
            {
                // Exception in packet handling (dosłownie wyjątek, nie błąd)
                ShellConnectedPacket shellConnectedPacket = ShellConnectedPacket.Deserialize(packet_raw);
                if (!shellConnectedPacket.Success)
                {
                    return;
                }
                // Redirects all packets from now on to a new packet handler
                PacketListenerLoop parent_loop = sender as PacketListenerLoop;
                TcpConnection      connection  = parent_loop.Connection;
                parent_loop.AbortLoop = true;
                Task.Run(() =>
                {
                    // Spawn a new shell emulator window
                    ShellWindow shellWindow = new ShellWindow(shellConnectedPacket.ShellUniqueId, connection,
                                                              MasterListener.ConnectedClients[shellConnectedPacket.ClientUniqueId]);
                    shellWindow.ShowDialog();
                    // Stop redirecting the packets on this connection
                    Console.WriteLine("Stop redirecting");
                    Task.Run(() => parent_loop.Run());
                });
            }
        }
示例#4
0
 public DisconnectPipePacket_PacketProcessor(TcpConnection connection, DisconnectPipePacket packet, Dictionary <Guid, Client> connectedClients)
 {
     Connection       = connection;
     Packet           = packet;
     ConnectedClients = connectedClients;
 }