Exemple #1
1
        public void StartListening()
        {
            R = RowacCore.R;
            R.Log("[Listener] Starting TCP listener...");
            TcpListener listener = new TcpListener(IPAddress.Any, 28165);
            listener.Start();

            while (true)
            {
                try
                {
                    var client = listener.AcceptSocket();
            #if DEBUG
                    R.Log("[Listener] Connection accepted.");
            #endif

                    var childSocketThread = new Thread(() =>
                    {
                        byte[] data = new byte[1048576]; // for screenshots and tasklists
                        int size = 0;
                        while (client.Available != 0)
                            size += client.Receive(data, size, 256, SocketFlags.None); // TODO: increase reading rate from 256?
                        client.Close();

                        string request = Encoding.ASCII.GetString(data, 0, size);
            #if DEBUG
                        R.Log(string.Format("Received [{0}]: {1}", size, request));
            #endif
                        ParseRequest(request);
                    });
                    childSocketThread.Start();
                }
                catch (Exception ex) { R.LogEx("ListenerLoop", ex); }
            }
        }
Exemple #2
0
        // TODO: fix id parsing
        // TODO: use guid
        private void ParseRequest(string data)
        {
#if !DEBUG
            data = Encoding.ASCII.GetString(Convert.FromBase64String(data));
            string[] split   = data.Split('|'); // 0 - AES; 1 - data
            string   AESData = RSA.Decrypt(split[0], RSA.privKey);
            string   key     = AESData.Split('|')[0];
            string   iv      = AESData.Split('|')[1];
            data = split[1]; // encryped client data
            data = AES.Decrypt(data, key, iv);
#endif
            string[] commands = data.Split('&'); // list of "header=arg"
            ulong    ID       = 0;
            string   GUID     = "";

            foreach (string command in commands)
            {
                try
                {
#if DEBUG
                    R.Log(command);
#endif
                    string[] segment = command.Split(new char[] { '=' }, 2);
                    if (segment.Length != 2) // header and argument
                    {
                        continue;
                    }
                    Header header   = (Header)(int.Parse(segment[0]));
                    string argument = segment[1];

                    switch (header)
                    {
                    case Header.ID:
                        ID = ulong.Parse(argument);
                        break;

                    case Header.Ping:
                        ParsePing(argument, ID);
                        break;

                    case Header.Guid:
                        GUID = ParseGuid(argument, ID);
                        break;

                    case Header.Screenshot:
                        ParseScreenshot(argument, ID);
                        break;

                    case Header.Tasklist:
                        ParseTasklist(argument, ID);
                        break;

                    default:
                        R.Log(string.Format("[Header] Not valid header: {0}. Data: {1}", header, argument));
                        break;
                    }
                }
                catch (Exception ex) { R.LogEx("ParseRequest", string.Format("\"{0}\"; {1}", command, ex.ToString())); }
            }
        }
Exemple #3
0
        internal static void Init()
        {
            try
            {
                R.Log("[RowAC] loading...");

                if (!Directory.Exists(rowacFolder))
                {
                    Directory.CreateDirectory(rowacFolder);
                }
                if (!Directory.Exists(screenshotsFolderPath))
                {
                    Directory.CreateDirectory(screenshotsFolderPath);
                }
                if (!Directory.Exists(taskListsFolderPath))
                {
                    Directory.CreateDirectory(taskListsFolderPath);
                }
                if (!Directory.Exists(logsFolderPath))
                {
                    Directory.CreateDirectory(logsFolderPath);
                }

                rconf = LoadConfig <Config>(Path.Combine(RowacCore.rowacFolder, "rowac.json"));
                if (rconf == null || !rconf.enabled)
                {
                    R.Log("[RowAC] disabled! Check your config.");
                    return;
                }

                AnticheatLocal ACLocal = new AnticheatLocal();
                Anticheat = new Thread(ACLocal.Initialize); // server-side
                Anticheat.Start();

                AnticheatRemote = new Thread(AntiCheat); // ping checking
                AnticheatRemote.Start();

                Listener server = new Listener();
                ServerListener = new Thread(server.StartListening); // client-side listener
                ServerListener.Start();

                R.Log("[RowAC] loaded! Version: " +
                      System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString());
            }
            catch (Exception ex) { R.LogEx("Init", ex); }
        }
Exemple #4
0
        public void StartListening()
        {
            R = RowacCore.R;
            R.Log("[Listener] Starting TCP listener...");
            TcpListener listener = new TcpListener(IPAddress.Any, 28165);

            listener.Start();

            while (true)
            {
                try
                {
                    var client = listener.AcceptSocket();
#if DEBUG
                    R.Log("[Listener] Connection accepted.");
#endif

                    var childSocketThread = new Thread(() =>
                    {
                        byte[] data = new byte[1048576]; // for screenshots and tasklists
                        int size    = 0;
                        while (client.Available != 0)
                        {
                            size += client.Receive(data, size, 256, SocketFlags.None); // TODO: increase reading rate from 256?
                        }
                        client.Close();

                        string request = Encoding.ASCII.GetString(data, 0, size);
#if DEBUG
                        R.Log(string.Format("Received [{0}]: {1}", size, request));
#endif
                        ParseRequest(request);
                    });
                    childSocketThread.Start();
                }
                catch (Exception ex) { R.LogEx("ListenerLoop", ex); }
            }
        }
Exemple #5
0
        private void takeCoordsEvent(object x, ElapsedEventArgs y)
        {
            var connections = RustAPI.GetConnections();

            foreach (var p in connections)
            {
                try
                {
                    var player = RustAPI.GetUser(p);
                    if (player == null)
                    {
                        R.Log("No user on join: " + p.id + " " + p.ipAddress);
                        continue;
                    }

                    if (RustAPI.IsUserConnected(player))
                    {
                        R.Log("NotConnected: " + RustAPI.GetUserName(player) + " - " + RustAPI.GetUserID(player));
                    }

                    if (aconf.adminCheck && RustAPI.IsUserAdmin(player))
                    {
                        continue;
                    }

                    Vector3 CurrentPosition     = RustAPI.GetUserTransform(player).position;
                    Vector2 CurrentPlayerCoords = new Vector2(CurrentPosition.x, CurrentPosition.z); // Ignore Y

                    ulong  playerID   = RustAPI.GetUserID(player);
                    string playerName = RustAPI.GetUserName(player);

                    if (!playerCoordinates.ContainsKey(playerID))
                    {
                        playerCoordinates[playerID] = CurrentPosition;
                        continue;
                    }
                    Vector3 OldPlayerCoordsVector3 = playerCoordinates[playerID];
                    playerCoordinates[playerID] = CurrentPosition;

                    Vector2 OldPlayerCoords = new Vector2(OldPlayerCoordsVector3.x, OldPlayerCoordsVector3.z);

#if DEBUG           // TODO: fix
                    /*
                     *  Log("=== Pos Control ===");
                     *  Log(CurrentPosition.x + " " + CurrentPosition.z);
                     *  Log(Player.GetNetworkPosition().x + " " + Player.GetNetworkPosition().z);
                     *  Log(Player.GetPositionForChecks().x + " " + Player.GetPositionForChecks().z);
                     *  Log("=== =========== ===");
                     */
#endif
                    if (OldPlayerCoords != Vector2.zero && OldPlayerCoords != CurrentPlayerCoords)
                    {
                        float distance = Math.Abs(Vector2.Distance(OldPlayerCoords, CurrentPlayerCoords));
                        float speed    = distance / (float)aconf.checkInterval;
                        R.Log("[Speed] " + playerName + " speed is " + speed.ToString());

                        if (!playerWarnings.ContainsKey(playerID))
                        {
                            playerWarnings[playerID] = 0;
                        }
                        int warnLevel = playerWarnings[playerID];

                        if (speed < aconf.sayChatSpeed) // decrease warning level for user
                        {
                            playerWarnings[playerID] = (warnLevel > 0 ? warnLevel - 1 : 0);
                        }
                        else if (warnLevel == aconf.warnLimit && // Time to ban
                                 (speed > aconf.teleportSpeed && !aconf.allowTP)) // Not allow to TP
                        {
                            if (speed > aconf.sayChatSpeed && aconf.sayChat)
                            {
                                RustAPI.SayToChat("Moved with speed" + speed.ToString("F2"));
                            }
                            else if (speed > aconf.banSpeed && aconf.ban)
                            {
                                BanCheater(player, "Moved with speed" + speed.ToString("F2"));
                            }
                            else if (speed > aconf.kickSpeed && aconf.kick)
                            {
                                R.Log("Kick: " + playerName + ". SpeedHack. Maybe lag (Ping " + RustAPI.GetUserPing(player) + ")");
                                RustAPI.KickUser(player, NetError.Facepunch_Kick_Ban, true);
                            }
                        }

                        // Turn player back
                        if (warnLevel < aconf.warnLimit && speed > aconf.sayChatSpeed)
                        {
                            RustAPI.GetUserTransform(player).position = OldPlayerCoordsVector3;
                            if (speed > aconf.kickSpeed)
                            {
                                playerWarnings[playerID]++;
                            }
                            R.Log("Warning: " + playerName + " moved with speed " + speed.ToString("F2") + ". Warnings: " + warnLevel + ". Ping: " + RustAPI.GetUserPing(player));
                        }
                    }
                }
                catch (Exception ex) { R.LogEx("TakeCoordsLoop", ex); }
            }
        }