예제 #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"));
            byte NumChars = Packet.GetInt8();

            if (NumChars > 0)
            {
                for (byte i = 1, loopTo = NumChars; i <= loopTo; i++)
                {
                    ulong  GUID        = Packet.GetUInt64();
                    string Name        = Packet.GetString();
                    byte   Race        = Packet.GetInt8();
                    byte   Classe      = Packet.GetInt8();
                    byte   Gender      = Packet.GetInt8();
                    byte   Skin        = Packet.GetInt8();
                    byte   Face        = Packet.GetInt8();
                    byte   HairStyle   = Packet.GetInt8();
                    byte   HairColor   = Packet.GetInt8();
                    byte   FacialHair  = Packet.GetInt8();
                    byte   Level       = Packet.GetInt8();
                    int    Zone        = Packet.GetInt32();
                    int    Map         = Packet.GetInt32();
                    float  PosX        = Packet.GetFloat();
                    float  PosY        = Packet.GetFloat();
                    float  PosZ        = Packet.GetFloat();
                    uint   GuildID     = Packet.GetUInt32();
                    uint   PlayerState = Packet.GetUInt32();
                    byte   RestState   = Packet.GetInt8();
                    uint   PetInfoID   = Packet.GetUInt32();
                    uint   PetLevel    = Packet.GetUInt32();
                    uint   PetFamilyID = Packet.GetUInt32();
                    Console.WriteLine("[{0}][World] Logging in with character [{1}].", Strings.Format(DateAndTime.TimeOfDay, "HH:mm:ss"), Name);
                    Worldserver.CharacterGUID = GUID;
                    var Response = new Packets.PacketClass(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"));
            }
        }
예제 #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);
            var algorithm1 = new SHA1Managed();
            var ShaDigest  = algorithm1.ComputeHash(temp);

            Worldserver.Decoding = true;
            VBMath.Randomize();
            Worldserver.ClientSeed = (uint)(uint.MaxValue * VBMath.Rnd());
            var Response = new Packets.PacketClass(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;
        }
예제 #3
0
        public static void On_SMSG_PONG(ref Packets.PacketClass Packet)
        {
            uint SequenceID = Packet.GetUInt32();
            int  Latency    = Worldserver.timeGetTime() - Worldserver.PingSent;

            if (SequenceID == Worldserver.CurrentPing && Latency >= 0)
            {
                Worldserver.CurrentLatency = Latency;
            }
        }
예제 #4
0
        public static void On_SMSG_WARDEN_DATA(ref Packets.PacketClass Packet)
        {
            // START Warden Decryption
            byte[] 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

            byte[] 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:
            {
                byte[] Name = Packet.GetByteArray(16);
                byte[] Key  = Packet.GetByteArray(16);
                uint   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:
            {
                ushort Size = Packet.GetUInt16();
                byte[] 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);
                int HandledBytes = Maiev.HandlePacket(WardenData);
                if (HandledBytes <= 0)
                {
                    return;
                }

                byte[] 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);
                int HandledBytes = Maiev.HandlePacket(WardenData);
                if (HandledBytes <= 0)
                {
                    return;
                }

                byte[] 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);
                int HandledBytes = Maiev.HandlePacket(WardenData);
                if (HandledBytes <= 0)
                {
                    return;
                }

                byte[] 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;
            }
            }
        }