Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Игровой клиент (https://forum.zone-game.info/forumdisplay.php?f=54)
-   -   Пакет AutchRequest(Client) (https://forum.zone-game.info/showthread.php?t=43460)

JewSzz 28.01.2019 00:18

Пакет AutchRequest(Client)
 
делаю пакет AutchRequest
Код:

int startlen = UserName.Length * 2 + 2;
        byte[] AuthRequest = new byte[startlen + 33];
                 
        AuthRequest[0] = 0x2B;//???? это размер... не знаю правильно или нет
        AuthRequest[1] = 0x00;
        AuthRequest[2] = 0x2B;//AutchRequest(Client)
        byte[] data = System.Text.Encoding.Unicode.GetBytes(UserName);//each char becomes 2 bytes
        uint j = 3;
        for (int i = 0; i < data.Length; i++)
        {
            AuthRequest[j] = data[i];
            j++;
        }
        AuthRequest[j] = (0x00);j++;//null terminated string
        AuthRequest[j] = (0x00); j++;//null terminated string
        AuthRequest[j] = play_ok_[4]; j++;
        AuthRequest[j] = play_ok_[5]; j++;
        AuthRequest[j] = play_ok_[6]; j++;
        AuthRequest[j] = play_ok_[7]; j++;
        AuthRequest[j] = play_ok_[0]; j++;
        AuthRequest[j] = play_ok_[1]; j++;
        AuthRequest[j] = play_ok_[2]; j++;
        AuthRequest[j] = play_ok_[3]; j++;
        AuthRequest[j] = login_ok_[0]; j++;
        AuthRequest[j] = login_ok_[1]; j++;
        AuthRequest[j] = login_ok_[2]; j++;
        AuthRequest[j] = login_ok_[3]; j++;
        AuthRequest[j] = login_ok_[4]; j++;
        AuthRequest[j] = login_ok_[5]; j++;
        AuthRequest[j] = login_ok_[6]; j++;
        AuthRequest[j] = login_ok_[7]; j++;
        AuthRequest[j] = (0x01); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x3C); j++;//
        AuthRequest[j] = (0x01); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x00); j++;//
        AuthRequest[j] = (0x01);//
        crypt_.encrypt(AuthRequest, 2, j );
        connection_.send_packet(AuthRequest, startlen + 33, socket);

вот encrypt
Код:

      public void setKey(byte[] key)
        {
            _key[0] = key[0];
            _key[1] = key[1];
            _key[2] = key[2];
            _key[3] = key[3];
            _key[4] = key[4];
            _key[5] = key[5];
            _key[6] = key[6];
            _key[7] = key[7];
            _key[8] = key[8];
            _key[9] = key[9];
            _key[10] = key[10];
            _key[11] = key[11];
            _key[12] = key[12];
            _key[13] = key[13];
            _key[14] = key[14];
            _key[15] = key[15];
            enabled = true;
        }

        public void encrypt(byte[] raw , int offset, uint size)
        {
            if (!enabled)
                return;

            uint temp = 0;
            for (int i = 0; i < size; i++)
            {
                uint temp2 = raw[offset+i] & (uint)0xff;
                temp = (temp2 ^ _key[i & 15] ^ temp);
                raw[offset+i] = (byte)temp;
            }

            uint old = ((uint)_key[8]) & (uint)0xff;
            old |= (uint)(((uint)_key[9]) << 8 & (uint)0xff00);
            old |= (uint)(((uint)_key[10] << 0x10) & (uint)0xff0000);
            old |= (uint)(((uint)_key[11] << 0x18) & (uint)0xff000000);

            old += (uint)size;

            _key[8] = (byte)(old & 0xff);
            _key[9] = (byte)(old >> 0x08 & 0xff);
            _key[10] = (byte)(old >> 0x10 & 0xff);
            _key[11] = (byte)(old >> 0x18 & 0xff);
        }

получается я шифрую AuthRequest со 2 позиции.. после отправки на сервер какая то тарабарщина
Код:

...
Unknown Packet: 95 on State: CONNECTED Client: [IP: 127.0.0.1]
0000: 0d 17 71 37 83 a9 63 05 89 77 f3 cc 33 bf cc b0    ..q7..c..w..3...
0010: 21 19 14 37 f0 a9 17 05 89 77 73 65 24 72 97 bf    !..7.....wse$r..
0020: 79 17 14 37 f0 a9                                  y..7..
....

....
Unknown Packet: 90 on State: CONNECTED Client: [IP: 127.0.0.1]
0000: 7d fb 9d e1 9b c1 1d 7c 53 4c 41 e5 da 57 8b d8    }......|SLA..W..
0010: 97 62 f8 e1 e8 c1 69 7c 53 4c f3 8b 03 e3 1f ba    .b....i|SL......
0020: 09 fb f8 e1 e8 c1 68 7c                            ......h|
....

...
Unknown Packet: db on State: CONNECTED Client: [IP: 127.0.0.1]
0000: 48 15 5a ff c8 3d 5b 20 e0 d5 8f ec 49 7c 4e 4e    H.Z..=[ ....I|NN
0010: 89 ea 3f ff bb 3d 2f 20 e0 d5                      ..?..=/ ..
....

логин постоянно один и тот же

Zubastic 28.01.2019 01:22

Re: Пакет AutchRequest(Client)
 
Потому что там используется RSA.
                    var name = Account.Login;
                    var pw = Account.Password;
                    var loginInfo = new byte[128];
                    loginInfo[0x5B] = 0x24;
                    for (var i = 0; i < name.Length; i++) loginInfo[0x5E + i] = (byte) name[i];
                    for (var i = 0; i < pw.Length; i++) loginInfo[0x6C + i] = (byte) pw[i];
                    byte[] exponent = {1, 0, 1};
                    var rsaKeyInfo = new RSAParameters
                    {
                        Modulus = GameDataToServer.RsaKey,
                        Exponent = exponent
                    };
                    var poo = new RSA(); //Set RSAKeyInfo to the public key values. 
                    poo.ImportParameters(rsaKeyInfo);
                    var outb = poo.EncryptValue(loginInfo);
                    var loginSend = new byte[176];
                    outb.CopyTo(loginSend, 128 - outb.Length + 1);
                    loginSend[129] = GameDataToServer.Session[0];
                    loginSend[130] = GameDataToServer.Session[1];
                    loginSend[131] = GameDataToServer.Session[2];
                    loginSend[132] = GameDataToServer.Session[3];
                    loginSend[133] = 0x23; //gameguard reply start
                    loginSend[134] = 0x01;
                    loginSend[135] = 0x00;
                    loginSend[136] = 0x00;
                    loginSend[137] = 0x67; //
                    loginSend[138] = 0x45;
                    loginSend[139] = 0x00;
                    loginSend[140] = 0x00;
                    loginSend[141] = 0xAB; //
                    loginSend[142] = 0x89;
                    loginSend[143] = 0x00;
                    loginSend[144] = 0x00;
                    loginSend[145] = 0xEF; //
                    loginSend[146] = 0xCD;
                    loginSend[147] = 0x00;
                    loginSend[148] = 0x00; //game guard reply stop
                    loginSend[149] = 0x08; //
                    loginSend[150] = 0x00;
                    loginSend[151] = 0x00;
                    loginSend[152] = 0x00;
                    loginSend[153] = 0x00; //
                    loginSend[154] = 0x00;
                    loginSend[155] = 0x00;
                    loginSend[156] = 0x00;
                    loginSend[157] = 0x00; //
                    loginSend[158] = 0x00;
                    loginSend[159] = 0x00;
 
                    General.CheckSum(loginSend, 160);
                    SendToServer(loginSend);
Code: Java

JewSzz 28.01.2019 01:23

Re: Пакет AutchRequest(Client)
 
Уже к гейм серверу подключаюсь
к логину вот
Код:

byte[] login_info = new byte[128];

        login_info[0x5B] = 0x24;

        for (int i = 0; i < Globals.UserName.Length; i++)
        {
            login_info[0x5E + i] = (byte)Globals.UserName[i];
        }

        for (int i = 0; i < Globals.Password.Length; i++)
        {
            login_info[0x6C + i] = (byte)Globals.Password[i];
        }

        byte[] exponent = { 1, 0, 1 };

        System.Security.Cryptography.RSAParameters RSAKeyInfo = new System.Security.Cryptography.RSAParameters();

        //Set RSAKeyInfo to the public key values.
        RSAKeyInfo.Modulus = RSA_enc_key_;
        RSAKeyInfo.Exponent = exponent;

        RSA_Managed rsa_managed = new RSA_Managed();
        rsa_managed.ImportParameters(RSAKeyInfo);

        byte[] encrypted_bytes = new byte[128];

        encrypted_bytes = rsa_managed.EncryptValue(login_info);

        byte[] login_send = new byte[176];
        byte[] prelogin_send = new byte[176];

        encrypted_bytes.CopyTo(login_send, 1);

        login_send[129] = RSA_key_[0];
        login_send[130] = RSA_key_[1];
        login_send[131] = RSA_key_[2];
        login_send[132] = RSA_key_[3];
        login_send[133] = 0x23;//GG reply start
        login_send[134] = 0x01;
        login_send[135] = 0x00;
        login_send[136] = 0x00;
        login_send[137] = 0x67;//
        login_send[138] = 0x45;
        login_send[139] = 0x00;
        login_send[140] = 0x00;
        login_send[141] = 0xAB;//
        login_send[142] = 0x89;
        login_send[143] = 0x00;
        login_send[144] = 0x00;
        login_send[145] = 0xEF;//
        login_send[146] = 0xCD;
        login_send[147] = 0x00;
        login_send[148] = 0x00;//GG reply stop
        login_send[149] = 0x08;//
        login_send[150] = 0x00;
        login_send[151] = 0x00;
        login_send[152] = 0x00;
        login_send[153] = 0x00;//
        login_send[154] = 0x00;
        login_send[155] = 0x00;
        login_send[156] = 0x00;
        login_send[157] = 0x00;//
        login_send[158] = 0x00;
        login_send[159] = 0x00;

        ulong checksum = Global.CheckSum(login_send, 160);

        login_send[160] = (byte)(checksum & 0xff);
        login_send[161] = (byte)(checksum >> 0x08 & 0xff);
        login_send[163] = (byte)(checksum >> 0x10 & 0xff);
        login_send[163] = (byte)(checksum >> 0x18 & 0xff);

        blowfish_cipher_.init(true, blowfish_key_);
        blowfish_cipher_.processBigBlock(login_send, 0, prelogin_send, 0, 176);

        byte[] login_packet = new byte[178];

        login_packet[0] = 0xB2;
        login_packet[1] = 0x00;

        prelogin_send.CopyTo(login_packet, 2);

        connection_.send_packet(login_packet, 178, socket);

Добавлено через 11 минут
нашел в место своего encrypt вот такое чудо
Код:

public static void encXORPass(byte[] raw, int offset, int size, int key)
    {
        int stop = size - 8;
        int pos = 4 + offset;
        int edx;
        int ecx = key; // Initial xor key

        while (pos < stop)
        {
            edx = (raw[pos] & 0xFF);
            edx |= (raw[pos + 1] & 0xFF) << 8;
            edx |= (raw[pos + 2] & 0xFF) << 16;
            edx |= (raw[pos + 3] & 0xFF) << 24;

          ecx += edx;

            edx ^= ecx;

            raw[pos] = (byte)(edx & 0xFF);
            raw[pos + 1] = (byte)(edx >> 8 & 0xFF);
            raw[pos + 2] = (byte)(edx >> 16 & 0xFF);
            raw[pos + 3] = (byte)(edx >> 24 & 0xFF);
            pos += 4;
        }

        raw[pos++] = (byte)(ecx & 0xFF);
        raw[pos++] = (byte)(ecx >> 8 & 0xFF);
        raw[pos++] = (byte)(ecx >> 16 & 0xFF);
        raw[pos++] = (byte)(ecx >> 24 & 0xFF);
    }

    public static void decXORPass(byte[] raw, int offset, int size, int key)
    {
        int stop = 4 + offset;
        int pos = size - 12;
        int edx;
        int ecx = key; // Initial xor key

        while (stop <= pos)
        {
            edx = (raw[pos] & 0xFF);
            edx |= (raw[pos + 1] & 0xFF) << 8;
            edx |= (raw[pos + 2] & 0xFF) << 16;
            edx |= (raw[pos + 3] & 0xFF) << 24;

            edx ^= ecx;

            ecx -= edx;
            raw[pos] = (byte)(edx & 0xFF);
            raw[pos + 1] = (byte)(edx >> 8 & 0xFF);
            raw[pos + 2] = (byte)(edx >> 16 & 0xFF);
            raw[pos + 3] = (byte)(edx >> 24 & 0xFF);
            pos -= 4;
        }

        //raw[pos++] = (byte)(ecx & 0xFF);
        //raw[pos++] = (byte)(ecx >> 8 & 0xFF);
        //raw[pos++] = (byte)(ecx >> 16 & 0xFF);
        //raw[pos++] = (byte)(ecx >> 24 & 0xFF);
    }

только не пойму, что там под int key

Zubastic 28.01.2019 04:45

Re: Пакет AutchRequest(Client)
 
Ну это везде так. Вопрос то в чем? Или все нормально?)

JewSzz 28.01.2019 07:30

Re: Пакет AutchRequest(Client)
 
что то я не пойму
Код:

user:test
key:PlayOk: 643217812 -1530561126 LoginOk:0 0
PlayOk: 643217812 -1530561126 LoginOk:0 0
[C]
0000: 03 74 00 65 00 73 00 74 00 00 00 01 03 07 00 10    .t.e.s.t........

Login accepted player test waited(0ms)

а в ответ пришел пакет с опкодом 0x09 такого в исходниках нету что то должно было прийти CharacterSelectInfo

JewSzz 28.01.2019 11:17

Re: Пакет AutchRequest(Client)
 
если я правильно понял дальше идет
Код:

private void characterselect(Socket socket,byte[] data)
    {
        byte[] characterselect = new byte[21];
        characterselect[0] = 0x15;
        characterselect[1] = 0x00;
        characterselect[2] = 0x12;
        characterselect[3] = 0x00;
        characterselect[4] = 0x00;
        characterselect[5] = 0x00;
        characterselect[6] = 0x00;
        characterselect[7] = 0x00;
        characterselect[8] = 0x00;
        characterselect[9] = 0x00;
        characterselect[10] = 0x00;
        characterselect[11] = 0x00;
        characterselect[12] = 0x00;
        characterselect[13] = 0x00;
        characterselect[14] = 0x00;
        characterselect[15] = 0x00;
        characterselect[16] = 0x00;
        characterselect[17] = 0x00;
        characterselect[18] = 0x00;
        characterselect[19] = 0x00;
        characterselect[20] = 0x00;
        connection_.send_packet(characterselect, 21, socket);
    }

выбор персонажа
затем
Код:

private void RequestExManorList(Socket socket)
    {
        byte[] REMList = new byte[5];
        REMList[0] = 0x03;
        REMList[1] = 0x00;
        REMList[2] = 0xd0;
        REMList[3] = 0x08;
        REMList[4] = 0x00;
        connection_.send_packet(REMList, 5, socket);
    }
    private void RequestQuestList(Socket socket)
    {
        byte[] RQList = new byte[3];
        RQList[0] = 0x03;
        RQList[1] = 0x00;
        RQList[2] = 0x63;
        connection_.send_packet(RQList, 3, socket);
    }

квест лист и монор лист затем
Код:

private void Enterworld(Socket socket)
    {
        byte[] EWorld = new byte[3];
        EWorld[0] = 0x03;
        EWorld[1] = 0x00;
        EWorld[2] = 0x03;
        connection_.send_packet(EWorld, 3, socket);
    }

но что то не то кто с опкодами подскажет
сервер на Enterworld отвечает вообще
Код:

user:test
key:PlayOk: -1869213729 -1465200675 LoginOk:0 0
PlayOk: -1869213729 -1465200675 LoginOk:0 0
[C]
0000: 03 74 00 65 00 73 00 74 00 00 00 01 03 07 00 10    .t.e.s.t........

Login accepted player test waited(0ms)
Client: [Account: test - IP: 127.0.0.1] sent a 0xd0 without the second opcode.
Client: [Character: test - Account: test - IP: 127.0.0.1] - Failed reading: [C] 4D RequestStartPledgewar - L2J Server Version:  - DP Revision:

опкоды не правильтно 100% беру с исходов сервака пишет нет пакета

Zubastic 28.01.2019 20:27

Re: Пакет AutchRequest(Client)
 
Если кривые опкоды, то это 99% кривое шифрование. Смотри его. Так же юзай пакетхак.

JewSzz 29.01.2019 10:15

Re: Пакет AutchRequest(Client)
 
я вообще пока убрал на серваке шифрование :)


Текущее время: 04:33. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot