===============OPIS CZĘŚCI HTTP PROTOKOŁU GADU-GADU=============== Piotr Mach Opis powstał na podstawie analizy pakietów i źródeł ekg, opis dla wersji 4.9.3 (0x18), starsze klienty używają innych skryptów o podobnej funkcjonalności. Spis treści: 0. Wstęp 1. Szukanie osób w katalogu publicznym 1.1 Według imię, nazwisko, nick, płeć, miasto, rok ur. 1.2 Według numerka 2. Sprawdzanie/zmiana danych w kat publicznym 2.1 Sprawdzenie 2.2 Zmiana 3. Rejestrowanie konta, usunięcie i zmiana hasła dla konta 3.1 Rejestracja 3.2 Usunięcie konta 3.3 Zmiana hasła 4. Operacje związane z przechowywaniem listy kontaktów na serwerze 4.1 Wysłanie 4.2 Pobranie 4.3 Usunięcie 5. Wysyłanie hasła na email 0. WSTĘP Komunikacja z appmsg.gadu-gadu.pl metodą GET HTTP 1.0 została opisana w protocol.html, pozostałe pakiety używają POST dla HTTP 1.1 i zostały opisane w tym dokumencie. Wszystkie zapytanie http metodą post mają postać: POST $PATH HTTP/1.0 Host: $HOST Content-Type: application/x-www-form-urlencoded User-Agent: $AGENT Content-Length: $LENGTH Pragma: no-cache $DATA AGENT to np: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98) lub inne wymienione w protocol.html LENGTH oczywiście trzeba sobie wyliczyć = strlen (DATA) Jeśli będzie mowa o wysyłaniu danych do serwera to chodzi o cały powyższy pakiet, opisane zostaną tylko: HOST, PATH, DATA Pisząc 'wysyłamy pola: pole1, pole2' mowa o DATA o wartości pole1=aaa&pole2=bbb itp. Pamiętaj że wypadałoby zastosować urlencode przed wysłaniem. Dla jasności, pakiet jest wysyłany na hosta o IP odpowiadającemu HOST na port 80. Odpowiedzi serwera na powyższe zapytania mają mniej więcej postać: HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Date: Mon, 01 Jul 2002 22:30:31 GMT Connection: Keep-Alive Content-Length: $LENGTH Content-Type: text/html Set-Cookie: ASPSESSIONIDQQGGGLJC=CAEKMBGDJCFBEOKCELEFCNKH; path=/ Cache-control: private $RESPONSE lub podobnie :), nagłówki nie są dla nas ważne, można zauważyć tylko to że czasami ustawia Cookie. Pisząc dalej że serwer "odpowie wartością", mowa tylko o RESPONSE 1. Szukanie osób w katalogu publicznym 1.1 Według imię, nazwisko, nick, płeć, miasto, rok ur. HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmpubquery2.asp Wysyłamy następujące pola: Mode o wartości '0' FirstName imię - może być puste LastName nazwisko - może być puste NickName pseudo - może być puste Gender płeć - '1'-kobieta, '2'-mezczyzna, '-1'-nieokreślone City miasto - może być puste MinBirth od rok ur.- '0' gdy nie podajemy MaxBirth do rok ur.- '0' gdy nie podajemy ActiveOnly Tylko dostępne '1'-tak, puste-nie start uin od którego zacząć szukanie, puste-brak PRZYKŁAD: Mode=0&FirstName=aga&LastName=&NickName=&Gender=1&City=wawa&MinBirth=1980&MaxBirth=1984&ActiveOnly=&start= Serwer odpowie: query_results: $REKORDY NextStart:$UIN UIN na końcu mówi na którym uin'ie zakończono szukanie, można to wykorzystać podając następnym razem tą wartość w polu 'start' REKORDY to 0-50 kolejnych 8 linijkowych rekordów w formacie cyfra statusu 1-niedostepny, 2-zaraz wracam, 3-dostepny uin imię nazwisko nick rok ur cyfra płeć 1-kobieta, 2-mezczyzma, 0-nieokreslone miasto PRZYKŁAD jednego rekordu: 1 1000 jas fasola bean 1900 2 warszawa Jeśli którejś danej brak, linia będzie pusta. 1.2 Według numerka HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmpubquery2.asp Wysyłamy następujące pola: Mode o wartości '3' UserId uin start uin od którego zacząć szukanie, puste-brak PRZYKŁAD: Mode=3&UserId=1000&start= Odpowiedzią jest taki sam jak dla pkt 1.1 z tym ze będzie to najwyżej jeden 8 linijkowy rekord 2. Sprawdzanie/zmiana danych w kat. publicznym 2.1 Sprawdzenie HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmpubdetails3.asp Wysyłamy następujące pola FmNum numerek Pass hasło, plain-text (sic!) PRZYKŁAD:FmNum=1000&Pass=sekret Jeśli hasło jest prawidłowe serwer powinien odpowiedzieć: query_result: imie nazwisko nick rok płeć miasto 2.2 Zmiana HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmpubreg2.asp Wysyłamy pola: FmNum uin Pass haslo uin'a, plain text FirstName imię - może być puste LastName nazwisko - może być puste NickName nick - może być puste BirthYear rok ur. - może być puste Gender płeć - wartości jak w pkt 1.1 City miasto - może być puste PRZYKŁAD: FmNum=1000&Pass=sekret&FirstName=imie&LastName=nazwisko&NickName=nick&BirthYear=1000&Gender=1&City=miasto Jeśli się udało serwer odpowie: reg_sucess: 3. Rejestrowanie konta, usunięcie i zmiana hasła dla konta 3.1 Rejestracja HOST = register.gadu-gadu.pl PATH = /appsvc/fmregister.asp Wysyłamy pola: pwd hasło dla nowego uin'a email email do przypominania hasła code hash http liczony z email+pwd (algorytmu szukaj w źródłach EKG lib/common.c) PRZYKŁAD: pwd=sekret&email=moj*adres!email.pl&code=1104465363 Jeśli wszystko przebiegło poprawnie serwer odpowie: reg_success:$UIN UIN - nowy uin, który właśnie otrzymaliśmy 3.2 Usunięcie konta HOST = register.gadu-gadu.pl PATH = /appsvc/fmregister.asp Wysyłamy pola: fmnumber $UIN fmpwd haslo, plain text delete 1 fmemail email podany przy rejestracji konta pwd nowe przypadkowe hasło ??? email deletedaccount*gadu!gadu.pl code http hash liczony z email+pwd PRZYKLAD: fmnumber=1400545&fmpwd=sekret&delete=1&pwd=1400460480&email=deletedaccount@gadu%2Dgadu.pl&code=335674957 Jeśli się udało serwer odpowie: reg_success:$UIN UIN - uin który właśnie skasowaliśmy 3.3 Zmiana hasła HOST = register.gadu-gadu.pl PATH = /appsvc/fmregister.asp Wysyłamy pola: fmnumber $UIN fmpwd stare haslo, plain text pwd nowe haslo, plain text email nowy email do przypominania hasła code http hash liczony z email+pwd jeśli się udało serwer odpowie: reg_success:$UIN 4. Operacje związane z przechowywaniem listy kontaktów na serwerze 4.1 Wysłanie list kont. HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmcontactsput.asp Wysyłamy pola: FmNum nasz uin Pass haslo uin'a Contacts dowolna ilość rekordów z kontaktami rozdzielone "\r\n" format pojedynczego rekordu: imie;nazwisko;pseudo;wyswietlane;telefon;grupa;uin;adres@email;0;;0; PRZYKLAD: FmNum=1000&Pass=sekret&Contacts=imie;nazwisko;pseudo;wyswietlane;+48123123123;grupa1;1000;adres*email!pl;0;;0; Jeśli się udało serwer odpowie put_success: 4.2 Pobranie listy kont. HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmcontactsget.asp Wysyłamy pola: FmNum nasz uin Pass haslo uin'a PRZYKŁAD: FmNum=1000&Pass=sekret Jeśli się udało serwer odpowie get_results:rekord_1 rekord_2 rekord_N rekord ma taki sam format jak w pkt 4.1 4.3 Usunięcie listy kont. z serwera HOST = pubdir.gadu-gadu.pl PATH = /appsvc/fmcontactsput.asp Wysyłamy pola: FmNum o wartości uin Pass haslo, plain text Delete o wartości '1' PRZYKLAD: FmNum=1000&Pass=sekret&Delete=1 Jeśli się udało serwer odpowie put_success: 5. Wysyłanie hasła na email HOST = retr.gadu-gadu.pl PATH = /appsvc/fmsendpwd.asp Wysyłamy dwa pola: userid uin code hash_http liczony z uin'a jako string Jeśli się udało serwer odpowie pwdsend_success