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); } } }
// 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())); } } }
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); } }
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); } } }
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); } } }