Exemplo n.º 1
0
        public WorldServer()
        {
            Config = new WorldServerConfig("Resources/Config/World.ini");

            WorldDatabase = new WorldDatabase(Config);
            if (WorldDatabase.Connection.CheckConnection())
            {
                Console.WriteLine("Connecting to cluster server...");

                int clusterPort    = (int)Config.GetSetting("ClusterPort");
                int worldStartPort = (int)Config.GetSetting("WorldStartPort");

                Console.WriteLine("Searching open port for cluster server communication...");
                while (PortChecker.IsPortAvailable(worldStartPort))
                {
                    Console.WriteLine("Port {0} not available, let's try another port", worldStartPort.ToString());
                    worldStartPort += 1;
                }

                ClusterConnector = new ClusterConnector(clusterPort.ToString(), worldStartPort.ToString());
                ClusterConnector.StartListening();

                // Let's wait a bit to let the subscriber and publisher socket to connect
                Thread.Sleep(1500);
                RegisterChannelRequest request = new RegisterChannelRequest((string)Config.GetSetting("ClusterAuthorizationPassword"), (string)Config.GetSetting("Address"), worldStartPort.ToString(), (string)Config.GetSetting("ChannelName"), 50, ClusterConnector.PublisherSocket);

                ClusterConnector.OnRegisterChannelSuccesful += new ClusterConnector.RequestSuccesfulHandler(OnRegisterChannelSuccesful);
            }
        }
Exemplo n.º 2
0
        public void CheckPort_ShouldThrowExceptionBecauseHostNull()
        {
            PortChecker checker     = new PortChecker();
            Port        portToCheck = new Port();

            Assert.Throws <ArgumentNullException>("_host", () => checker.CheckPort(portToCheck));
        }
Exemplo n.º 3
0
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            IPortForwarder portForwarder = new PortForwarder();
            IPortChecker   portChecker   = new PortChecker();

            Application.Run(new FrmMain(portForwarder, portChecker));
        }
Exemplo n.º 4
0
        public void CheckPort_ValidGoogleTcpPortCheck(string host, ushort port, PortState expect)
        {
            PortChecker checker = new PortChecker();

            checker.InstallHost(host);
            Port portToCheck = new Port(port, System.Net.Sockets.ProtocolType.Tcp);

            PortState actual = checker.CheckPort(portToCheck);

            Assert.Equal(expect, actual);
        }
Exemplo n.º 5
0
        private int getNextFreePort()
        {
            while (currentPort <= MAX_PORT && !PortChecker.CheckIfPortIsOpen(currentPort))
            {
                currentPort++;
            }

            if (currentPort > MAX_PORT)
            {
                throw new Exception("Exceeded range of ports!");
            }

            return(currentPort);
        }
Exemplo n.º 6
0
        public void CheckPort_ShouldSetOpenedBecauseTcpPortIsZero()
        {
            int         expectPort  = 0;
            PortState   expectState = PortState.Opened;
            PortChecker checker     = new PortChecker();

            checker.InstallHost("localhost");
            Port port = new Port();

            PortState actual = checker.CheckPort(port);

            Assert.Equal(expectPort, port.Value);
            Assert.Equal(expectState, actual);
        }
Exemplo n.º 7
0
        public ClusterServer()
        {
            Console.WriteLine("Test if port 28000 is in use...");
            if (PortChecker.IsPortAvailable(28000))
            {
                Console.WriteLine("Port 28000 is already in use - You can only run one login server on one computer");
                return;
            }

            Rijndael.Initiate();

            Config = new ClusterServerConfig("Resources/Config/Cluster.ini");

            int loginPort = (int)Config.GetSetting("LoginPort");

            Console.WriteLine("Test if port {0} is in use...", loginPort.ToString());
            if (PortChecker.IsPortAvailable(loginPort))
            {
                Console.WriteLine("Port {0} is already in use - You can only run one login server on one computer", loginPort);
                return;
            }

            int receivePort = (int)Config.GetSetting("InterserverPort");

            Console.WriteLine("Search open port for interserver connection...");
            while (PortChecker.IsPortAvailable(receivePort))
            {
                Console.WriteLine("Port {0} not available", receivePort.ToString());
                receivePort += 1;
            }

            LoginDatabase   = new LoginDatabase(Config);
            ClusterDatabase = new ClusterDatabase(Config);
            if (ClusterDatabase.Connection.CheckConnection() && LoginDatabase.Connection.CheckConnection())
            {
                Console.WriteLine("Connecting to login server...");

                LoginConnector = new LoginConnector(loginPort.ToString(), receivePort.ToString());
                LoginConnector.StartListening();

                // Let's wait a bit to let the subscriber and publisher socket to connect
                Thread.Sleep(500);
                RegisterClusterRequest request = new RegisterClusterRequest((uint)Config.GetSetting("ClusterId"), (string)Config.GetSetting("ClusterAuthorizationPassword"), (string)Config.GetSetting("ClusterAddress"), receivePort.ToString(), LoginConnector.PublisherSocket);

                LoginConnector.OnClusterRequestSuccesful += new LoginConnector.RequestSuccesfulHandler(OnRegisterClusterRequestSuccesful);
            }
        }
Exemplo n.º 8
0
        public LoginServer()
        {
            Console.WriteLine("Test if port 23000 is in use...");
            if (PortChecker.IsPortAvailable(23000))
            {
                Console.WriteLine("Port 23000 is already in use - You can only run one cluster on one computer");
                return;
            }

            Config = new LoginServerConfig("Resources/Config/Login.ini");

            int loginPort = (int)Config.GetSetting("LoginPort");

            Console.WriteLine("Test if port {0} is in use...", loginPort.ToString());
            if (PortChecker.IsPortAvailable(loginPort))
            {
                Console.WriteLine("Port {0} is already in use - You can only run one login server on one computer", loginPort);
                return;
            }

            LoginDatabase = new LoginDatabase(Config);
            if (LoginDatabase.Connection.CheckConnection())
            {
                Rijndael.Initiate();

                this.m_ClusterConnector = new ClusterConnector(loginPort.ToString());
                this.m_ClusterConnector.StartListening();

                ClusterManager = new ClusterManager();
                Console.WriteLine("Listening for cluster servers...");

                this.m_ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                this.m_ClientSocket.Bind(new IPEndPoint(IPAddress.Any, 23000));
                this.m_ClientSocket.Listen(100);
                ClientManager = new ClientManager();

                Thread acceptClientsThread = new Thread(() => ClientManager.AcceptUsers(this.m_ClientSocket));
                acceptClientsThread.Start();

                Thread processClientsThread = new Thread(() => ClientManager.ProcessUsers());
                processClientsThread.Start();

                Console.WriteLine("Listening for clients...");
            }
        }
Exemplo n.º 9
0
        internal static void CheckNetwork()
        {
            //Check to see if AGD can see this server. If so let the owner know :)
            if (Options.OpenPortChecker && !Context.StartupOptions.NoNetworkCheck)
            {
                var serverAccessible = PortChecker.CanYouSeeMe(Options.ServerPort, out var externalIp);

                Console.WriteLine(Strings.Portchecking.connectioninfo);
                if (!string.IsNullOrEmpty(externalIp))
                {
                    Console.WriteLine(Strings.Portchecking.publicip, externalIp);
                    Console.WriteLine(Strings.Portchecking.publicport, Options.ServerPort);

                    Console.WriteLine();
                    if (serverAccessible)
                    {
                        Console.WriteLine(Strings.Portchecking.accessible);
                        Console.WriteLine(Strings.Portchecking.letothersjoin);
                    }
                    else
                    {
                        Console.WriteLine(Strings.Portchecking.notaccessible);
                        Console.WriteLine(Strings.Portchecking.debuggingsteps);
                        Console.WriteLine(Strings.Portchecking.checkfirewalls);
                        Console.WriteLine(Strings.Portchecking.checkantivirus);
                        Console.WriteLine(Strings.Portchecking.screwed);
                        Console.WriteLine();
                        if (!UpnP.ForwardingSucceeded())
                        {
                            Console.WriteLine(Strings.Portchecking.checkrouterupnp);
                        }
                    }
                }
                else
                {
                    Console.WriteLine(Strings.Portchecking.notconnected);
                }

                Console.WriteLine();
            }
        }
Exemplo n.º 10
0
        public void CheckStatus()
        {
            Task t = Task.Run(() =>
            { //Prevents Lock of Form
                try
                {
                    Parallel.ForEach(ips, (x) => //does parallel but only exit after all finished
                    {
                        if (x.Last_Checked == null || (x.Last_Checked + TimeSpan.FromSeconds(cycleTime) < DateTime.Now && x.RunningCheck == false))
                        {//Never checked or last Check older than cycleTime
                            x.RunningCheck  = true;
                            x.Last_Checked  = DateTime.Now;
                            PingReply reply = Pinger.PingIP(x.IP_Address.ToString(), timeout);  //new PingReply();

                            if (reply != null)
                            {//Ping is not null (means success or not)
                                string hostname = "";
                                if (cbHostnames.Checked == true && x.Hostname != null)
                                { //Resolve hostname is enabled
                                    hostname   = Hostname.Get(x.IP_Address.ToString());
                                    x.Hostname = hostname;
                                }
                                bool online = false;

                                if (reply.Status == IPStatus.Success)
                                {//Host is online
                                    online = true;
                                    if (x.First_Seen == null)
                                    {
                                        x.First_Seen = DateTime.Now;
                                    }
                                    x.Roundtrip = Convert.ToInt32(reply.RoundtripTime);
                                    x.Last_Seen = DateTime.Now;
                                    if (port != 0)
                                    {
                                        x.PortOpen = PortChecker.ScanPort(x.IP_Address, port);
                                    }
                                }
                                if (x.Active == false && online == true)
                                {//Host Status changed from offline to online
                                 //New Host
                                    if (port != 0)
                                    {
                                        messageBox.Push("NEW:                   " + x.IP_Address + ", " + x.Hostname + " First Seen: " + x.First_Seen + " Port " + port + ": " + x.PortOpen);
                                    }
                                    else
                                    {
                                        messageBox.Push("NEW:                   " + x.IP_Address + ", " + x.Hostname + " First Seen: " + x.First_Seen);
                                    }
                                }
                                else if (x.Active == true && online == false)
                                {//Host Status changed from online to offline
                                    if (port != 0)
                                    {
                                        messageBox.Push("DISAPPEARED: " + x.IP_Address + ", " + x.Hostname + " Last Seen: " + x.Last_Seen + " Port " + port + ": " + x.PortOpen);
                                    }
                                    else
                                    {
                                        messageBox.Push("DISAPPEARED: " + x.IP_Address + ", " + x.Hostname + " Last Seen: " + x.Last_Seen);
                                    }
                                }
                                x.Last_Checked = DateTime.Now;
                                x.Active       = online;
                                x.CountChecks++;
                                x.RunningCheck = false;
                            }
                        }
                    });
                }
                catch (System.AggregateException e)
                {
                    throw e;
                }
            });

            UpdateMessage();
        }
Exemplo n.º 11
0
        private void SerPort_Event(object sender, EventArgs e)
        {
            EventArgs ee = new EventArgs();

            PortChecker.OnTick(ee);
        }
Exemplo n.º 12
0
        /// <summary>
        /// Completes an async event to receive data.
        /// </summary>
        /// <param name="result"></param>
        private void OnServerReceiveData(IAsyncResult result)
        {
            // Prevent invalid calls to this function.
            if (!this._isRunning || result.IsCompleted == false || !(result.AsyncState is Socket))
            {
                this.Stop();
                return;
            }

            Socket server = ((Socket)result.AsyncState);

            // Attempt to end the async call.
            int nRecvCount = 0;

            try
            {
                try
                {
                    nRecvCount = server == null ? 0 : server.EndReceive(result);
                }
                catch
                {
                    // TODO: atleast log the exception.
                }

                if (nRecvCount == 0)
                {
                    this.Stop();
                    return;
                }
            }
            catch (Exception ex)
            {
                log.Debug(ex.ToString());
                this.Stop();
                return;
            }

            // Read the current packet.
            byte[] recvData = new byte[nRecvCount];
            Array.Copy(this._serverBuffer, 0, recvData, 0, nRecvCount);
            this._serverBacklog.AddRange(recvData);

            // Iterate through the whole received stream, identify packets, parse them and delete them from the buffer.
            while (true)
            {
                /*
                 * L2Packet structure:
                 | 2 byte size | 1 byte id | up to 65535 bytes for data (payload) |
                 */

                // If packet buffer is lesser than 3 bytes there is no valid packet for parsing (the minimum is atleast 3 bytes (2 bytes for size, 1 for id)
                if (this._serverBacklog.Count < 3)
                {
                    break;
                }

                while (L2Injector._sgObjInit == false)
                {
                    Thread.Sleep(20);
                }

                // Calculate the packet length by parsing the first 2 bytes.
                int nPacketSize = BitConverter.ToUInt16(this._serverBacklog.ToArray(), 0);
                if (this._serverBacklog.Count < nPacketSize)
                {
                    break;
                }

                byte[] receivedPacket = new byte[nPacketSize];
                Array.Copy(this._serverBacklog.ToArray(), 0, receivedPacket, 0, nPacketSize);

                this._serverBacklog.RemoveRange(0, nPacketSize);

                // Send this packet to the client..
                if (isAuth)
                {
                    _blowfishDecypher.decryptBlock(receivedPacket, 2, receivedPacket, 2);
                }
                if (this.isAuth && receivedPacket[2] != 4)
                {
                    _blowfishDecypher.encryptBlock(receivedPacket, 2, receivedPacket, 2);
                    this.SendToClientRaw(receivedPacket);
                }
                else if (isAuth)
                {
                    _blowfishDecypher.encryptBlock(receivedPacket, 2, receivedPacket, 2);
                }

                int asd = 0;
                // TODO: Get rid of this control flow.
                if (isAuth)
                {
                    if (!_isInit)
                    {
                        // Decipher the initial packet with the static blowfish key.
                        _blowfishDecypher.setKey(Blowfish.StaticKey);
                        for (int i = 0; i < receivedPacket.Length - 2; i += 8)
                        {
                            _blowfishDecypher.decryptBlock(receivedPacket, 2 + i, receivedPacket, 2 + i);
                        }

                        // Remove the xor mask.
                        int xorKey = receivedPacket[receivedPacket.Length - 8] |
                                     (receivedPacket[receivedPacket.Length - 7] << 8) |
                                     (receivedPacket[receivedPacket.Length - 6] << 16) |
                                     (receivedPacket[receivedPacket.Length - 5] << 24);
                        Blowfish.RemoveXorMask(receivedPacket, ref xorKey);

                        //Blowfish.ApplyXorMask(receivedPacket, ref xorKey);

                        // Extract the new blowfish key for the rest of the authentification communication.
                        byte[] dynamicKey = new byte[16];
                        Array.Copy(receivedPacket, 155, dynamicKey, 0, 16);

                        // Cypher the packet again.
                        for (int i = 0; i < receivedPacket.Length - 2; i += 8)
                        {
                            _blowfishDecypher.encryptBlock(receivedPacket, 2 + i, receivedPacket, 2 + i);
                        }

                        // Set the newly acquired blowfish key from the server.
                        _blowfishDecypher.setKey(dynamicKey);
                        _isInit = true;
                    }
                    else
                    {
                        for (int i = 0; i < receivedPacket.Length - 2; i += 8)
                        {
                            _blowfishDecypher.decryptBlock(receivedPacket, 2 + i, receivedPacket, 2 + i);
                        }

                        if (receivedPacket[2] == 4)
                        {
                            //Restore default connect procedure, so client can connect to our proxied servers.
                            L2Injector.RestoreHookedBytes();

                            int serverCount = receivedPacket[3];
                            int serverBlock = 21;
                            for (int i = 0; i < serverCount; i++)
                            {
                                var remoteIp = receivedPacket[6 + i * serverBlock] + "." +
                                               receivedPacket[7 + i * serverBlock] + "." +
                                               receivedPacket[8 + i * serverBlock] + "." +
                                               receivedPacket[9 + i * serverBlock];
                                var remotePort = receivedPacket[10 + i * serverBlock] |
                                                 (receivedPacket[11 + i * serverBlock] << 8);

                                bool isHosted  = false;
                                int  localPort = PortChecker.GetOpenPort();

                                //Check if this game server is already hosted
                                foreach (var gserver in Server.GameServers)
                                {
                                    if (remoteIp == gserver.RemoteAddress && gserver.BotInstance == BotInstance)
                                    {
                                        isHosted  = true;
                                        localPort = gserver.LocalPort;
                                    }
                                }

                                if (!isHosted)
                                {
                                    //brazil hack
                                    //if (remoteIp == "181.119.6.72")
                                    //    remotePort = 7779;

                                    //if (remoteIp == "45.126.211.94")
                                    //    remotePort = 7779;

                                    Server gameServer = new Server
                                    {
                                        IsAuthServer = false,
                                        LocalAddress = "127.0.0.1", //localhost
                                        LocalPort    = localPort,
                                        //this will result in the default game port (7777) - server id (ex. 16 for naia) = 7761 (thus avoiding conflicts)
                                        RemoteAddress = remoteIp,   //current naia game server ip
                                        RemotePort    = remotePort, //7777
                                        ServerId      = receivedPacket[5 + i * serverBlock],
                                        L2Injector    = L2Injector,
                                        BotInstance   = this.BotInstance
                                    };
                                    gameServer.Start();

                                    //log.Debug($"{remoteIp}:{remotePort}");
                                    Server.GameServers.Add(gameServer);
                                }

                                // Modifying the packet to point to our proxys.
                                string[] ipParts = "127.0.0.1".Split('.');
                                receivedPacket[6 + i * serverBlock]  = byte.Parse(ipParts[0]);
                                receivedPacket[7 + i * serverBlock]  = byte.Parse(ipParts[1]);
                                receivedPacket[8 + i * serverBlock]  = byte.Parse(ipParts[2]);
                                receivedPacket[9 + i * serverBlock]  = byte.Parse(ipParts[3]);
                                receivedPacket[10 + i * serverBlock] = (byte)(localPort & 0xff);
                                receivedPacket[11 + i * serverBlock] = (byte)((localPort >> 8) & 0xff);
                            }
                        }

                        for (int i = 0; i < receivedPacket.Length - 2; i += 8)
                        {
                            _blowfishDecypher.encryptBlock(receivedPacket, 2 + i, receivedPacket, 2 + i);
                        }

                        _blowfishDecypher.decryptBlock(receivedPacket, 2, receivedPacket, 2);

                        if (receivedPacket[2] == 4)
                        {
                            _blowfishDecypher.encryptBlock(receivedPacket, 2, receivedPacket, 2);
                            this.SendToClientRaw(receivedPacket);
                        }
                    }
                }
                else
                {
                    if (!_isInit)
                    {
                        byte[] dynamicKeyBytes = new byte[8];
                        //receivedPacket[4] = 0;
                        //receivedPacket[5] = 0;
                        //receivedPacket[6] = 0;
                        //receivedPacket[7] = 0;
                        //receivedPacket[8] = 0;
                        //receivedPacket[9] = 0;
                        //receivedPacket[10] = 0;
                        //receivedPacket[11] = 0;
                        Array.Copy(receivedPacket, 4, dynamicKeyBytes, 0, 8);

                        //int seed = BitConverter.ToInt32(receivedPacket.ToArray(), 21);
                        if (JUSTASNIFFER)
                        {
                            log.Debug(BitConverter.ToInt64(dynamicKeyBytes, 0));
                            log.Debug(string.Join(", ", dynamicKeyBytes.Select(b => string.Format("{0:X2} ", b))));
                        }

                        _gamePacketObfuscator = new LegacyInGameCipher(dynamicKeyBytes, 0);
                        if (!L2Injector.IsSGLoaded())
                        {
                            _isInit = true;
                        }
                    }
                    else
                    {
                        lock (syncLock2)
                        {
                            _gamePacketObfuscator.DeobfuscatePacketFromServer(receivedPacket);
                            _secondaryGamePacketObfuscator?.DeobfuscatePacketFromServer(receivedPacket);
                            //log.Debug(string.Join(", ", receivedPacket.Select(b => string.Format("{0:X2} ", b))));
                            //PacketParser.HandleIncomingPacket(receivedPacket, this.data, this.logger);

                            if (!JUSTASNIFFER)
                            {
                                var packet = packetFactory.CreatePacket(receivedPacket, true);
                                packet?.Parse(BotInstance.PlayerData);

                                //if(packet == null && receivedPacket[2] != 74)
                                //log.Debug(receivedPacket[2]);
                            }


                            _secondaryGamePacketObfuscator?.ObfuscatePacketForClient(receivedPacket);
                            _gamePacketObfuscator.ObfuscatePacketForClient(receivedPacket);
                        }
                    }
                }

                if (!this.isAuth && receivedPacket != null)
                {
                    lock (syncLock)
                    {
                        this.SendToClientRaw(receivedPacket);
                    }
                }
            }

            // Begin listening for next packet.
            this.Server_BeginReceive();
        }