Example #1
0
            private void DumpPacket(Packets.PacketClass packet)
            {
                if (packet == null)
                {
                    WorldServiceLocator._WorldServer.Log.WriteLine(LogType.WARNING, "Unable to dump packet");
                    return;
                }

                try
                {
                    Packets     packets4 = WorldServiceLocator._Packets;
                    byte[]      data4    = packet.Data;
                    ClientClass client   = this;
                    packets4.DumpPacket(data4, client);
                }
                catch (Exception ex)
                {
                    ProjectData.SetProjectError(ex);
                    WorldServiceLocator._WorldServer.Log.WriteLine(LogType.WARNING, "Unable to dump packet");
                }
            }
Example #2
0
    public static void On_SMSG_WARDEN_DATA(ref Packets.PacketClass Packet)
    {
        // START Warden Decryption
        var b = new byte[(Packet.Data.Length - 4)];

        Buffer.BlockCopy(Packet.Data, 4, b, 0, b.Length);
        RC4.Crypt(ref b, Maiev.KeyIn);
        Buffer.BlockCopy(b, 0, Packet.Data, 4, b.Length);
        // END

        var WardenData = new byte[(Packet.Data.Length - 4)];

        Buffer.BlockCopy(Packet.Data, 4, WardenData, 0, WardenData.Length);
        MaievOpcode Opcode = (MaievOpcode)Packet.GetInt8();

        Console.ForegroundColor = ConsoleColor.Cyan;
        Console.WriteLine("SMSG_WARDEN_DATA [{0}]", Opcode);
        Console.ForegroundColor = ConsoleColor.White;
        switch (Opcode)
        {
        case MaievOpcode.MAIEV_MODULE_INFORMATION:
        {
            var Name = Packet.GetByteArray(16);
            var Key  = Packet.GetByteArray(16);
            var Size = Packet.GetUInt32();
            Maiev.ModuleName = BitConverter.ToString(Name).Replace("-", "");
            Maiev.ModuleKey  = Key;
            ModuleLength     = (int)Size;
            Maiev.ModuleData = Array.Empty <byte>();
            if (File.Exists(@"modules\" + Maiev.ModuleName + ".mod") == false)
            {
                Console.WriteLine("[{0}][WARDEN] Module is missing.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
                Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
                response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_FAILED_OR_MISSING);
                SendWardenPacket(ref response);
                response.Dispose();
            }
            else
            {
                Console.WriteLine("[{0}][WARDEN] Module is initiated.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
                Maiev.ModuleData = File.ReadAllBytes(@"modules\" + Maiev.ModuleName + ".mod");
                if (Maiev.LoadModule(Maiev.ModuleName, ref Maiev.ModuleData, Maiev.ModuleKey))
                {
                    Console.WriteLine("[{0}][WARDEN] Successfully loaded the module.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
                    Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
                    response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_SUCCESS);
                    SendWardenPacket(ref response);
                    response.Dispose();
                }
                else
                {
                    Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
                    response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_FAILED_OR_MISSING);
                    SendWardenPacket(ref response);
                    response.Dispose();
                }
            }

            break;
        }

        case MaievOpcode.MAIEV_MODULE_TRANSFER:
        {
            var Size = Packet.GetUInt16();
            var Data = Packet.GetByteArray(Size);
            Maiev.ModuleData = Realmserver.Concat(Maiev.ModuleData, Data);
            ModuleLength    -= Size;
            if (ModuleLength <= 0)
            {
                Console.WriteLine("[{0}][WARDEN] Module is fully transfered.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
                if (Directory.Exists("modules") == false)
                {
                    Directory.CreateDirectory("modules");
                }

                File.WriteAllBytes(@"modules\" + Maiev.ModuleName + ".mod", Maiev.ModuleData);
                if (Maiev.LoadModule(Maiev.ModuleName, ref Maiev.ModuleData, Maiev.ModuleKey))
                {
                    Console.WriteLine("[{0}][WARDEN] Successfully loaded the module.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
                    Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
                    response.AddInt8((byte)MaievResponse.MAIEV_RESPONSE_SUCCESS);
                    SendWardenPacket(ref response);
                    response.Dispose();
                }
            }
            else
            {
                Console.WriteLine("[{0}][WARDEN] Module transfer. Bytes left: {1}", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), ModuleLength);
            }

            break;
        }

        case MaievOpcode.MAIEV_MODULE_RUN:
        {
            Console.WriteLine("[{0}][WARDEN] Requesting a scan.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));

            // TODO: Encrypt?
            Maiev.ReadKeys2();
            RC4.Crypt(ref WardenData, Maiev.ModKeyIn);
            var HandledBytes = Maiev.HandlePacket(WardenData);
            if (HandledBytes <= 0)
            {
                return;
            }

            var thePacket = Maiev.ReadPacket();
            if (thePacket.Length == 0)
            {
                return;
            }

            RC4.Crypt(ref WardenData, Maiev.ModKeyOut);

            // TODO: Decrypt?

            Packets.DumpPacket(thePacket);
            Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
            response.AddByteArray(thePacket);
            SendWardenPacket(ref response);
            response.Dispose();
            break;
        }

        case MaievOpcode.MAIEV_MODULE_UNK:
        {
            // TODO: Encrypt?
            Maiev.ReadKeys2();
            RC4.Crypt(ref WardenData, Maiev.ModKeyIn);
            var HandledBytes = Maiev.HandlePacket(WardenData);
            if (HandledBytes <= 0)
            {
                return;
            }

            var thePacket = Maiev.ReadPacket();
            if (thePacket.Length == 0)
            {
                return;
            }

            RC4.Crypt(ref WardenData, Maiev.ModKeyOut);
            // TODO: Decrypt?

            Packets.DumpPacket(thePacket);
            Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
            response.AddByteArray(thePacket);
            SendWardenPacket(ref response);
            response.Dispose();
            break;
        }

        case MaievOpcode.MAIEV_MODULE_SEED:
        {
            Maiev.GenerateNewRC4Keys(Realmserver.SS_Hash);
            var HandledBytes = Maiev.HandlePacket(WardenData);
            if (HandledBytes <= 0)
            {
                return;
            }

            var thePacket = Maiev.ReadPacket();
            Maiev.ModKeyIn  = new byte[258];
            Maiev.ModKeyOut = new byte[258];
            Packets.PacketClass response = new(OPCODES.CMSG_WARDEN_DATA);
            response.AddByteArray(thePacket);
            SendWardenPacket(ref response);
            response.Dispose();
            Maiev.ReadKeys();
            break;
        }

        default:
        {
            Console.WriteLine("[{0}][WARDEN] Unhandled Opcode [{1}] 0x{2:X}", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), Opcode, Conversions.ToInteger(Opcode));
            break;
        }
        }
    }