Beispiel #1
0
    public static void On_SMSG_CHAR_ENUM(ref Packets.PacketClass Packet)
    {
        Console.WriteLine("[{0}][World] Received Character List.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
        var NumChars = Packet.GetInt8();

        if (NumChars > 0)
        {
            for (byte i = 1, loopTo = NumChars; i <= loopTo; i++)
            {
                var GUID        = Packet.GetUInt64();
                var Name        = Packet.GetString();
                var Race        = Packet.GetInt8();
                var Classe      = Packet.GetInt8();
                var Gender      = Packet.GetInt8();
                var Skin        = Packet.GetInt8();
                var Face        = Packet.GetInt8();
                var HairStyle   = Packet.GetInt8();
                var HairColor   = Packet.GetInt8();
                var FacialHair  = Packet.GetInt8();
                var Level       = Packet.GetInt8();
                var Zone        = Packet.GetInt32();
                var Map         = Packet.GetInt32();
                var PosX        = Packet.GetFloat();
                var PosY        = Packet.GetFloat();
                var PosZ        = Packet.GetFloat();
                var GuildID     = Packet.GetUInt32();
                var PlayerState = Packet.GetUInt32();
                var RestState   = Packet.GetInt8();
                var PetInfoID   = Packet.GetUInt32();
                var PetLevel    = Packet.GetUInt32();
                var PetFamilyID = Packet.GetUInt32();
                Console.WriteLine("[{0}][World] Logging in with character [{1}].", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), Name);
                Worldserver.CharacterGUID = GUID;
                Packets.PacketClass Response = new(OPCODES.CMSG_PLAYER_LOGIN);
                Response.AddUInt64(GUID);
                Worldserver.Send(Response);
                Response.Dispose();
                break;

                // Skip the equipment
                Packet.Offset += 20 * 9;
            }
        }
        else
        {
            Console.WriteLine("[{0}][World] No characters found.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
        }
    }
Beispiel #2
0
    public static void On_SMSG_AUTH_CHALLENGE(ref Packets.PacketClass Packet)
    {
        Console.WriteLine("[{0}][World] Received Auth Challenge.", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"));
        WS_WardenClient.InitWarden();
        Worldserver.ServerSeed = Packet.GetUInt32();
        var temp = Encoding.ASCII.GetBytes(Realmserver.Account.ToCharArray());

        temp = Realmserver.Concat(temp, BitConverter.GetBytes(0));
        temp = Realmserver.Concat(temp, BitConverter.GetBytes(Worldserver.ClientSeed));
        temp = Realmserver.Concat(temp, BitConverter.GetBytes(Worldserver.ServerSeed));
        temp = Realmserver.Concat(temp, Realmserver.SS_Hash);
        SHA1Managed algorithm1 = new();
        var         ShaDigest  = algorithm1.ComputeHash(temp);

        Worldserver.Decoding = true;
        VBMath.Randomize();
        Worldserver.ClientSeed = (uint)(uint.MaxValue * VBMath.Rnd());
        Packets.PacketClass Response = new(OPCODES.CMSG_AUTH_SESSION);
        Response.AddInt32(Realmserver.Revision);
        Response.AddInt32(0); // SessionID?
        Response.AddString(Realmserver.Account.ToUpper());
        Response.AddUInt32(Worldserver.ClientSeed);
        Response.AddByteArray(ShaDigest);
        Response.AddInt32(0); // Addon size
        Worldserver.Send(Response);
        Response.Dispose();
        Worldserver.Encoding = true;
    }
Beispiel #3
0
    public static void On_SMSG_PONG(ref Packets.PacketClass Packet)
    {
        var SequenceID = Packet.GetUInt32();
        var Latency    = Worldserver.timeGetTime() - Worldserver.PingSent;

        if (SequenceID == Worldserver.CurrentPing && Latency >= 0)
        {
            Worldserver.CurrentLatency = Latency;
        }
    }
 public void On_CMSG_WORLD_TELEPORT(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_WORLD_TELEPORT", client.IP, client.Port);
     if (client.Access >= AccessLevel.GameMaster)
     {
         packet.GetInt16();
         int   Time = packet.GetInt32();
         uint  Map  = packet.GetUInt32();
         float X    = packet.GetFloat();
         float Y    = packet.GetFloat();
         float Z    = packet.GetFloat();
         float O    = packet.GetFloat();
         client.Character.Teleport(X, Y, Z, O, checked ((int)Map));
     }
 }
Beispiel #5
0
        public void MaievResult(ref WS_PlayerData.CharacterObject objCharacter, ref Packets.PacketClass Packet)
        {
            ushort bufLen    = Packet.GetUInt16();
            uint   checkSum  = Packet.GetUInt32();
            int    tmpOffset = Packet.Offset;

            byte[] data = Packet.GetByteArray();
            Packet.Offset = tmpOffset;
            if (!ControlChecksum(checkSum, data))
            {
                WorldServiceLocator._WorldServer.Log.WriteLine(LogType.CRITICAL, "[WARDEN] Failed checkSum at result packet. Cheater?");
                objCharacter.CommandResponse("[WARDEN] Pack your bags cheater, you're going!");
                return;
            }
            WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[WARDEN] Result bufLen:{0} checkSum:{1:X}", bufLen, checkSum);
            objCharacter.WardenData.Scan.HandleResponse(ref Packet);
        }
Beispiel #6
0
    public void On_CMSG_SET_TRADE_GOLD(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
    {
        packet.GetInt16();
        var gold = packet.GetUInt32();

        WorldServiceLocator._WorldServer.Log.WriteLine(LogType.DEBUG, "[{0}:{1}] CMSG_SET_TRADE_GOLD [gold={2}]", client.IP, client.Port, gold);
        if (client.Character.tradeInfo != null)
        {
            if (client.Character.tradeInfo.Trader == client.Character)
            {
                client.Character.tradeInfo.TraderGold = gold;
                client.Character.tradeInfo.SendTradeUpdateToTarget();
            }
            else
            {
                client.Character.tradeInfo.TargetGold = gold;
                client.Character.tradeInfo.SendTradeUpdateToTrader();
            }
        }
    }
Beispiel #7
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;
        }
        }
    }
Beispiel #8
0
 public void On_MSG_BATTLEGROUND_PLAYER_POSITIONS(ref Packets.PacketClass packet, ref WS_Network.ClientClass client)
 {
     packet.GetUInt32();
 }