public string HandlePacketFromServer(ENetPacket packet) { if (MainForm.proxyPeer == null) { return(""); } if (MainForm.proxyPeer.State != ENetPeerState.Connected) { return(""); } if (MainForm.realPeer == null) { return(""); } if (MainForm.realPeer.State != ENetPeerState.Connected) { return(""); } byte[] data = packet.GetPayloadFinal(); if (data.Length > 5) { if (data[5] == 3) { return("_none_"); } } //else //{ //return "_none_"; //} NetTypes.NetMessages msgType = GetMessageType(data); switch (msgType) { case NetTypes.NetMessages.SERVER_HELLO: MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): Initial logon accepted." + "\n"); break; case NetTypes.NetMessages.GAME_MESSAGE: string str = GetProperGenericText(data); MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A game_msg packet was sent: " + str + "\n"); if (str.Contains("Server requesting that you re-logon...")) { MainForm.token = 0; MainForm.doorid = ""; SwitchServers("213.179.209.168", 17234); return("Server forces logon request, switching server automatically so user does not have to cancel to login menu and reconnect."); } break; case NetTypes.NetMessages.GAME_PACKET: byte[] tankPacket = VariantList.get_struct_data(data); if (tankPacket == null) { break; } NetTypes.PacketTypes packetType = GetPacketType(tankPacket); switch (packetType) { case NetTypes.PacketTypes.CALL_FUNCTION: VariantList.VarList VarListFetched = VariantList.GetCall(VariantList.get_extended_data(tankPacket)); VarListFetched.netID = BitConverter.ToInt32(tankPacket, 4); // add netid VarListFetched.delay = BitConverter.ToUInt32(tankPacket, 20); // add keep track of delay modifier int netID = OperateVariant(VarListFetched); string argText = string.Empty; for (int i = 0; i < VarListFetched.functionArgs.Count(); i++) { argText += " [" + i.ToString() + "]: " + (string)VarListFetched.functionArgs[i].ToString(); } MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A function call was requested, see log infos below:\nFunction Name: " + VarListFetched.FunctionName + " parameters: " + argText + " \n"); if (VarListFetched.FunctionName == "OnSendToServer") { return("Server switching forced, not continuing as Proxy Client has to deal with this."); } if (VarListFetched.FunctionName == "onShowCaptcha") { return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side."); } if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("captcha")) { return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side."); } if (VarListFetched.FunctionName == "OnSetPos" && MainForm.ignoreonsetpos && netID == worldMap.netID) { return("Ignored position set by server, may corrupt doors but is used so it wont set back. (CAN BE BUGGY WITH SLOW CONNECTIONS)"); } if (VarListFetched.FunctionName == "OnSpawn" && netID == -2) { return("Modified OnSpawn for unlimited zoom (mstate|1)"); // only doing unlimited zoom and not unlimited punch/place to be sure that no bans occur due to this. If you wish to use unlimited punching/placing as well, change the smstate in OperateVariant function instead. } /*if (VarListFetched.FunctionName == "OnSetClothing" && VarListFetched.netID == worldMap.netID) * { * if (!worldMap.player.didClothingLoad) * { * worldMap.player.didClothingLoad = true; * Task.Delay(400).ContinueWith(t => PacketSending.SendData(data, MainForm.proxyPeer)); * return "applying onsetclothing delayed..."; * } * }*/ // unused since 1.5.5 break; case NetTypes.PacketTypes.SET_CHARACTER_STATE: /*if (!worldMap.player.didCharacterStateLoad) * { * worldMap.player.didCharacterStateLoad = true; // optimization * Task.Delay(400).ContinueWith(t => PacketSending.SendData(data, MainForm.proxyPeer)); * }*/ // unused since 1.5.5 break; case NetTypes.PacketTypes.PING_REQ: SpoofedPingReply(); break; case NetTypes.PacketTypes.LOAD_MAP: if (MainForm.LogText.Length >= 65536) { MainForm.LogText = string.Empty; } worldMap = worldMap.LoadMap(tankPacket); worldMap.player.didCharacterStateLoad = false; worldMap.player.didClothingLoad = false; break; case NetTypes.PacketTypes.MODIFY_ITEM_OBJ: { TankPacket p = TankPacket.UnpackFromPacket(data); if (p.NetID == -1) { if (worldMap == null) { MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n"); break; } worldMap.dropped_ITEMUID++; DroppedObject dItem = new DroppedObject(); dItem.id = p.MainValue; dItem.itemCount = data[16]; dItem.x = p.X; dItem.y = p.Y; dItem.uid = worldMap.dropped_ITEMUID; worldMap.droppedItems.Add(dItem); if (MainForm.cheat_magplant) { TankPacket p2 = new TankPacket(); p2.PacketType = (int)NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ; p2.NetID = p.NetID; p2.X = (int)p.X; p2.Y = (int)p.Y; p2.MainValue = dItem.uid; PacketSending.SendPacketRaw((int)NetTypes.NetMessages.GAME_PACKET, p2.PackForSendingRaw(), MainForm.realPeer); //return "Blocked dropped packet due to magplant hack (auto collect/pickup range) tried to collect it instead, infos of dropped item => uid was " + worldMap.dropped_ITEMUID.ToString() + " id: " + p.MainValue.ToString(); } } } break; default: break; } break; case NetTypes.NetMessages.TRACK: case NetTypes.NetMessages.LOG_REQ: case NetTypes.NetMessages.ERROR: return("Blocked track/logreq/error message type by server."); default: return("(SERVER): An unknown event occured. Message Type: " + msgType.ToString() + "\n"); break; } PacketSending.SendData(data, MainForm.proxyPeer, ENetPacketFlags.Reliable); if (msgType == NetTypes.NetMessages.GAME_PACKET && data[4] > 39) // customizable on which packets you wanna log, for speed im just gonna do this! { TankPacket p = TankPacket.UnpackFromPacket(data); uint extDataSize = BitConverter.ToUInt32(data, 56); byte[] actualData = data.Skip(4).Take(56).ToArray(); byte[] extData = data.Skip(60).ToArray(); string extDataStr = ""; string extDataStrShort = ""; string extDataString = Encoding.UTF8.GetString(extData); for (int i = 0; i < extDataSize; i++) { //ushort pos = BitConverter.ToUInt16(extData, i); extDataStr += extData[i].ToString() + "|"; } return("Log of potentially wanted received GAME_PACKET Data:" + "\npackettype: " + actualData[0].ToString() + "\npadding byte 1|2|3: " + actualData[1].ToString() + "|" + actualData[2].ToString() + "|" + actualData[3].ToString() + "\nnetID: " + p.NetID + "\nsecondnetid: " + p.SecondaryNetID + "\ncharacterstate (prob 8): " + p.CharacterState + "\nwaterspeed / offs 16: " + p.Padding + "\nmainval: " + p.MainValue + "\nX|Y: " + p.X + "|" + p.Y + "\nXSpeed: " + p.XSpeed + "\nYSpeed: " + p.YSpeed + "\nSecondaryPadding: " + p.SecondaryPadding + "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY + "\nExtended Packet Data Length: " + extDataSize.ToString() + "\nExtended Packet Data:\n" + extDataStr + "\n"); return(string.Empty); } else { return(string.Empty); } }
private void Run() { ENetEvent eNetEvent = new ENetEvent(); while (_running) { int result = _eNetHost.Service(eNetEvent, 1000); _logger.Info($"Result: {result}"); switch (eNetEvent.Type) { case ENetEventType.ENET_EVENT_TYPE_CONNECT: _logger.Info( $"A new client connected from: {eNetEvent.Peer.Address.Address}:{eNetEvent.Peer.Address.Port}"); break; case ENetEventType.ENET_EVENT_TYPE_RECEIVE: _logger.Info( $"A packet of length {eNetEvent.Packet.DataLength} was received from {eNetEvent.Peer.Address.Address}:{eNetEvent.Peer.Address.Port} on channel {eNetEvent.ChannelId}"); ENetPacket packet = new ENetPacket(); packet.Data = Encoding.UTF8.GetBytes("Test Response\0"); packet.DataLength = (uint)packet.Data.Length; packet.Flags = ENetPacketFlags.ENET_PACKET_FLAG_RELIABLE; eNetEvent.Peer.Send(eNetEvent.ChannelId, packet); break; case ENetEventType.ENET_EVENT_TYPE_DISCONNECT: _logger.Info( $"Client {eNetEvent.Peer.Address.Address}:{eNetEvent.Peer.Address.Port} disconnected"); break; } } }
private void Peer_OnReceive_Client(object sender, ENetPacket e) { string str = messageHandler.HandlePacketFromServer(e); if (str != "_none_" && str != "") { AppendLog(str); } }
internal ENetAsyncPacket(ENetPacket packet, byte channelId) { ChannelId = channelId; Flags = packet.Flags & ~ENetPacketFlags.NoAllocate; m_PacketDataLen = packet.Data.Length; m_PacketDataBuffer = ArrayPool <byte> .Shared.Rent(m_PacketDataLen); packet.Data.CopyTo(m_PacketDataBuffer); }
public static void SendToClient(ENetPacket packet) { var cpy = packet.GetPayloadCopy(); var dataHex = BitConverter.ToString(cpy).Replace("-", ""); LogServer(dataHex); LocalServer.Broadcast(cpy, 0, ENetPacketFlags.Reliable); }
public unsafe void TestSetAndGetUserDataPacket() { var nativePeer = new NativeENetPacket(); var packet = new ENetPacket(&nativePeer); var data = 1399; packet.SetUserData(data); Assert.IsTrue(packet.TryGetUserData <int>(out var data2)); Assert.AreEqual(data, data2); }
private void Peer_OnReceive(object sender, ENetPacket e) { /*if (proxyPeer == null || realPeer == null) return; * if ((proxyPeer.State != ENetPeerState.Connected || proxyPeer.Data == null) || * (realPeer.State != ENetPeerState.Connected || proxyPeer.Data == null)) return;*/ //use checkPeerUsability if you wanna check for peer, since this is an open source freeware, I will not have to for now. //messageHandler.HandlePacketFromClient(e); string str = messageHandler.HandlePacketFromClient(e); if (str != "_none_" && str != "") { AppendLog(str); } }
private void Peer_OnReceive(object sender, ENetPacket e) { using (var reader = new StreamReader(e.GetPayloadStream(false))) { var name = reader.ReadLine(); var text = reader.ReadToEnd(); if (IsClient) { WriteLog("{0}: {1}", name, text); } else { WriteLog("{0}: {1}", name, text); m_Host.Broadcast(e.GetPayloadFinal(), 0, ENetPacketFlags.Reliable); } } }
public static void OnPacketReceived(ENetPeer peer, ENetPacket packet) { var data = packet.Data.ToArray(); if (peer.TryGetUserData(out Player player)) { switch (data[0]) { case 0x2: case 0x3: new TextEvent(player, packet); break; case 0x4: new TankEvent(player, packet); break; } } else { return; } }
public abstract int peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
private static async void Peer_OnReceive(object sender, ENetPacket e) { byte[] payLoad = e.GetPayloadCopy(); var peer = sender as ENetPeer; var pData = peer.Data as Player; if (pData.Updating) { Console.WriteLine("PACKET DROP"); return; } var world = peer.GetWorld(); (peer.Data as Player).PWorld = world; int type = payLoad[0]; string action = Encoding.ASCII.GetString(payLoad.Take(payLoad.Length - 1).Skip(4).ToArray()); string[] actionArr = action.Split("\n".ToCharArray()); string[,] loginArr = new string[actionArr.Length, 2]; if (actionArr.Length > 17) { try { for (int i = 0; i < actionArr.Length; i++) { for (int j = 0; j < 2; j++) { loginArr[i, j] = actionArr[i].Split('|')[j]; LoginArray = loginArr; } } } catch { } } switch (type) { case 2: // long time = DateTimeOffset.Now.ToUnixTimeMilliseconds(); // if(pData.LastPlayerEnter + 350 < time) // { // (peer.Data as Player).LastPlayerEnter = time; // goto b; // } // else // { // if (action != "action|refresh_item_data\n") return; // } //b:; if (action.Is("action|respawn")) { try { if (action.Is("action|respawn_spike")) { await peer.Respawn(true); } else { await peer.Respawn(false); } } catch (Exception ex) { Console.WriteLine("Respawn Error! Message : " + ex.Message); } } if (action.Is("action|growid")) { try { await peer.SendCreateGID(); return; } catch (Exception ex) { Console.WriteLine("Action|growid error! Message : " + ex.Message); } } else if (action.Is("action|store")) { try { await peer.OnConsoleMessage("Store is not implemented yet!"); Dialog d = new Dialog(); // to create the dialog string dialog = d.SetDefaultColor() .AddBigLabel("Store is not implemented yet!") .EndDialog("nothing", "Cancel", "Ok").Result; await peer.OnDialogRequest(dialog); return; } catch (Exception ex) { Console.WriteLine("Action|store error! Message : " + ex.Message); } } else if (action.Is("action|info")) { try { if (!(peer.Data as Player).HaveGrowID) { await peer.SendCreateGID(); return; } int id = -1; int count = -1; foreach (string to in action.Split("\n".ToCharArray())) { string[] infoDat = action.Split("|".ToCharArray()); if (infoDat.Length == 3) { if (infoDat[1] == "itemID") { int a = Convert.ToInt32(infoDat[2]); if (a > 9279) { return; //thanks for raiter for the fix } else if (a < 0) { return; } else { id = a; } } if (infoDat[1] == "count") { int a1 = Convert.ToInt32(infoDat[2]); if (a1 > 200) { return; } else if (a1 < 200) { return; } else { count = a1; } } } } if (id == -1 || count == -1) { return; } if (ItemsData.Count < id || id < 0) { return; } await peer.OnDialogRequest("set_default_color|`o\n\nadd_label_with_icon|big|`w" + ItemsData[id].Name + "``|left|" + id + "|\n\nadd_spacer|small|\nadd_textbox|" + ItemsData[id].Description + "|left|\nadd_spacer|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"); //enet_host_flush(server); } catch (Exception ex) { Console.WriteLine("Error in action|info! Message : " + ex.Message); } } else if (action.Is("action|dialog_return")) { await DialogHandler.SendDialogAsync(peer, world, action); } else if (action.Is("action|drop\n|itemID|")) { Console.WriteLine("TODO => ACTION_DROP"); } else if (action.Contains("text|")) { try { if (!(peer.Data as Player).HaveGrowID) { await peer.SendCreateGID(); return; } await peer.SendCommands(action); } catch (Exception ex) { Console.WriteLine("action text error! Message : " + ex.Message); } } if (!(peer.Data as Player).InGame) { try { int a = 0; await peer.OnSuperMain(); if (LoginArray[0, 0] == "tankIDName") { a = 2; (peer.Data as Player).TankIDName = LoginArray[0, 1]; (peer.Data as Player).RawName = LoginArray[0, 1]; (peer.Data as Player).DisplayName = LoginArray[0, 1]; (peer.Data as Player).TankIDPassword = LoginArray[1, 1]; (peer.Data as Player).HaveGrowID = true; } if (LoginArray[17 + a, 1].Length < 15 || LoginArray[17 + a, 1].Length > 20 || LoginArray[12 + a, 1].Length < 30 || LoginArray[12 + a, 1].Length > 38) { peer.DisconnectLater(0); } (peer.Data as Player).RequestedName = LoginArray[0 + a, 1]; foreach (char c in (peer.Data as Player).RequestedName) { if (c < 0x20 || c > 0x7A) { await peer.OnConsoleMessage("Bad characters detected in your name! Please remove them!"); peer.DisconnectLater(0); return; } } (peer.Data as Player).Mac = LoginArray[17 + a, 1]; (peer.Data as Player).RID = LoginArray[12 + a, 1]; (peer.Data as Player).Country = LoginArray[15 + a, 1]; if (!(peer.Data as Player).HaveGrowID) { Random r = new Random(); int randomInt = r.Next(100, 1001); (peer.Data as Player).RawName = ""; (peer.Data as Player).DisplayName = (peer.Data as Player).RequestedName + "_" + randomInt; } else { if (!peer.SendLogin().Result) { return; } } await peer.SetHasGrowID((peer.Data as Player).TankIDName, (peer.Data as Player).TankIDPassword); } catch (Exception ex) { Console.WriteLine("Error occured at OnSuperMain! Message : " + ex.Message); } } if (action.Contains("action|enter_game") && (peer.Data as Player).InGame == false) { try { //long joinTime = DateTimeOffset.Now.ToUnixTimeMilliseconds(); //if ((peer.Data as Player).LastPlayerEnter + 4000 < joinTime) //{ // (peer.Data as Player).LastPlayerEnter = joinTime; //} //else //{ // peer.DisconnectLater(0); // return; //} (peer.Data as Player).InGame = true; if ((peer.Data as Player).TankIDName.Any(char.IsSymbol)) { await peer.OnConsoleMessage("Please remove bad characters in your name!"); peer.DisconnectLater(0); return; } await peer.OnConsoleMessage("Welcome to the server!"); await peer.SendWorldOffers(); await peer.UpdateClothes(); Inventory inventory = new Inventory(); InventoryItems items = new InventoryItems { ItemID = 18, ItemCount = 1 }; inventory.Items = inventory.Items.Append(items).ToArray(); items.ItemID = 32; items.ItemCount = 1; inventory.Items = inventory.Items.Append(items).ToArray(); items.ItemID = 2; items.ItemCount = 200; inventory.Items = inventory.Items.Append(items).ToArray(); await peer.SendInventory(inventory); (peer.Data as Player).PlayerInventory = inventory; //await peer.OnDialogRequest("set_default_color|\nadd_label|big|`9Hello!|left|420|\nadd_spacer|small|" + // "\nadd_button|nothing|`oContinue|noflags|0|0|"); } catch (Exception ex) { Console.WriteLine("action enter_game error! Message : " + ex.Message); } } if (Encoding.ASCII.GetString(payLoad.Take(payLoad.Length - 1).Skip(4).ToArray()) == "action|refresh_item_data\n") { try { if (ItemsDat != null) { await peer.OnConsoleMessage("`oOne moment, updating items data..."); peer.Send(ItemsDat, 0, ENetPacketFlags.Reliable); (peer.Data as Player).Updating = true; string iStr = BitConverter.ToString(ItemsDat); iStr = iStr.Replace("-", ""); peer.DisconnectLater(0); } } catch (Exception ex) { Console.WriteLine("refresh_item_data error! Message : " + ex.Message); } } break; case 3: try { bool isJoinReq = false; string[] arr = Encoding.ASCII.GetString(payLoad.Take(payLoad.Length - 1).Skip(4).ToArray()).Split("\n".ToCharArray()); foreach (var a in arr) { if (a == "") { continue; } string id = a.Substring(0, a.IndexOf("|")); string act = a.Substring(a.IndexOf("|") + 1, a.Length - a.IndexOf("|") - 1); if (id == "name" && isJoinReq) { await peer.JoinWorld(act, 0, 0); (peer.Data as Player).World = act; } if (id == "action") { if (act == "join_request") { isJoinReq = true; } if (act == "quit_to_exit") { await peer.SendLeave(); (peer.Data as Player).World = "EXIT"; await peer.SendWorldOffers(); } if (act == "quit") { peer.DisconnectLater(0); } } } } catch (Exception ex) { Console.WriteLine("Error at case 3 of action! Message : " + ex.Message); } break; case 4: byte[] tankUpdatePacket = payLoad.Skip(4).ToArray(); if (tankUpdatePacket.Length != 0) { try { var pMov = UnpackPlayerMoving(tankUpdatePacket); switch (pMov.PacketType) { case 0: (peer.Data as Player).X = (int)pMov.X; (peer.Data as Player).Y = (int)pMov.Y; (peer.Data as Player).IsRotatingLeft = (pMov.CharacterState & 0x10) != 0; await peer.SendPData(pMov); if (!(peer.Data as Player).ClothesUpdated) { (peer.Data as Player).ClothesUpdated = true; await peer.UpdateClothes(); } break; default: break; } var data2 = UnpackPlayerMoving(tankUpdatePacket); if (data2.PacketType != 3) { await peer.SendPacketType(data2.PacketType, pMov, data2, world); } else { await peer.SendPacketType(data2.PacketType, pMov, data2, world); } } catch (Exception ex) { Console.WriteLine("Error occured in packet types! Message : " + ex.Message); } } else { Console.WriteLine("Bad Tank Packet detected!"); } break; case 5: break; case 6: break; } }
unsafe bool handleGameNumber(ClientInfo client, ENetPeer* peer, ENetPacket* packet) { var world = new WorldSendGameNumber(1, client.getName()); return PacketHandlerManager.getInstace().sendPacket(peer, world, Channel.CHL_S2C); }
public static extern void enet_host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet);
public TextEvent(Player player, ENetPacket packet) { Handle(player, GetText(packet.Data.ToArray())); }
static extern int native_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
public static extern int enet_packet_resize(ENetPacket* packet, IntPtr dataLength);
static extern int native_packet_resize(ENetPacket* packet, IntPtr dataLength);
public override int packet_resize(ENetPacket* packet, IntPtr dataLength) { return native_packet_resize(packet, dataLength); }
private void OnReceive(object sender, ENetPacket e) { //SendMovement(); var peer = sender as ENetPeer; var packet = e.GetPayloadCopy(); int packetType = packet[0]; switch (packetType) { case 3: case 2: { var packetData = CTextPacket.Unpack(packet); if (!HasLoggedIn) { var requestedName = packetData["requestedName"]; var f = packetData["f"]; var protocol = packetData["protocol"]; var gameVersion = packetData["game_version"]; var fz = packetData["fz"]; var lMode = packetData["lmode"]; var cBits = packetData["cbits"]; var playerAge = packetData["player_age"]; var gdpr = packetData["GDPR"]; var hash2 = packetData["hash2"]; var meta = packetData["meta"]; var fHash = packetData["fhash"]; var rid = packetData["rid"]; var platformId = packetData["platformID"]; var deviceVersion = packetData["deviceVersion"]; var country = packetData["country"]; var hash = packetData["hash"]; var mac = packetData["mac"]; var wk = packetData["wk"]; var zf = packetData["zf"]; var rnd = new Random(wk.GetHashCode()); Country = country; NameNr = rnd.Next(999); HasLoggedIn = true; AcceptLogin(requestedName, string.Empty); return; } EventManager.Instance.RunEvent(EventType.TextPacket, packetData["action"], this, packetData); } break; case 4: { var(header, tankPacketData) = CTankPacket.Unpack(packet); switch (header.TankPacketType) { case TankPacketType.VariantList: break; default: Console.WriteLine($"Unknown TankPacket Type! {(int) header.TankPacketType}\n" + $"\tData: {BitConverter.ToString(tankPacketData).Replace("-", " ")}"); break; } } break; default: Console.WriteLine($"Unknown PacketType! {packetType}\n" + $"\tData: {BitConverter.ToString(packet, 4).Replace("-", " ")}"); break; } }
public TankEvent(Player player, ENetPacket packet) { Handle(player, TankPacket.Unpack(packet.Data.ToArray()), Database.GetWorld(player.CurrentWorld).Result); }
public string HandlePacketFromClient(ref ENetPeer peer, ENetPacket packet) // Why string? Oh yeah, it's the best thing to also return a string response for anything you want! { if (peer.IsNull) { return(""); } if (peer.State != ENetPeerState.Connected) { return(""); } if (Proxyhelper.realPeer.IsNull) { return(""); } if (Proxyhelper.realPeer.State != ENetPeerState.Connected) { return(""); } bool respondToBotPeers = true; byte[] data = packet.Data.ToArray(); string log = string.Empty; switch ((NetTypes.NetMessages)data[0]) { case NetTypes.NetMessages.GENERIC_TEXT: string str = GetProperGenericText(data); if (str.StartsWith("action|")) { string actionExecuted = str.Substring(7, str.Length - 7); string inputPH = "input\n|text|"; if (actionExecuted.StartsWith("enter_game")) { respondToBotPeers = true; if (Proxyhelper.globalUserData.blockEnterGame) { return("Blocked enter_game packet!"); } enteredGame = true; } else if (actionExecuted.StartsWith(inputPH)) { string text = actionExecuted.Substring(inputPH.Length); if (text.Length > 0) { if (text.StartsWith("/")) // bAd hAcK - but also lazy, so i'll be doing this. { switch (text) { case "/banworld": { banEveryoneInWorld(); return("called /banworld, attempting to ban everyone who is in world (requires admin/owner)"); } break; default: break; } } } } } else { // for (int i = 0; i < 1000; i++) packetSender.SendPacket(2, "action|refresh_item_data\n", MainForm.realPeer); respondToBotPeers = false; string[] lines = str.Split('\n'); string tankIDName = ""; foreach (string line in lines) { string[] lineToken = line.Split('|'); if (lineToken.Length != 2) { continue; } switch (lineToken[0]) { case "tankIDName": tankIDName = lineToken[1]; break; case "tankIDPass": Proxyhelper.globalUserData.tankIDPass = lineToken[1]; break; case "requestedName": Proxyhelper.globalUserData.requestedName = lineToken[1]; break; case "token": Proxyhelper.globalUserData.token = int.Parse(lineToken[1]); break; case "user": Proxyhelper.globalUserData.userID = int.Parse(lineToken[1]); break; case "lmode": Proxyhelper.globalUserData.lmode = int.Parse(lineToken[1]); break; } } Proxyhelper.globalUserData.tankIDName = tankIDName; bool hasAcc = false; packetSender.SendPacket((int)NetTypes.NetMessages.GENERIC_TEXT, Proxyhelper.CreateLogonPacket(), Proxyhelper.realPeer); return("Sent logon packet!"); // handling logon over proxy } break; case NetTypes.NetMessages.GAME_MESSAGE: string str2 = GetProperGenericText(data); if (str2.StartsWith("action|")) { string actionExecuted = str2.Substring(7); if (actionExecuted.StartsWith("quit") && !actionExecuted.StartsWith("quit_to_exit")) { // super multibotting will not mirror all packets in here (the "quit" action), cuz i found it unnecessary, although, you can enable that by pasting the code that does it. respondToBotPeers = true; Proxyhelper.globalUserData.token = -1; Proxyhelper.globalUserData.Growtopia_IP = Proxyhelper.globalUserData.Growtopia_Master_IP; Proxyhelper.globalUserData.Growtopia_Port = Proxyhelper.globalUserData.Growtopia_Master_Port; if (Proxyhelper.realPeer != null) { if (!Proxyhelper.realPeer.IsNull) { if (Proxyhelper.realPeer.State != ENetPeerState.Disconnected) { Proxyhelper.realPeer.Disconnect(0); } } } if (Proxyhelper.proxyPeer != null) { if (!Proxyhelper.proxyPeer.IsNull) { if (Proxyhelper.proxyPeer.State == ENetPeerState.Connected) { Proxyhelper.proxyPeer.Disconnect(0); } } } } else if (actionExecuted.StartsWith("join_request\nname|")) // ghetto fetching of worldname { string[] rest = actionExecuted.Substring(18).Split('\n'); string joinWorldName = rest[0]; Console.WriteLine($"Joining world {joinWorldName}..."); } } break; case NetTypes.NetMessages.GAME_PACKET: { TankPacket p = TankPacket.UnpackFromPacket(data); switch ((NetTypes.PacketTypes)(byte) p.PacketType) { case NetTypes.PacketTypes.APP_INTEGRITY_FAIL: /*rn definitely just blocking autoban packets, * usually a failure of an app integrity is never good * and usually used for security stuff*/ return("Possible autoban packet with id (25) from your GT Client has been blocked."); // remember, returning anything will interrupt sending this packet. To Edit packets, load/parse them and you may just resend them like normally after fetching their bytes. case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE: if (p.PunchX > 0 || p.PunchY > 0) { Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (PROXY): PunchX/PunchY detected, pX: " + p.PunchX.ToString() + " pY: " + p.PunchY.ToString() + "\n"); } Proxyhelper.globalUserData.isFacingSwapped = IsBitSet(p.CharacterState, 4); worldMap.player.X = (int)p.X; worldMap.player.Y = (int)p.Y; break; case NetTypes.PacketTypes.PING_REPLY: { //SpoofedPingReply(p); return("Blocked ping reply!"); } case NetTypes.PacketTypes.TILE_CHANGE_REQ: respondToBotPeers = true; if (p.MainValue == 32) { /*MessageBox.Show("Log of potentially wanted received GAME_PACKET Data:" + * "\npackettype: " + data[4].ToString() + * "\npadding byte 1|2|3: " + data[5].ToString() + "|" + data[6].ToString() + "|" + data[7].ToString() + * "\nnetID: " + p.NetID + * "\nsecondnetid: " + p.SecondaryNetID + * "\ncharacterstate (prob 8): " + p.CharacterState + * "\nwaterspeed / offs 16: " + p.Padding + * "\nmainval: " + p.MainValue + * "\nX|Y: " + p.X + "|" + p.Y + * "\nXSpeed: " + p.XSpeed + * "\nYSpeed: " + p.YSpeed + * "\nSecondaryPadding: " + p.SecondaryPadding + * "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY);*/ Proxyhelper.globalUserData.lastWrenchX = (short)p.PunchX; Proxyhelper.globalUserData.lastWrenchY = (short)p.PunchY; } else if (p.MainValue == 18 && Proxyhelper.globalUserData.redDamageToBlock) { // playingo p.SecondaryPadding = -1; p.ExtDataMask |= 1 << 27; // 28 p.Padding = 1; packetSender.SendPacketRaw(4, p.PackForSendingRaw(), Proxyhelper.realPeer); return(""); } break; case NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ: // just incase, to keep better track of items incase something goes wrong worldMap.dropped_ITEMUID = p.MainValue; if (Proxyhelper.globalUserData.blockCollecting) { return(""); } break; default: //MainForm.LogText += ("[" + DateTime.UtcNow + "] (CLIENT): Got Packet Type: " + p.PacketType.ToString() + "\n"); break; } if (data[4] > 23) { log = $"(CLIENT) Log of potentially wanted received GAME_PACKET Data:" + "\npackettype: " + data[4].ToString() + "\npadding byte 1|2|3: " + data[5].ToString() + "|" + data[6].ToString() + "|" + data[7].ToString() + "\nnetID: " + p.NetID + "\nsecondnetid: " + p.SecondaryNetID + "\ncharacterstate (prob 8): " + p.CharacterState + "\nwaterspeed / offs 16: " + p.Padding + "\nmainval: " + p.MainValue + "\nX|Y: " + p.X + "|" + p.Y + "\nXSpeed: " + p.XSpeed + "\nYSpeed: " + p.YSpeed + "\nSecondaryPadding: " + p.SecondaryPadding + "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY; } } break; case NetTypes.NetMessages.TRACK: return("Packet with messagetype used for tracking was blocked!"); case NetTypes.NetMessages.LOG_REQ: return("Log request packet from client was blocked!"); default: break; } packetSender.SendData(data, Proxyhelper.realPeer); return(log); }
public override void packet_destroy(ENetPacket* packet) { native_packet_destroy(packet); }
public static void enet_host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet) { Platform.host_broadcast(host, channelID, packet); }
static extern void native_packet_destroy(ENetPacket* packet);
public abstract void host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet);
public override int peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet) { return native_peer_send(peer, channelID, packet); }
public static void enet_packet_destroy(ENetPacket* packet) { Platform.packet_destroy(packet); }
public override void host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet) { native_host_broadcast(host, channelID, packet); }
public static int enet_packet_resize(ENetPacket* packet, IntPtr dataLength) { return Platform.packet_resize(packet, dataLength); }
public static extern int enet_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet);
public abstract void packet_destroy(ENetPacket* packet);
public static extern void enet_packet_destroy(ENetPacket* packet);
public abstract int packet_resize(ENetPacket* packet, IntPtr dataLength);
private void Peer_OnReceive_Client(object sender, ENetPacket e) { try { // this is a specific, external client made only for the purpose of using the TRACK packet for our gains/advantage in order to check all accounts quick and efficiently. byte[] packet = e.GetPayloadFinal(); Console.WriteLine("RECEIVE TYPE: " + packet[0].ToString()); updatestatus("Received:" + packet[0].ToString(), 1); switch (packet[0]) { case 1: // HELLO server packet. { PacketSending packetSender = new PacketSending(); packetSender.SendPacket(2, CreateLogonPacket(animaTextBox4.Text, animaTextBox3.Text), eNetP); updatestatus("Loginning: " + packet[0].ToString(), 1); break; } case 2: case 3: { Console.WriteLine("[ACCOUNT-CHECKER] TEXT PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray())); string game = Encoding.ASCII.GetString(packet.Skip(4).ToArray()); if (game.Contains("suspend")) { updatestatus("Account Suspended!", 3); eNetP.Disconnect(0); } if (game.Contains("ban")) { updatestatus("Account Banned!", 3); eNetP.Disconnect(0); } if (game.Contains("maint")) { updatestatus("Growtopia servers f**k!", 3); eNetP.Disconnect(0); } if (game.Contains("play.sfx")) { updatestatus("Account Bug!", 3); eNetP.Disconnect(0); } if (game.Contains("UPDATE REQUIRED")) { game.Replace("msg|`4", ""); game = Regex.Match(game, @"\d+").Value; game = game.Insert(1, "."); ACCOUNTCHECK.Properties.Settings.Default.gamever = game; ACCOUNTCHECK.Properties.Settings.Default.Save(); ACCOUNTCHECK.Properties.Settings.Default.gamever = game_version; Console.WriteLine("fuckchecker:" + game); updatestatus("Restart need!", 1); } if (game.Contains("password is wrong")) { updatestatus("Wrong Password!", 3); eNetP.Disconnect(0); } //Incorrect logon token.. if (game.Contains("Incorrect logon token")) { VariantList ad = new VariantList(); byte[] tankPacket = ad.get_struct_data(packet); VariantList.VarList vList = ad.GetCall(ad.get_extended_data(tankPacket)); vList.netID = BitConverter.ToInt32(tankPacket, 4); // add netid vList.delay = BitConverter.ToUInt32(tankPacket, 20); // add keep track of delay modifier string ip = (string)vList.functionArgs[4]; if (ip.Contains("|")) { ip = ip.Substring(0, ip.IndexOf("|")); } int port = (int)vList.functionArgs[1]; userID = (int)vList.functionArgs[3]; token = (int)vList.functionArgs[2]; lmode = (int)vList.functionArgs[5]; Growtopia_IP = ip; Growtopia_Port = port; ConnectCurrent(); updatestatus("Peer Reset Success!", 1); Thread.Sleep(10); } //Incorrect logon token.. break; } case 4: { VariantList ad = new VariantList(); byte[] tankPacket = ad.get_struct_data(packet); if (tankPacket[0] == 1) { VariantList.VarList vList = ad.GetCall(ad.get_extended_data(tankPacket)); vList.netID = BitConverter.ToInt32(tankPacket, 4); // add netid vList.delay = BitConverter.ToUInt32(tankPacket, 20); // add keep track of delay modifier // Console.WriteLine(VarListFetched.FunctionName); if (vList.FunctionName == "OnSendToServer") { string ip = (string)vList.functionArgs[4]; if (ip.Contains("|")) { ip = ip.Substring(0, ip.IndexOf("|")); } int port = (int)vList.functionArgs[1]; userID = (int)vList.functionArgs[3]; token = (int)vList.functionArgs[2]; lmode = (int)vList.functionArgs[5]; Growtopia_IP = ip; Growtopia_Port = port; ConnectCurrent(); updatestatus("Peer Reset Success!", 1); } // variant call, just rn used for subserver switching } break; } case (byte)NetTypes.NetMessages.TRACK: // TRACK packet. { Console.WriteLine("[ACCOUNT-CHECKER] TRACK PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray())); File.AppendAllText("s.temp", Encoding.ASCII.GetString(packet.Skip(4).ToArray())); Growtopia_Port = Growtopia_Master_Port; // todo auto get port Growtopia_IP = Growtopia_Master_IP; PacketSending asd = new PacketSending(); asd.SendPacket(2, "action|enter_game", eNetP); if (Encoding.ASCII.GetString(packet.Skip(4).ToArray()).Contains("Gem")) { File.AppendAllText("d.temp", Encoding.ASCII.GetString(packet.Skip(4).ToArray())); eNetP.Disconnect(0); } break; } default: break; } } catch { } }
public static int enet_peer_send(ENetPeer* peer, byte channelID, ENetPacket* packet) { return Platform.peer_send(peer, channelID, packet); }
public static void Peer_OnReceive_Client(object sender, ENetPacket e) { ENetPeer peer = (ENetPeer)sender; string str = messageHandler.HandlePacketFromServer(ref peer, e); }
static extern void native_host_broadcast(ENetHost* host, byte channelID, ENetPacket* packet);
private static void Peer_OnReceive_Client(object sender, ENetPacket e) { try { // this is a specific, external client made only for the purpose of using the TRACK packet for our gains/advantage in order to check all accounts quick and efficiently. byte[] packet = e.GetPayloadFinal(); Console.WriteLine("RECEIVE TYPE: " + packet[0].ToString()); switch (packet[0]) { case 1: // HELLO server packet. { string username = accountsToCheck[checkCurrentIndex].GrowID; string pass = accountsToCheck[checkCurrentIndex].password; // todo add mac optionally, will do that incases aap bypass gets fixed. Console.WriteLine("[ACCOUNT-CHECKER] Logging on " + username + "..."); packetSender.SendPacket(2, MainForm.CreateLogonPacket(username, pass), g_Peer); break; } case 2: case 3: { Console.WriteLine("[ACCOUNT-CHECKER] TEXT PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray())); break; } case 4: { byte[] tankPacket = VariantList.get_struct_data(packet); if (tankPacket[0] == 1) { VariantList.VarList vList = VariantList.GetCall(VariantList.get_extended_data(tankPacket)); vList.netID = BitConverter.ToInt32(tankPacket, 4); // add netid vList.delay = BitConverter.ToUInt32(tankPacket, 20); // add keep track of delay modifier // Console.WriteLine(VarListFetched.FunctionName); if (vList.FunctionName == "OnSendToServer") { string ip = (string)vList.functionArgs[4]; if (ip.Contains("|")) { ip = ip.Substring(0, ip.IndexOf("|")); } int port = (int)vList.functionArgs[1]; int userID = (int)vList.functionArgs[3]; int token = (int)vList.functionArgs[2]; int lmode = (int)vList.functionArgs[5]; Growtopia_IP = ip; Growtopia_Port = port; ConnectCurrent(); } // variant call, just rn used for subserver switching } break; } case (byte)NetTypes.NetMessages.TRACK: // TRACK packet. { Console.WriteLine("[ACCOUNT-CHECKER] TRACK PACKET CONTENT:\n" + Encoding.ASCII.GetString(packet.Skip(4).ToArray())); checkCurrentIndex++; Console.WriteLine("[ACCOUNT-CHECKER] +1 account checked, disconnecting and moving onto the next one."); Growtopia_Port = MainForm.Growtopia_Master_Port; // todo auto get port Growtopia_IP = MainForm.Growtopia_Master_IP; ConnectCurrent(); break; } default: break; } } catch { } }
public bool handlePacket(ENetPeer* peer, ENetPacket* packet, Channel channelID) { if ((int)packet->dataLength >= 8) if (game.getPeerInfo(peer) != null) BlowFishCS.BlowFishCS.Decrypt1(game.getBlowfish(), (byte*)packet->data, new IntPtr((int)packet->dataLength - ((int)packet->dataLength % 8))); var data = new byte[(int)packet->dataLength]; Marshal.Copy(packet->data, data, 0, data.Length); return handlePacket(peer, data, channelID); }
public void OnReceive(ENetPeer peer, ENetPacket packet, byte channelId) { OnReceiveCalled = true; }
public string HandlePacketFromClient(ENetPacket packet) // Why string? Oh yeah, it's the best thing to also return a string response for anything you want! { if (MainForm.proxyPeer == null) { return(""); } if (MainForm.proxyPeer.State != ENetPeerState.Connected) { return(""); } if (MainForm.realPeer == null) { return(""); } if (MainForm.realPeer.State != ENetPeerState.Connected) { return(""); } byte[] data = packet.GetPayloadFinal(); switch ((NetTypes.NetMessages)data[0]) { case NetTypes.NetMessages.GENERIC_TEXT: string str = GetProperGenericText(data); MainForm.LogText += ("[" + DateTime.UtcNow + "] (CLIENT): String package fetched:\n" + str + "\n"); if (str.StartsWith("action|")) { string actionExecuted = str.Substring(7, str.Length - 7); string inputPH = "input\n|text|"; if (actionExecuted.StartsWith("enter_game")) { if (MainForm.blockEnterGame) { return("Blocked enter_game packet!"); } enteredGame = true; } else if (actionExecuted.StartsWith(inputPH)) { string text = actionExecuted.Substring(inputPH.Length); if (text.Length > 0) { if (text.StartsWith("/")) // bAd hAcK - but also lazy, so i'll be doing this. { switch (text) { case "/banworld": { banEveryoneInWorld(); return("called /banworld, attempting to ban everyone who is in world (requires admin/owner)"); } break; default: break; } } } } } else { // for (int i = 0; i < 1000; i++) packetSender.SendPacket(2, "action|refresh_item_data\n", MainForm.realPeer); string[] lines = str.Split('\n'); string tankIDName = ""; foreach (string line in lines) { string[] lineToken = line.Split('|'); if (lineToken.Length != 2) { continue; } switch (lineToken[0]) { case "tankIDName": tankIDName = lineToken[1]; break; case "tankIDPass": MainForm.tankIDPass = lineToken[1]; break; case "requestedName": MainForm.requestedName = lineToken[1]; break; } } MainForm.tankIDName = tankIDName; bool hasAcc = false; packetSender.SendPacket((int)NetTypes.NetMessages.GENERIC_TEXT, MainForm.CreateLogonPacket(), MainForm.realPeer); return("Sent logon packet!"); // handling logon over proxy } break; case NetTypes.NetMessages.GAME_MESSAGE: string str2 = GetProperGenericText(data); MainForm.LogText += ("[" + DateTime.UtcNow + "] (CLIENT): String package fetched:\n" + str2 + "\n"); if (str2.StartsWith("action|")) { string actionExecuted = str2.Substring(7, str2.Length - 7); if (actionExecuted == "quit") { MainForm.token = 0; MainForm.Growtopia_IP = MainForm.Growtopia_Master_IP; MainForm.Growtopia_Port = MainForm.Growtopia_Master_Port; if (MainForm.realPeer != null && MainForm.proxyPeer != null) { if (MainForm.realPeer.State == ENetPeerState.Connected) { MainForm.realPeer.Disconnect(0); } if (MainForm.proxyPeer.State == ENetPeerState.Connected) { MainForm.proxyPeer.Disconnect(0); } } } } break; case NetTypes.NetMessages.GAME_PACKET: { TankPacket p = TankPacket.UnpackFromPacket(data); switch ((NetTypes.PacketTypes)(byte) p.PacketType) { case NetTypes.PacketTypes.APP_INTEGRITY_FAIL: /*rn definitely just blocking autoban packets, * usually a failure of an app integrity is never good * and usually used for security stuff*/ return("Possible autoban packet with id (25) from your GT Client has been blocked."); // remember, returning anything will interrupt sending this packet. To Edit packets, load/parse them and you may just resend them like normally after fetching their bytes. case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE: if (p.PunchX > 0 || p.PunchY > 0) { MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): PunchX/PunchY detected, pX: " + p.PunchX.ToString() + " pY: " + p.PunchY.ToString() + "\n"); } MainForm.isFacingSwapped = IsBitSet(p.CharacterState, 4); worldMap.player.X = (int)p.X; worldMap.player.Y = (int)p.Y; break; case NetTypes.PacketTypes.TILE_CHANGE_REQ: if (p.MainValue == 18 && MainForm.redDamageToBlock) { // playingo p.SecondaryPadding = -1; p.ExtDataMask |= 1 << 27; p.Padding = 1; packetSender.SendPacketRaw(4, p.PackForSendingRaw(), MainForm.realPeer); return(""); } break; case NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ: // just incase, to keep better track of items incase something goes wrong worldMap.dropped_ITEMUID = p.MainValue; if (MainForm.blockCollecting) { return(""); } break; default: break; } } break; case NetTypes.NetMessages.TRACK: return("Packet with messagetype used for tracking was blocked!"); case NetTypes.NetMessages.LOG_REQ: return("Log request packet from client was blocked!"); default: break; } packetSender.SendData(data, MainForm.realPeer, ENetPacketFlags.Reliable); return(string.Empty); }
public string HandlePacketFromServer(ENetPacket packet) { if (MainForm.proxyPeer == null) { return(""); } if (MainForm.proxyPeer.State != ENetPeerState.Connected) { return(""); } if (MainForm.realPeer == null) { return(""); } if (MainForm.realPeer.State != ENetPeerState.Connected) { return(""); } byte[] data = packet.GetPayloadFinal(); //else //{ //return "_none_"; //} NetTypes.NetMessages msgType = (NetTypes.NetMessages)data[0]; // more performance. switch (msgType) { case NetTypes.NetMessages.SERVER_HELLO: MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): Initial logon accepted." + "\n"); break; case NetTypes.NetMessages.GAME_MESSAGE: string str = GetProperGenericText(data); MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A game_msg packet was sent: " + str + "\n"); if (str.Contains("Server requesting that you re-logon...")) { MainForm.token = 0; MainForm.doorid = ""; GamePacketProton gp = new GamePacketProton(); gp.AppendString("OnConsoleMessage"); gp.AppendString("`6(PROXY) `4Handling server relogon request automatically..."); packetSender.SendData(gp.GetBytes(), MainForm.proxyPeer); SwitchServers(MainForm.Growtopia_Master_IP, MainForm.Growtopia_Master_Port); return("Server forces logon request, switching server automatically so user does not have to cancel to login menu and reconnect."); } break; case NetTypes.NetMessages.GAME_PACKET: byte[] tankPacket = VariantList.get_struct_data(data); if (tankPacket == null) { break; } byte tankPacketType = tankPacket[0]; NetTypes.PacketTypes packetType = (NetTypes.PacketTypes)tankPacketType; if (MainForm.logallpackettypes) { GamePacketProton gp = new GamePacketProton(); gp.AppendString("OnConsoleMessage"); gp.AppendString("`6(PROXY) `wPacket TYPE: " + tankPacketType.ToString()); packetSender.SendData(gp.GetBytes(), MainForm.proxyPeer); } switch (packetType) { case NetTypes.PacketTypes.INVENTORY_STATE: { worldMap.player.SerializePlayerInventory(VariantList.get_extended_data(tankPacket)); /*foreach (InventoryItem item in worldMap.player.inventory.items) * { * ItemDatabase.ItemDefinition itemDef = ItemDatabase.GetItemDef(item.itemID); * MessageBox.Show("ITEM NAME: " + itemDef.itemName + " AMOUNT: " + item.amount); * }*/ break; } case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE: { TankPacket p = TankPacket.UnpackFromPacket(data); foreach (Player pl in worldMap.players) { if (pl.netID == p.NetID) { pl.X = (int)p.X; pl.Y = (int)p.Y; break; } } break; } case NetTypes.PacketTypes.TILE_CHANGE_REQ: { TankPacket p = TankPacket.UnpackFromPacket(data); // world tile map in proxy, by playingo :) if (worldMap == null) { MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n"); break; } byte tileX = (byte)p.PunchX; byte tileY = (byte)p.PunchY; ushort item = (ushort)p.MainValue; if (tileX >= worldMap.width) { break; } else if (tileY >= worldMap.height) { break; } ItemDatabase.ItemDefinition itemDef = ItemDatabase.GetItemDef(item); if (ItemDatabase.isBackground(item)) { worldMap.tiles[tileX + (tileY * worldMap.width)].bg = item; } else { worldMap.tiles[tileX + (tileY * worldMap.width)].fg = item; } break; } case NetTypes.PacketTypes.CALL_FUNCTION: VariantList.VarList VarListFetched = VariantList.GetCall(VariantList.get_extended_data(tankPacket)); VarListFetched.netID = BitConverter.ToInt32(tankPacket, 4); // add netid VarListFetched.delay = BitConverter.ToUInt32(tankPacket, 20); // add keep track of delay modifier int netID = OperateVariant(VarListFetched); string argText = string.Empty; for (int i = 0; i < VarListFetched.functionArgs.Count(); i++) { argText += " [" + i.ToString() + "]: " + (string)VarListFetched.functionArgs[i].ToString(); } MainForm.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A function call was requested, see log infos below:\nFunction Name: " + VarListFetched.FunctionName + " parameters: " + argText + " \n"); if (VarListFetched.FunctionName == "OnSendToServer") { return("Server switching forced, not continuing as Proxy Client has to deal with this."); } if (VarListFetched.FunctionName == "onShowCaptcha") { return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side."); } if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("captcha")) { return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side."); } if (VarListFetched.FunctionName == "OnSetPos" && MainForm.ignoreonsetpos && netID == worldMap.netID) { return("Ignored position set by server, may corrupt doors but is used so it wont set back. (CAN BE BUGGY WITH SLOW CONNECTIONS)"); } if (VarListFetched.FunctionName == "OnSpawn" && netID == -2) { if (MainForm.unlimitedZoom) { return("Modified OnSpawn for unlimited zoom (mstate|1)"); // only doing unlimited zoom and not unlimited punch/place to be sure that no bans occur due to this. If you wish to use unlimited punching/placing as well, change the smstate in OperateVariant function instead. } } break; case NetTypes.PacketTypes.SET_CHARACTER_STATE: { /*TankPacket p = TankPacket.UnpackFromPacket(data); * * return "Log of potentially wanted received GAME_PACKET Data:" + * "\nnetID: " + p.NetID + * "\nsecondnetid: " + p.SecondaryNetID + * "\ncharacterstate (prob 8): " + p.CharacterState + * "\nwaterspeed / offs 16: " + p.Padding + * "\nmainval: " + p.MainValue + * "\nX|Y: " + p.X + "|" + p.Y + * "\nXSpeed: " + p.XSpeed + * "\nYSpeed: " + p.YSpeed + * "\nSecondaryPadding: " + p.SecondaryPadding + * "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY;*/ break; } case NetTypes.PacketTypes.PING_REQ: SpoofedPingReply(); break; case NetTypes.PacketTypes.LOAD_MAP: if (MainForm.LogText.Length >= 32678) { MainForm.LogText = string.Empty; } worldMap = worldMap.LoadMap(tankPacket); worldMap.player.didCharacterStateLoad = false; worldMap.player.didClothingLoad = false; if (MainForm.pForm.IsHandleCreated) { Action action = () => { MainForm.pForm.Text = "All players in " + worldMap.currentWorld; foreach (Button btn in MainForm.pForm.playerBox.Controls) { btn.Dispose(); } MainForm.pForm.playerBox.Controls.Clear(); }; MainForm.pForm.Invoke(action); } MainForm.realPeer.Timeout(1000, 7000, 11000); break; case NetTypes.PacketTypes.MODIFY_ITEM_OBJ: { TankPacket p = TankPacket.UnpackFromPacket(data); if (p.NetID == -1) { if (worldMap == null) { MainForm.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n"); break; } worldMap.dropped_ITEMUID++; DroppedObject dItem = new DroppedObject(); dItem.id = p.MainValue; dItem.itemCount = data[16]; dItem.x = p.X; dItem.y = p.Y; dItem.uid = worldMap.dropped_ITEMUID; worldMap.droppedItems.Add(dItem); if (MainForm.cheat_magplant) { TankPacket p2 = new TankPacket(); p2.PacketType = (int)NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ; p2.NetID = p.NetID; p2.X = (int)p.X; p2.Y = (int)p.Y; p2.MainValue = dItem.uid; packetSender.SendPacketRaw((int)NetTypes.NetMessages.GAME_PACKET, p2.PackForSendingRaw(), MainForm.realPeer); //return "Blocked dropped packet due to magplant hack (auto collect/pickup range) tried to collect it instead, infos of dropped item => uid was " + worldMap.dropped_ITEMUID.ToString() + " id: " + p.MainValue.ToString(); } } } break; default: break; } break; case NetTypes.NetMessages.TRACK: case NetTypes.NetMessages.LOG_REQ: case NetTypes.NetMessages.ERROR: return("Blocked track/logreq/error message type by server."); default: //return "(SERVER): An unknown event occured. Message Type: " + msgType.ToString() + "\n"; break; } packetSender.SendData(data, MainForm.proxyPeer, ENetPacketFlags.Reliable); if (msgType == NetTypes.NetMessages.GAME_PACKET && data[4] > 39) // customizable on which packets you wanna log, for speed im just gonna do this! { TankPacket p = TankPacket.UnpackFromPacket(data); uint extDataSize = BitConverter.ToUInt32(data, 56); byte[] actualData = data.Skip(4).Take(56).ToArray(); byte[] extData = data.Skip(60).ToArray(); string extDataStr = ""; string extDataStrShort = ""; string extDataString = Encoding.UTF8.GetString(extData); for (int i = 0; i < extDataSize; i++) { //ushort pos = BitConverter.ToUInt16(extData, i); extDataStr += extData[i].ToString() + "|"; } return("Log of potentially wanted received GAME_PACKET Data:" + "\npackettype: " + actualData[0].ToString() + "\npadding byte 1|2|3: " + actualData[1].ToString() + "|" + actualData[2].ToString() + "|" + actualData[3].ToString() + "\nnetID: " + p.NetID + "\nsecondnetid: " + p.SecondaryNetID + "\ncharacterstate (prob 8): " + p.CharacterState + "\nwaterspeed / offs 16: " + p.Padding + "\nmainval: " + p.MainValue + "\nX|Y: " + p.X + "|" + p.Y + "\nXSpeed: " + p.XSpeed + "\nYSpeed: " + p.YSpeed + "\nSecondaryPadding: " + p.SecondaryPadding + "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY + "\nExtended Packet Data Length: " + extDataSize.ToString() + "\nExtended Packet Data:\n" + extDataStr + "\n"); return(string.Empty); } else { return(string.Empty); } }
public string HandlePacketFromServer(ref ENetPeer peer, ENetPacket packet) { if (Proxyhelper.proxyPeer.IsNull) { return("HandlePacketFromServer() -> Proxy peer is null!"); } if (Proxyhelper.proxyPeer.State != ENetPeerState.Connected) { return($"HandlePacketFromServer() -> proxyPeer is not connected: state = {Proxyhelper.proxyPeer.State}"); } if (peer.IsNull) { return("HandlePacketFromServer() -> peer.IsNull is true!"); } if (peer.State != ENetPeerState.Connected) { return("HandlePacketFromServer() -> peer.State was not ENetPeerState.Connected!"); } byte[] data = packet.Data.ToArray(); NetTypes.NetMessages msgType = (NetTypes.NetMessages)data[0]; // more performance. switch (msgType) { case NetTypes.NetMessages.SERVER_HELLO: { Proxyhelper.UserData ud; if (peer.TryGetUserData(out ud)) { packetSender.SendPacket(2, Proxyhelper.CreateLogonPacket(ud.tankIDName, ud.tankIDPass, ud.userID, ud.token, ud.doorid), peer); } break; } case NetTypes.NetMessages.GAME_MESSAGE: string str = GetProperGenericText(data); Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A game_msg packet was sent: " + str + "\n"); if (str.Contains("Server requesting that you re-logon")) { Proxyhelper.globalUserData.token = -1; Proxyhelper.globalUserData.Growtopia_IP = Proxyhelper.globalUserData.Growtopia_Master_IP; Proxyhelper.globalUserData.Growtopia_Port = Proxyhelper.globalUserData.Growtopia_Master_Port; Proxyhelper.globalUserData.isSwitchingServer = true; Proxyhelper.realPeer.Disconnect(0); } break; case NetTypes.NetMessages.GAME_PACKET: byte[] tankPacket = VariantList.get_struct_data(data); if (tankPacket == null) { break; } byte tankPacketType = tankPacket[0]; NetTypes.PacketTypes packetType = (NetTypes.PacketTypes)tankPacketType; if (Proxyhelper.logallpackettypes) { GamePacketProton gp = new GamePacketProton(); gp.AppendString("OnConsoleMessage"); gp.AppendString("`6(PROXY) `wPacket TYPE: " + tankPacketType.ToString()); packetSender.SendData(gp.GetBytes(), Proxyhelper.proxyPeer); if (tankPacketType > 18) { File.WriteAllBytes("newpacket.dat", tankPacket); } } switch (packetType) { case NetTypes.PacketTypes.PLAYER_LOGIC_UPDATE: { TankPacket p = TankPacket.UnpackFromPacket(data); foreach (Player pl in worldMap.players) { if (pl.netID == p.NetID) { pl.X = (int)p.X; pl.Y = (int)p.Y; break; } } break; } case NetTypes.PacketTypes.INVENTORY_STATE: { if (!Proxyhelper.globalUserData.dontSerializeInventory) { worldMap.player.SerializePlayerInventory(VariantList.get_extended_data(tankPacket)); } break; } case NetTypes.PacketTypes.TILE_CHANGE_REQ: { TankPacket p = TankPacket.UnpackFromPacket(data); if (worldMap == null) { Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (PROXY): (ERROR) World map was null." + "\n"); break; } byte tileX = (byte)p.PunchX; byte tileY = (byte)p.PunchY; ushort item = (ushort)p.MainValue; if (tileX >= worldMap.width) { break; } else if (tileY >= worldMap.height) { break; } ItemDatabase.ItemDefinition itemDef = ItemDatabase.GetItemDef(item); if (ItemDatabase.isBackground(item)) { worldMap.tiles[tileX + (tileY * worldMap.width)].bg = item; } else { worldMap.tiles[tileX + (tileY * worldMap.width)].fg = item; } break; } case NetTypes.PacketTypes.CALL_FUNCTION: VariantList.VarList VarListFetched = VariantList.GetCall(VariantList.get_extended_data(tankPacket)); VarListFetched.netID = BitConverter.ToInt32(tankPacket, 4); // add netid VarListFetched.delay = BitConverter.ToUInt32(tankPacket, 20); // add keep track of delay modifier bool isABot = false; Proxyhelper.UserData ud = null; int netID = OperateVariant(VarListFetched, isABot ? (object)peer : null); // box enetpeer obj to generic obj string argText = string.Empty; for (int i = 0; i < VarListFetched.functionArgs.Count(); i++) { argText += " [" + i.ToString() + "]: " + (string)VarListFetched.functionArgs[i].ToString(); } Proxyhelper.LogText += ("[" + DateTime.UtcNow + "] (SERVER): A function call was requested, see log infos below:\nFunction Name: " + VarListFetched.FunctionName + " parameters: " + argText + " \n"); if (VarListFetched.FunctionName == "OnSendToServer") { return("Server switching forced, not continuing as Proxy Client has to deal with this."); } if (VarListFetched.FunctionName == "onShowCaptcha") { return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side."); } if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("captcha")) { return("Received captcha solving request, instantly bypassed it so it doesnt show up on client side."); } if (VarListFetched.FunctionName == "OnDialogRequest" && ((string)VarListFetched.functionArgs[1]).ToLower().Contains("gazette")) { return("Received gazette, skipping it..."); } if (VarListFetched.FunctionName == "OnSetPos" && Proxyhelper.globalUserData.ignoreonsetpos && netID == worldMap.netID) { return("Ignored position set by server, may corrupt doors but is used so it wont set back. (CAN BE BUGGY WITH SLOW CONNECTIONS)"); } if (VarListFetched.FunctionName == "OnSpawn" && netID == -2) { if (Proxyhelper.globalUserData.unlimitedZoom) { return("Modified OnSpawn for unlimited zoom (mstate|1)"); // only doing unlimited zoom and not unlimited punch/place to be sure that no bans occur due to this. If you wish to use unlimited punching/placing as well, change the smstate in OperateVariant function instead. } } break; case NetTypes.PacketTypes.SET_CHARACTER_STATE: { /*TankPacket p = TankPacket.UnpackFromPacket(data); * * return "Log of potentially wanted received GAME_PACKET Data:" + * "\nnetID: " + p.NetID + * "\nsecondnetid: " + p.SecondaryNetID + * "\ncharacterstate (prob 8): " + p.CharacterState + * "\nwaterspeed / offs 16: " + p.Padding + * "\nmainval: " + p.MainValue + * "\nX|Y: " + p.X + "|" + p.Y + * "\nXSpeed: " + p.XSpeed + * "\nYSpeed: " + p.YSpeed + * "\nSecondaryPadding: " + p.SecondaryPadding + * "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY;*/ break; } case NetTypes.PacketTypes.PING_REQ: SpoofedPingReply(TankPacket.UnpackFromPacket(data)); break; case NetTypes.PacketTypes.LOAD_MAP: if (Proxyhelper.LogText.Length >= 32678) { Proxyhelper.LogText = string.Empty; } worldMap = worldMap.LoadMap(tankPacket); worldMap.player.didCharacterStateLoad = false; worldMap.player.didClothingLoad = false; Proxyhelper.realPeer.Timeout(1000, 2800, 3400); break; case NetTypes.PacketTypes.MODIFY_ITEM_OBJ: { TankPacket p = TankPacket.UnpackFromPacket(data); if (p.NetID == -1) { if (worldMap == null) { break; } worldMap.dropped_ITEMUID++; DroppedObject dItem = new DroppedObject(); dItem.id = p.MainValue; dItem.itemCount = data[16]; dItem.x = p.X; dItem.y = p.Y; dItem.uid = worldMap.dropped_ITEMUID; worldMap.droppedItems.Add(dItem); if (Proxyhelper.globalUserData.cheat_magplant) { TankPacket p2 = new TankPacket(); p2.PacketType = (int)NetTypes.PacketTypes.ITEM_ACTIVATE_OBJ; p2.NetID = p.NetID; p2.X = (int)p.X; p2.Y = (int)p.Y; p2.MainValue = dItem.uid; packetSender.SendPacketRaw((int)NetTypes.NetMessages.GAME_PACKET, p2.PackForSendingRaw(), Proxyhelper.realPeer); //return "Blocked dropped packet due to magplant hack (auto collect/pickup range) tried to collect it instead, infos of dropped item => uid was " + worldMap.dropped_ITEMUID.ToString() + " id: " + p.MainValue.ToString(); } } } break; default: break; } break; case NetTypes.NetMessages.TRACK: { return("Track message:\n" + GetProperGenericText(data)); break; } case NetTypes.NetMessages.LOG_REQ: case NetTypes.NetMessages.ERROR: return("Blocked LOG_REQUEST/ERROR message from server"); default: //return "(SERVER): An unknown event occured. Message Type: " + msgType.ToString() + "\n"; break; } packetSender.SendData(data, Proxyhelper.proxyPeer); if (msgType == NetTypes.NetMessages.GAME_PACKET && data[4] > 39) // customizable on which packets you wanna log, for speed im just gonna do this! { TankPacket p = TankPacket.UnpackFromPacket(data); uint extDataSize = BitConverter.ToUInt32(data, 56); byte[] actualData = data.Skip(4).Take(56).ToArray(); byte[] extData = data.Skip(60).ToArray(); string extDataStr = ""; string extDataStrShort = ""; string extDataString = Encoding.UTF8.GetString(extData); for (int i = 0; i < extDataSize; i++) { //ushort pos = BitConverter.ToUInt16(extData, i); extDataStr += extData[i].ToString() + "|"; } return("Log of potentially wanted received GAME_PACKET Data:" + "\npackettype: " + actualData[0].ToString() + "\npadding byte 1|2|3: " + actualData[1].ToString() + "|" + actualData[2].ToString() + "|" + actualData[3].ToString() + "\nnetID: " + p.NetID + "\nsecondnetid: " + p.SecondaryNetID + "\ncharacterstate (prob 8): " + p.CharacterState + "\nwaterspeed / offs 16: " + p.Padding + "\nmainval: " + p.MainValue + "\nX|Y: " + p.X + "|" + p.Y + "\nXSpeed: " + p.XSpeed + "\nYSpeed: " + p.YSpeed + "\nSecondaryPadding: " + p.SecondaryPadding + "\nPunchX|PunchY: " + p.PunchX + "|" + p.PunchY + "\nExtended Packet Data Length: " + extDataSize.ToString() + "\nExtended Packet Data:\n" + extDataStr + "\n"); return(string.Empty); } else { return(string.Empty); } }