예제 #1
0
        private void handleInit(ByteBuffer packet)
        {
            this.sessionId   = packet.ReadUInt32();
            this.protocolVer = packet.ReadUInt32();
            this.publicKey   = packet.ReadBytes(0x80);
            // 4x read D (GameGuard);
            for (int i = 0; i < 4; i++)
            {
                packet.ReadUInt32();
            }
            this.blowfishKey = packet.ReadBytes(0x10);

            // set new key in LoginCrypt
            crypt.setKey(this.blowfishKey);
        }
예제 #2
0
 private void onCharSelected(ByteBuffer packet)
 {
     packet.ReadString();   // name
     packet.ReadInt32();    // CharId
     packet.ReadString();   // Title
     packet.ReadBytes(196); // 196 bytes
     this.obfusicateKey = packet.ReadInt32();
     this.clientCrypt.generateOpcodeTable(this.obfusicateKey);
 }
예제 #3
0
        public L2Packet handlePacket(byte[] incPacket, bool fromServer)
        {
            if (!fromServer)
            {
                return(null);
            }

            this.decryptPacket(incPacket);
            ByteBuffer binPacket = new ByteBuffer(incPacket);

            binPacket.ReadBytes(2); // discard first 2 bytes

            byte id = binPacket.ReadByte();

            switch (id)
            {
            case 0x00:     // Init
                //Console.Out.WriteLine("LoginServerpacket::Init");
                this.handleInit(binPacket);
                break;

            case 0x01:     // LoginFail
                //Console.Out.WriteLine("LoginServerpacket::LoginFail");
                break;

            case 0x02:     // AccountKicked
                //Console.Out.WriteLine("LoginServerpacket::AccountKicked");
                break;

            case 0x03:     // LoginOk
                //Console.Out.WriteLine("LoginServerpacket::LoginOk");
                break;

            case 0x04:     // Serverlist
                //Console.Out.WriteLine("LoginServerpacket::Serverlist");
                break;

            case 0x06:     // PlayFail
                //Console.Out.WriteLine("LoginServerpacket::PlayFail");
                break;

            case 0x07:     // PlayOk
                //Console.Out.WriteLine("LoginServerpacket::PlayOK");
                break;

            case 0x0b:     // GGAuth
                // Console.Out.WriteLine("LoginServerpacket::GGAuth");
                break;
            }
            return(new LoginServerPacket(binPacket));
        }
예제 #4
0
        public L2Packet handlePacket(byte[] incPacket, bool fromServer)
        {
            if (!fromServer)
                return null;

            this.decryptPacket(incPacket);
            ByteBuffer binPacket = new ByteBuffer(incPacket);
            binPacket.ReadBytes(2); // discard first 2 bytes

            byte id = binPacket.ReadByte();
            switch (id)
            {
                case 0x00: // Init
                    //Console.Out.WriteLine("LoginServerpacket::Init");
                    this.handleInit(binPacket);
                    break;
                case 0x01: // LoginFail
                    //Console.Out.WriteLine("LoginServerpacket::LoginFail");
                    break;
                case 0x02: // AccountKicked
                    //Console.Out.WriteLine("LoginServerpacket::AccountKicked");
                    break;
                case 0x03: // LoginOk
                    //Console.Out.WriteLine("LoginServerpacket::LoginOk");
                    break;
                case 0x04: // Serverlist
                    //Console.Out.WriteLine("LoginServerpacket::Serverlist");
                    break;
                case 0x06: // PlayFail
                    //Console.Out.WriteLine("LoginServerpacket::PlayFail");
                    break;
                case 0x07: // PlayOk
                    //Console.Out.WriteLine("LoginServerpacket::PlayOK");
                    break;
                case 0x0b: // GGAuth
                   // Console.Out.WriteLine("LoginServerpacket::GGAuth");
                    break;
            }
            return new LoginServerPacket(binPacket);
        }
예제 #5
0
        private void onKeyPacket(ByteBuffer packet)
        {
            packet.ReadByte();
            this.cryptKey = packet.ReadBytes(16);

            this.cryptKey[8]  = (byte)0xc8;
            this.cryptKey[9]  = (byte)0x27;
            this.cryptKey[10] = (byte)0x93;
            this.cryptKey[11] = (byte)0x01;
            this.cryptKey[12] = (byte)0xa1;
            this.cryptKey[13] = (byte)0x6c;
            this.cryptKey[14] = (byte)0x31;
            this.cryptKey[15] = (byte)0x97;

            serverCrypt.setKey(this.cryptKey);
            clientCrypt.setKey(this.cryptKey);
            // ddcd
            packet.ReadInt32();
            packet.ReadInt32();
            packet.ReadByte();
            this.obfusicateKey = packet.ReadInt32();
            this.clientCrypt.generateOpcodeTable(this.obfusicateKey);
        }
예제 #6
0
        public L2Packet handlePacket(byte[] rawPacket, bool fromServer)
        {
            if (rawPacket.Length < 3) // Valid data?
            {
                return(null);
            }
            if (fromServer)
            {
                serverCrypt.decrypt(rawPacket, 2, rawPacket.Length);
            }
            else
            {
                clientCrypt.decrypt(rawPacket, 2, rawPacket.Length);
            }

            ByteBuffer binPacket = new ByteBuffer(rawPacket);

            binPacket.ReadBytes(2); // Read 2 bytes ahead
            int opcode       = binPacket.ReadByte();
            int secondOpCode = -1;

            switch (state)
            {
            case GameClientState.CONNECTED:
                // Vom Server (ServerPacket)
                if (fromServer)
                {
                    switch (opcode)
                    {
                    case 0x2e:             // KeyPacket (Contains key, NOT Encrypted xD )
                        this.onKeyPacket(binPacket);
                        break;

                    case 0x09:             // CharSelectionInfo
                        this.state = GameClientState.AUTHED;
                        break;
                    }
                }
                // Vom Clienten
                else
                {
                }
                break;

            case GameClientState.AUTHED:
                if (fromServer)
                {
                    switch (opcode)
                    {
                    case 0x73:
                        this.state = GameClientState.IN_GAME;
                        //Console.Out.WriteLine(Util.printData(binPacket));
                        break;
                    }
                }
                else
                {
                    switch (opcode)
                    {
                    case 0x0d:
                        // get secondOpCode and set
                        secondOpCode = binPacket.ReadInt16();
                        break;

                    case 0x12:             // CharacterSelect
                        break;
                    }
                }
                break;

            case GameClientState.IN_GAME:
                if (fromServer)
                {
                    switch (opcode)
                    {
                    case 0xfe:
                        // get secondOpCode
                        secondOpCode = binPacket.ReadInt16();
                        break;

                    case 0x0b:             //CharSelected
                        this.onCharSelected(binPacket);
                        break;
                    }
                }
                else
                {
                    switch (opcode)
                    {
                    case 0x1f:
                        break;

                    case 0xd0:
                        // get secondOpCode
                        secondOpCode = binPacket.ReadInt16();
                        break;
                    }
                }
                break;
            }


            if (fromServer)
            {
                return(new GameServerPacket(binPacket));
            }
            else
            {
                return(new ClientPacket(binPacket));
            }
        }
예제 #7
0
        public L2Packet handlePacket(byte[] rawPacket, bool fromServer)
        {
            if (rawPacket.Length < 3) // Valid data?
                return null;
            if (fromServer)
                serverCrypt.decrypt(rawPacket, 2, rawPacket.Length);
            else
                clientCrypt.decrypt(rawPacket, 2, rawPacket.Length);

            ByteBuffer binPacket = new ByteBuffer(rawPacket);
            binPacket.ReadBytes(2); // Read 2 bytes ahead
            int opcode = binPacket.ReadByte();
            int secondOpCode = -1;

                switch (state)
                {
                    case GameClientState.CONNECTED:
                        // Vom Server (ServerPacket)
                        if (fromServer)
                        {
                            switch (opcode)
                            {

                                case 0x2e: // KeyPacket (Contains key, NOT Encrypted xD )
                                    this.onKeyPacket(binPacket);
                                    break;
                                case 0x09: // CharSelectionInfo
                                    this.state = GameClientState.AUTHED;
                                    break;
                            }
                        }
                        // Vom Clienten
                        else
                        {

                        }
                        break;
                    case GameClientState.AUTHED:
                        if (fromServer)
                        {
                            switch (opcode)
                            {
                                case 0x73:
                                    this.state = GameClientState.IN_GAME;
                                    //Console.Out.WriteLine(Util.printData(binPacket));
                                    break;
                            }
                        }
                        else
                        {
                            switch (opcode)
                            {
                                case 0x0d:
                                    // get secondOpCode and set
                                    secondOpCode = binPacket.ReadInt16();
                                    break;
                                case 0x12: // CharacterSelect
                                    break;
                            }
                        }
                        break;
                    case GameClientState.IN_GAME:
                        if (fromServer)
                        {
                            switch (opcode)
                            {
                                case 0xfe:
                                    // get secondOpCode
                                    secondOpCode = binPacket.ReadInt16();
                                    break;
                                case 0x0b: //CharSelected
                                    this.onCharSelected(binPacket);
                                    break;
                            }
                        }
                        else
                        {
                            switch (opcode)
                            {
                                case 0x1f:
                                    break;
                                case 0xd0:
                                    // get secondOpCode
                                    secondOpCode = binPacket.ReadInt16();
                                    break;
                            }
                        }
                        break;
                }

                if (fromServer)
                    return new GameServerPacket(binPacket);
                else
                {
                    return new ClientPacket(binPacket);
                }
        }
예제 #8
0
        private void onKeyPacket(ByteBuffer packet)
        {
            packet.ReadByte();
            this.cryptKey = packet.ReadBytes(16);

            this.cryptKey[8] = (byte)0xc8;
            this.cryptKey[9] = (byte)0x27;
            this.cryptKey[10] = (byte)0x93;
            this.cryptKey[11] = (byte)0x01;
            this.cryptKey[12] = (byte)0xa1;
            this.cryptKey[13] = (byte)0x6c;
            this.cryptKey[14] = (byte)0x31;
            this.cryptKey[15] = (byte)0x97;

            serverCrypt.setKey(this.cryptKey);
            clientCrypt.setKey(this.cryptKey);
            // ddcd
            packet.ReadInt32();
            packet.ReadInt32();
            packet.ReadByte();
            this.obfusicateKey = packet.ReadInt32();
            this.clientCrypt.generateOpcodeTable(this.obfusicateKey);
        }
예제 #9
0
 private void onCharSelected(ByteBuffer packet)
 {
     packet.ReadString(); // name
     packet.ReadInt32(); // CharId
     packet.ReadString(); // Title
     packet.ReadBytes(196);// 196 bytes
     this.obfusicateKey = packet.ReadInt32();
     this.clientCrypt.generateOpcodeTable(this.obfusicateKey);
 }
예제 #10
0
        private void handleInit(ByteBuffer packet)
        {
            this.sessionId = packet.ReadUInt32();
            this.protocolVer = packet.ReadUInt32();
            this.publicKey = packet.ReadBytes(0x80);
            // 4x read D (GameGuard);
            for (int i = 0; i < 4; i++)
                packet.ReadUInt32();
            this.blowfishKey = packet.ReadBytes(0x10);

            // set new key in LoginCrypt
            crypt.setKey(this.blowfishKey);
        }