Protokół GG8.0 Problem z logowaniem

0

Witam

Kiedyś zacząłem pisać komunikator w oparciu o bibliotekę ggsharp jednakże była ona oparta o protokół 7.0 wiec wpadłem na pomysł napisania własnej obsługi nowszego.
Mój problem wygląda tak że po wysłaniu całej struktury dotyczącej logowania nie dostaje od serwera żadnego komunikatu.

           Reciver = new BinaryReader(Stream);
            Writer = new BinaryWriter(Stream);
            Int32 Header;
            while (connect.Connected)
            {
                Header = Reciver.ReadInt32();
                switch (Header)
                {
                    case Headers.WelcomeHeder:
                        {
                            MessageBox.Show(Reciver.ReadInt32().ToString());
                            Int32 seed;
                            seed = Reciver.ReadInt32();
                            login80 loginstr = new login80();
                            loginstr.uin = (Int32)number;
                            loginstr.language = new char[2];
                            loginstr.language = "pl".ToCharArray();
                            loginstr.hash_type = (byte)0x02;
                            var passwordBytes = Encoding.UTF8.GetBytes(password);
                            var seedBytes = BitConverter.GetBytes(seed);
                            var bytes = new byte[passwordBytes.Length + seedBytes.Length];
                            passwordBytes.CopyTo(bytes, 0);
                            seedBytes.CopyTo(bytes, passwordBytes.Length);
                            var sha1Hash = System.Security.Cryptography.SHA1Managed.Create();
                            sha1Hash.ComputeHash(bytes);
                            loginstr.hash = bytes.ToString().ToCharArray();
                            loginstr.status = (byte)0x0002;
                            loginstr.flags = (byte)0x00000001;
                            loginstr.features = (byte)0x00000007;
                            loginstr.external_ip = 0;
                            loginstr.external_port = 0;
                            loginstr.local_ip = 0;
                            loginstr.local_port = 0;
                            loginstr.image_size = (char)241;
                            loginstr.unknown1 = (byte)0x64;
                            loginstr.version_len = 35;
                            loginstr.version = new char[loginstr.version_len];
                            loginstr.version = "Gadu-Gadu Client build 10.0.0.10450".ToCharArray();
                            loginstr.description_size = 1;
                            loginstr.description = new char[loginstr.description_size];
                            loginstr.description[0] = 'A';
                            Writer.Write((Int32)0x0031);
                            Writer.Write((Int32)140);
                            Writer.Write(loginstr.uin);
                            Writer.Write(loginstr.language);
                            Writer.Write((byte)loginstr.hash_type);
                            Writer.Write(bytes);
                            for (int i = 0; i < 64 - bytes.Length; i++)
                                Writer.Write((byte)0);
                            Writer.Write(loginstr.status);
                            Writer.Write(loginstr.flags);
                            Writer.Write(loginstr.features);
                            Writer.Write(loginstr.external_ip);
                            Writer.Write(loginstr.external_port);
                            Writer.Write(loginstr.local_ip);
                            Writer.Write(loginstr.local_port);
                            Writer.Write(loginstr.image_size);
                            Writer.Write(loginstr.unknown1);
                            Writer.Write(loginstr.version_len);
                            Writer.Write(loginstr.version);
                            Writer.Write(loginstr.description_size);
                                Writer.Write(loginstr.description);
                        } break;
                }

Gdy zmienię typ pakietu na 0x0019(ten od gg7.0) to dostaje przynajmniej pakiet o niepowodzeniu logowania natomiast tutaj nie dostaje nic. Na razie wielkość jest ustalona na sztywno ale zostanie to zmienione. Proszę o pomoc ponieważ nie wiem jak rozwiązać ten problem.

0

Sprawdź dobrze wielkość pakietu.

0

Tak był tutaj błąd powinno być 140 już poprawiłem, lecz nie naprawiło to problemu.

0

Możesz zajrzeć w moje źródła, metoda logowania (eGadu::login) działa dobrze

http://code.google.com/p/egadu/source/browse/trunk/src/eGadu.cpp?r=4

0

Dlaczego gdy wysyłasz dopełnienie z zer przy hashu to robisz to od 21do 64 a nie od (64-hash.lenght). I jak dałem tak masz od 21 do dostaje pakiet który ma w nagłówku 3 jest długości jednego bajta i w sobie ma bajta 31. Tak w ogóle to dzięki za zainteresowanie, i chęć pomocy

0

Funkcja hashująca zwraca 20 bajtów (taka jest długość SHA1), a reszta pola to pozostałość po starej funkcji hashującej.

A pakiet 0x0003 to według opisu protokołu udane logowanie przed nowym GG.

0

Tak tylko wykonałem wszystko dla logowania 8.0 poza tym status numeru się nie zmienia. mógłbyś podać gg albo maila bo widzę że znasz się na rzeczy. a forum zaśmiecać taką luźną rozmową o protokole to chyba nie ma co.

0

Dla potomności się przyda na forum.
Nie wiem jak w starszych wersjach protokołu, ale w najnowszej żeby ktoś zobaczył nasz status trzeba wysłać gg_notify. Zobacz do opisu protokołu bo piszę z telefonu i teraz ci nie wyjaśnię

0

Tak miałeś racje nie doczytałem tego, zastanawia mnie jeszcze ten fakt, że dostaje pakiet 0x0003 zamiast 0x0035. Nie wiesz czym to może być spowodowane??

0

Najlepiej to spróbuj porównać to co ty wysyłasz z oryginalnym klientem.
Ja dzięki snifferowi rozwiązałem masę problemów.

0

jakiego sniffera używałeś

0

Wireshark

1 użytkowników online, w tym zalogowanych: 0, gości: 1