private void buttonLoadPacket_Click(object o) { var openFileDialog = new OpenFileDialog { Filter = "All Files|*.*", Multiselect = false }; var showDialog = openFileDialog.ShowDialog(); if (showDialog == null || !(bool)showDialog) { return; } var packet = new BDPacket(File.ReadAllBytes(openFileDialog.FileName)); var packetBody = packet.ToArray().Extract(2); if (packet.IsEncrypted) { if (packetTransformer != null) { packetTransformer.Transform(ref packetBody, 0, true); } else { MessageBox.Show("You need to specify the encryption packet first in order to decrypt encrypted packets.", "Encryption packet required", MessageBoxButton.OK, MessageBoxImage.Warning); } } FormatPacket(new BDPacket(packet.ToArray().Extract(0, 2).Concat(packetBody).ToArray())); }
public static void CreateWorldNotice(string message) { using (var packet = new BDPacket()) { packet.AddUShort(0); packet.AddBool(false); packet.AddUShort(0); packet.AddUShort(0xEAF); packet.AddByte(1); packet.AddByte(1); packet.AddInt(0); // session id? packet.AddString(string.Empty, Encoding.Unicode, 62); // character name packet.AddByte(1); packet.AddByte(1); packet.AddByte(1); byte[] bMessage = Encoding.Unicode.GetBytes(message); var len = bMessage.Length + 2; packet.AddUShort((ushort)len); packet.AddBytes(bMessage); packet.AddBytes("0000"); packet.SetUShort(packet.Length, 0); MainContext.gameProxy.SendToGame(packet); } }
private void LoginProxy_GameToServerPacket(object sender, BDPacket e) { foreach (Script plugin in scriptController.Scripts) { e = plugin.Login_CMSG(e); } MainContext.loginProxy.SendToServer(e); }
private void GameProxy_ServerToGamePacket(object sender, BDPacket e) { foreach (Script plugin in scriptController.Scripts) { e = plugin.Game_SMSG(e); } MainContext.gameProxy.SendToGame(e); }
public override BDPacket Game_SMSG(BDPacket packet) { if (PacketProcessor.ServerMessages.Packets.Any(t => t.Id == packet.PacketId)) { Console.WriteLine("{0}", PacketProcessor.ServerMessages.Packets.Where(t => t.Id == packet.PacketId).First().Name); } return(base.Game_SMSG(packet)); }
private async Task StartReceive(Socket socket, int needed, bool SMSG) { try { var buffer = new byte[needed]; Buffer.BlockCopy(BitConverter.GetBytes(needed), 0, buffer, 0, 2); var bytesRead = 2; while (bytesRead < needed) { var bytesReceived = await ReceiveAsyncTask(socket, buffer, bytesRead, needed - bytesRead).ConfigureAwait(false); bytesRead += bytesReceived; if (bytesReceived <= 0) { break; } } await Task.Factory.StartNew(() => { BDPacket packet = ProcessPacket(buffer); if (SMSG) { if (ServerToGamePacket != null) { ServerToGamePacket(this, packet); } } else { if (GameToServerPacket != null) { GameToServerPacket(this, packet); } } }); } catch (Exception e) { Logger.Log("Server", "{0}", Logger.LogLevel.Error, e); } if (SMSG) { socket.BeginReceive(SMSG_Buffer, 0, 2, SocketFlags.None, new AsyncCallback(serverReceivedCallback), null); } else { socket.BeginReceive(CMSG_Buffer, 0, 2, SocketFlags.None, new AsyncCallback(connectionReceiveCallback), null); } }
private void FormatPacket(BDPacket packet) { var b = new StringBuilder(); b.AppendLine($"Size: {packet.Length}"); b.AppendLine($"OpCode: 0x{packet.PacketId:X4}"); b.AppendLine($"Encrypted: {packet.IsEncrypted}"); if (packet.IsEncrypted) { b.AppendLine($"SequenceId: {packet.SequenceId}"); } b.AppendLine(); b.Append(packet.ToArray().FormatHex()); txtPacketView = b.ToString(); }
private BDPacket ProcessPacket(byte[] buffer) { var packet = new BDPacket(buffer); if (packet.PacketId == 0x03EB) { cryptoTransformer = new BDTransformer(packet.ToArray().Extract(5)); } if (packet.IsEncrypted) { packet.Transform(ref cryptoTransformer, false); } return(packet); }
public void SendToGame(BDPacket packet) { if (packet == null) { return; } if (packet.IsEncrypted) { packet.Transform(ref cryptoTransformer, true); } connectionSocket.BeginSend(packet.ToArray(), 0, packet.Length, SocketFlags.None, ar => { connectionSocket.EndSend(ar); }, null); }
private void GameProxy_GameToServerPacket(object sender, BDPacket e) { foreach (Script plugin in scriptController.Scripts) { e = plugin.Game_CMSG(e); } if (e.PacketId == 0xCEE) { MainContext.IsPlayerIngame = true; } if (e.PacketId == 0xEA8) { var messageLen = e.GetUShort(11) - 2; string message = e.GetString(Encoding.Unicode, messageLen, 13); if (message.StartsWith("/")) { string commandName = message.Replace("/", "").Split(' ')[0]; List <Command> list = new List <Command>(CommandProcessor.GetCommandsByName(commandName)); if (list.Count > 0) { for (int i = 0; i < list.Count; i++) { var command = list[i]; string[] parameters = message.Replace("/", "").Split(' '); command.Parameters.Clear(); for (int j = 1; j < parameters.Length; j++) { command.Parameters.Add(parameters[j]); } command.Callback(command); } } else { WorldProcessor.CreateWorldNotice("[CommandProcessor] Command does not exist."); } return; } } MainContext.gameProxy.SendToServer(e); }
private void buttonLoadCryptoPacket_Click(object o) { var openFileDialog = new OpenFileDialog { Filter = "All Files|*.*", Multiselect = false }; var showDialog = openFileDialog.ShowDialog(); if (showDialog == null || !(bool)showDialog) { return; } var packet = new BDPacket(File.ReadAllBytes(openFileDialog.FileName)); packetTransformer = new BDTransformer(packet.ToArray().Extract(5)); }
public override BDPacket Login_SMSG(BDPacket packet) { if (packet.PacketId == 0x0C82) { var p = new BDPacket(); p.AddUShort(0); // changeto length later p.AddBool(true); // is encrypted p.AddUShort(packet.SequenceId); p.AddUShort(packet.PacketId); p.AddInt(0); // unk p.AddLong(1457907576); // time? p.AddShort(1); // server count p.AddShort(1); // channel id p.AddShort(1); // server id p.AddShort(16384); // ranodm value, p.AddString(Config.GetValue <string>("ChannelName"), Encoding.Unicode, 62); // channel name p.AddString(Config.GetValue <string>("ServerName"), Encoding.Unicode, 62); // server name p.AddByte(0); p.AddString("127.0.0.1", Encoding.ASCII, 16); p.AddByte(0); p.AddBytes(new byte[84]); p.AddShort(8889); // server port p.AddByte(1); // population status p.AddByte(1); // can joined by public? p.AddByte(1); // unk p.AddByte(0); // characters p.AddByte(0); // characters to be deleted lol p.AddShort(0); // dunno p.AddLong(0); p.AddLong(0); p.AddByte(0); // exp drop bonus? p.AddBytes(new byte[13]); p.AddByte(0); p.SetUShort(p.Length, 0); Logger.Log("ServerListHook", "modified server list packet!"); return(p); } //if(packet.PacketId == 0xc82) //{ // ushort realmCount = packet.GetUShort(19); // Console.WriteLine(realmCount); // int index = 21; // string edan=""; // string orwen =""; // string uno=""; // string croxus=""; // string jordine =""; // string alustin=""; // for(int i = 0; i < realmCount; i++) // { // string channelName = packet.GetString(Encoding.Unicode, 62, index + 6); // channelName = channelName.Split('\0')[0]; // string servername = packet.GetString(Encoding.Unicode, 62, index + 6 + 62); // servername = servername.Split('\0')[0]; // string ip = packet.GetString(Encoding.ASCII, 16, index + 6 + 62 + 62 + 1); // ip = ip.Split('\0')[0]; // Console.WriteLine(channelName + " - " + servername + " - " + ip); // if(servername=="Edan") // { // edan += string.Format("Channels.Add(new KeyValuePair<string, string>(\"{0}\", \"{1}\"));{2}", channelName, ip, Environment.NewLine); // } // if(servername == "Orwen") // { // orwen += string.Format("Channels.Add(new KeyValuePair<string, string>(\"{0}\", \"{1}\"));{2}", channelName, ip, Environment.NewLine); // } // if(servername == "Uno") // { // uno += string.Format("Channels.Add(new KeyValuePair<string, string>(\"{0}\", \"{1}\"));{2}", channelName, ip, Environment.NewLine); // } // if(servername == "Croxus") // { // croxus += string.Format("Channels.Add(new KeyValuePair<string, string>(\"{0}\", \"{1}\"));{2}", channelName, ip, Environment.NewLine); // } // if(servername == "Jordine") // { // jordine += string.Format("Channels.Add(new KeyValuePair<string, string>(\"{0}\", \"{1}\"));{2}", channelName, ip, Environment.NewLine); // } // if(servername == "Alustin") // { // alustin += string.Format("Channels.Add(new KeyValuePair<string, string>(\"{0}\", \"{1}\"));{2}", channelName, ip, Environment.NewLine); // } // index += 272; // } // File.WriteAllText("C:\\Users\\Johannes\\Desktop\\Edan.txt", edan); // File.WriteAllText("C:\\Users\\Johannes\\Desktop\\Orwen.txt", orwen); // File.WriteAllText("C:\\Users\\Johannes\\Desktop\\Uno.txt", uno); // File.WriteAllText("C:\\Users\\Johannes\\Desktop\\Croxus.txt", croxus); // File.WriteAllText("C:\\Users\\Johannes\\Desktop\\Jordine.txt", jordine); // File.WriteAllText("C:\\Users\\Johannes\\Desktop\\Alustin.txt", alustin); //} return(packet); }
/// <summary> /// Emulates a gameserver packet to official server. /// </summary> /// <param name="packet"></param> public void SendGamePacketToServer(BDPacket packet) { MainContext.gameProxy.SendToServer(packet); }
/// <summary> /// Emulates a loginserver packet to official server. /// </summary> /// <param name="packet"></param> public void SendLoginPacketToServer(BDPacket packet) { MainContext.loginProxy.SendToServer(packet); }
/// <summary> /// Emulates a loginserver packet to the game. /// </summary> /// <param name="packet"></param> public void SendLoginPacketToGame(BDPacket packet) { MainContext.loginProxy.SendToGame(packet); }
/// <summary> /// Occurs when receiving a game packet from game. /// </summary> /// <param name="packet"></param> /// <returns>The modified packet and redirects it to official server.</returns> public virtual BDPacket Game_CMSG(BDPacket packet) { return(packet); }
/// <summary> /// Occurs when receiving a login packet from game. /// </summary> /// <param name="packet"></param> /// <returns>The modified packet and redirects it to official server.</returns> public virtual BDPacket Login_CMSG(BDPacket packet) { return(packet); }