Post
#1
|
|
|
Grupa: Przyjaciele php.pl Postów: 2 335 Pomógł: 6 Dołączył: 7.03.2002 Ostrzeżenie: (0%)
|
Nie wiem czy napisanie bramki Gadu-Gadu to znowuz taki trudny orzech do zgryzienia ale pomyslalem sobie, ze podziele sie moim doswiadczeniami w pisaniu tego skryptu. Skrypt bedzie nam sluzyl TYLKO do wysylania wiadomosci do uzytkownikow GG.
Protokol GG oparty jest na TCP/IP co ulatwia nam prace. Aby polaczyc sie z serwerem GG nalezy uzyc funkcji fsockopen() Kod $fp = fsockopen( "appmsg.gadu-gadu.pl", 80, $errno, $errmsg, 3 );
pierwsza wartosc to nazwa hosta GG. Nastepna to nr. portu, kolejne dwie to stringi z bledami jezeli takowe sie pojawia, a ostatnia to liczba w sekundach timeoutu (opis funkcji fsocopen() znajduje sie tu). Teraz musimy podszyc sie pod przegladarke i wyslac odpowiednie dane protokolem HTTP. Kod $get = "GET /appsvc/appmsg.asp?fmnumber=$UIN&version=$VERSION&fmt=$FORMAT&lastmsg=$MSG HTTP/1.0rn";
$get .= "Host: appmsg.gadu-gadu.plrn"; $get .= "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)rn"; $get .= "Pragma: no-cachern"; fputs($fp, $get); $UIN - numer clienta $VERSION - wersja clienta $FORMAT - jest to wartosc oznaczajaca czy wiadomosc systemowa bedzie przesylana czystym textem ($FORMAT='') czy w HTMLu ($FORMAT != '') ja osobiscie nie uzywam formatu HTML i nie wiem jak go uzywac, wiec nie bede sie tym zagadnieniem zajmowal. $MSG - numer ostatniej wiadomosci systemowej (zostawiamy pusta wartosc) Serwer odpowie na to: Cytat HTTP/1.0 200 OK
... 0 217.17.41.84:8074 217.17.41.84 ostatni wiersz w kodzie pobieramy funkcja fgets() Kod $buf = fgets( $fp, 128 );
Uprzednio pomijajac pozostale linie. Wiersz ten mowi nam o tym czy zawarta jest wiadomosc systemowa (0), nr. hosta wraz z portem pod jaki musimy sie podlaczyc, a ostatnia wartosc to sam IP hosta. Nas interesuje tylko IP hosta wraz z portem. Przyczym port 8074 nie jest jedynym do ktorego mozna sie podlaczyc. Wrazie bledu przy podlaczaniu sie do hosta mozna skorzystac z portu 443. Teraz musimy wydobyc IP i port ze stringu. Nie bede tu podawal metody bo chyba kazdy wie jak to zrobic a sposobow jest wiele poczawszy od substr() ((IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) ), explode() itp... Przed lub po wydobyciu IP i portu mozemy (NIE MUSIMY) zamknac socket: Kod fclose($fp);
Teraz czas przyszedl na polaczenie sie z wlasciwym hostem umozliwiajacym nam wkoncu komunikacje w GG. Kod $fp = fsockopen( "217.17.41.85", 8074, $errno, $errmsg, 3 );
IP i port podalem w tej postaci, zeby zobrazowac jak to ma wygladac (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) dodam jeszcze, czego nie powiedzialem wczesniej, ze po kazdym polaczeniu funkcja fsocopen() nalezy dodac kod zbezpieczajacy - obslugujacy blad wrazie gdyby nie mozna bylo sie polaczyc: Kod if( !$fp ){
echo "blad"; }else{ ... dalsza czesc skryptu ... Polaczywszy sie do hosta otrzymamy pakiet postaci: Cytat unsigned long typ
unsigned long rozmiar unsigned long klucz typ i rozmia nie bedzie nam potrzebny wiec pomijam jego opis. Bedzie nam natomiast potrzebny klucz do stworzenia hasha hasla i przeslania go do hosta GG. Do pobrania pakietu przeslanego od hosta po polaczeniu z nim uzyjemy funkcji unpack() Kod $data = fread($fp, 12);
if(!$data){ echo "error"; }else{ $hash_pack = unpack("Vtyp/Vrozmiar/Vklucz", $data); ... Zmienna $hash_pack jest zmienna tablicowa, a jako, ze interesuje nas tylko klucz pobieramy z niej jego wartosc w nastepujacy sposob: Kod $key = $hash_pack['klucz'];
W opisie protokolu GG z ktorego korzystalem byl bledny algorytm uzywany do stworzenia hasha hasla, tak wiec po zmudnych poszukiwaniach natknalem sie na ten oto skrypt autorstwa Piotr Pawłowa: Kod function oblicz_hash_hasla($haslo, $klucz) {
$temphi = 0; $templo = 1; for ($i = 0; $i < strlen($haslo); $i++) { $znak = ord($haslo[$i]); $templo *= $znak + 1; $temphi = ($temphi * ($znak + 1) + ($templo >> 16)) & 0xffff; $templo &= 0xffff; } $hashlo = $templo * ($klucz & 0x7fff); $hashhi = (($temphi * ($klucz & 0x7fff)) & 0xffff) + ($hashlo >> 16); $hashlo &= 0xffff; if ($klucz & 0x8000) { $hashlo += ($templo & 1) << 15; $hashhi += (($temphi & 1) << 15) + ($templo >> 1) + ($hashlo >> 16); $hashlo &= 0xffff; } $hashhi &= 0xffff; $hash = sprintf("%04x%04x", $hashhi, $hashlo); $hash = hexdec($hash); settype($hash, 'integer'); return $hash; } Do funkcji przesylamy haslo naszego konta bramki i klucz uzyskany wczesniej od hosta GG. Teraz musimy wyslac pakiet do hosta: Kod fwrite($fp, pack("VVVVVVVv", 0x000c, 0x16, $gg_gate_uid, $hash, 0x0002, 0x0b, 0, 0));
$gg_gate_uid - nrume konta bramki $hash - otrymany hash z funkcji oblicz_hash_hasla() Teraz host zwroci nam odpowiedz na probe zalogowania w postaci Cytat unsigned long status_loginu
unsigned long rozmiar Pobieramy go nastepujaco: Kod if( !$data = fread($fp, 8) ){
echo "error"; }else{ ... dalsza czesc kodu ... $data to interesujacy nas pakiet. Teraz uzywajac funkcji unpack() pobieramy jego wartosc status_loginu Kod $pack = unpack("Vstatus_loginu/Vrozmiar", $data);
$status = $pack['status_loginu']; Wartosci statusu mozemy zdefiniowac nastepujaco: Kod define("GG_LOGIN_OK", 0x0003);
define("GG_LOGIN_FAILED", 0x0009); Nazwy mowia same za siebie (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Teraz jezeli zostalismy zalogowani(GG_LOGIN_OK) mozemy wyslac wiadomosc do uzytkownika GG. Struktura pakietu z wiadomoscia do uzytkownika wyglada nastepujaco: Cytat unsigned long GG_SEND_MG
unsigned long rozmiar unsigned long uid_odbiorcy unsigned long seq unsigned long classa_wiadomosci unknown unknow - niestety nie wiem co oznacza ta wartosc ale ustawiajac ja na 0(zero) mozna ja pominac w opisie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) GG_SEND_MSG ma wartosc: Kod define("GG_SEND_MSG", 0x000b);
rozmiar to dlugosc naszej wiadomosci. Uwaga wiadomosc nie moze byc wieksza niz 2000 znakow. seq - numer sekwencji jest wykorzystywany przy potwierdzaniu dostarczenia lub zakolejkowaniu pakietu. classa_wiadomosci - rodzaj wiadomosci, jeden z ponizszych: Kod define("GG_CLASS_QUEUED", 0x0001);
define("GG_CLASS_MSG", 0x0004); // wiadomosc w nowym oknie define("GG_CLASS_CHAT", 0x0008); // wiadomosc jest czescia rozmowy define("GG_CLASS_CTCP", 0x0010); define("GG_CLASS_ACK", 0x0020);// bez potwierdzania wiadomosci Kod wysylajacy pakiet jest nastepujacy: Kod mt_srand((double)microtime() * 1000000);
$seq = mt_rand(); $uin_odbiorcy = 'xxxx...'; // numer gg odbiorcy $msg = ''; // wiadomosc do odbiorcy <= 2000 znakow $data = pack("VVVVVa".strlen($msg)."C", GG_SEND_MSG, 0x0d + strlen($msg), $uin_odbiorcy, $seq, GG_CLASS_ACK, $msg, 0); fwrite($fp, $data); $msg - to oczywiscie wiadomosc dla odbiorcy $uid_odbiorcy - nr gg odbiorcy I oto wyslalismy wiadomosc do GG 8) Na koniec pozostalo nam jeszcze wylogowanie sie: Kod define("GG_STATUS_NOT_AVAIL",0x0001);
define("GG_STATUS_AVAIL", 0x0002); fwrite($fp, pack('VVV', GG_NEW_STATUS, 0x04, GG_STATUS_NOT_AVAIL);); fclose($fp); Tak oto wyglada wysylanie wiadomosci do uzytkownikow GG. Z przykroscia musze powiedziec, ze strona z opisem protokolu GG ostatnio nie dziala ale jezeli sa to tylko chwilowe problemy warto na nia zajzec: www.dev.null.pl/ekg/docs/protocol.html Opisany tu kod wymaga oczywiscie kilku zabiegow min. napisanie obslugi bledow, rozpisania wszystkiego na poszczegolne funkcje ew. napisania classy itp. Tak wiec jest to zarys skryptu bramki GG. Skrypt moze nie dzialac prawidlowo bo gdzies sie moglem rabnac (jestem tylko czlowiekem (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ), wiec zadawajcie pytania na forum. PROSZE NIE PISAC ABYM PODAL CALY SKRYPT BRAMKI GDYZ WSZYSTKO ZOSTALO JUZ NAPISANE (TO CO MIALO BYC NAPISANE (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) ), WIEC NALEZY TYLKO WYTEZYC SZARE KOMORKI I WZIASC SIE DO PRACY (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 6.03.2003 Ostrzeżenie: (0%)
|
Dobra pokój, możemy normalnie pogadać.
> Cytat A dlaczego niby konstrukcje packa mialy by byc inne ?
> Chyba korzystales z tego samego opisu protokolu co ja ? tak, napisalem to w październiku 2001... od tego czasu wyszło pare aktualizacji, zrobienie każdej nowe wersji zajeło mi 1 dzień > Chcesz czy nie chcesz wierzyc ale kod napisalem sam korzystajac z > protokolu gg opisanego na podanej przezmnie stronce + troche wlasnej W tym protokole też mam pewien udział. dziwi mnie skąd wziałeś akurat wersje 0x0b klienta do której pasuje ten hash obecnie w opisie protokolu jest nowy pasujacy do wersji >0x14 dziwnym zbiegiem www2gg 1.4 (na której jak wczesniej podejrzewałem bazował ten skrypt) używa też 0x0b, do tego te konstrukcje $host = '217.17.41.'.rand( 86, 89 ); tez podobne , 3 proby logowania..., ale niech bedzie wykazujac dobra wole jestem w stanie uwierzyc w zbieg okolicznosci. > inwencji. Co do hashowania hasla to jest on taki sam gdyz owy kolega > podeslal mi jego kod po tym jak zapytalem sie czy nie wie jak to > rozgryzc. Przyczym jeszcze dodam, ze nie jest wykluczone, a nawet jest > pewne, ze wyciagnal on ze skryptu z www2gg. Ale pwoedz mi jedno... > po co niby mial bym umieszczac autora tej funkcji gdybym zerznal > toczka w toczka kod z www2gg ? Przeciez kazdy odrazu by sie kapnal. ok, dziwie sie jeszcze, że nie znales tego skryptu wczesniej, google zwraca 1500 trafien na www2gg, jest w downlodach paru stron o php. Ze nawet kolega podsyłając hash nie powiedział skąd jest. > Jeszcze jedno, ten skrypt na www2gg ma jakis blad, ktory nie wysyla > wiadomosci jezeli uzytkownik nie jest dostepny lub zaraz wracam. Czy > wiec przepisanie calego kodu i ew zmienienie jego fragmentow nie > wiazalo by sie z powieleniem owego bledu ? Ten "blad" nie dotyczy skryptu a praktycznie kazdego klienta gadu gadu wysylajac w trybie offline a wiec i invisible wiadomosc zawierajaca linki lub adresy www i email zostanie ona odfiltorowana przez serwer gg jako spam (co jest bardzo glupie z ich strony ale coż) skrypt w wersji 2.0 radzi sobie z tym podmieniajac te wyrazenia na inne i unika odfiltorowania ( w wersji 1.4 tez to robil ale filtry ulegly zmianie stad zauwazone przez Ciebie niedziałanie w trybie offline i invisible) Twoja wersja jesli nie podmienia tych wyrazen w textach tez musi sie charakteryzowac podobna wlasciwoscia. Jest to zwiazane rozniez z trzymanien na liscie kontaktow numeru bramki wiec czasami trudno dojsc przyczyn. > Misiek... rozumiem, ze moze sie wydac, ze skoro juz ktos udostepnia > kod to wiekszosc chca go zerznac i podpisac sie pod nim ale bynajmniej > nie kazdy ma tego typu aspiracje. Niestety juz ktos tak kiedys zrobil, chyba jakis velo ze scrypty.com lub scryty.net (juz nie pamietam www) po prostu umiescil w downloadzie moj skrypt podpisujac sie wszedzie swoim nickiem , ale po mojej reakcji szybko to usunal. > Zabaloalo mnie tylko jedno... to, ze po kilku nocach spedzonych nad > pisaniem tego kodu ktos uwaza mnie za zlodzieja. Złożyło sie na to zbyt wiele jak sie okazuje zbiegów okolicznosci i nie wspomnienia o www2gg w pierwszym poscie, nie uważam Cie za złodzieja i proponuje pokój:) |
|
|
|
Seth Bramka Gadu-Gadu 27.10.2002, 16:55:17
em1X eh a na http://gg.wha.la sa pelne zrodla 30.01.2003, 00:03:33
Seth ehh ta bramka nie dziala dobrze... jezeli masz sta... 30.01.2003, 01:59:58
kwiateek Cytatehh ta bramka nie dziala dobrze... jezeli mas... 30.01.2003, 12:18:49
Seth tak 31.01.2003, 21:20:35
pm bramka www2gg 6.03.2003, 15:38:43
It's_me Jedno pytanie jak mozna skopiowac kod php ?
co otw... 6.03.2003, 16:09:46
pm http://gg.wha.la/jak.html 6.03.2003, 16:29:25
It's_me pm: wlasnie tak ... argumenty sa podstawa zarzutow... 6.03.2003, 16:41:35
Seth nie kopjowaem zadnego kodu, funkcje do hashowania ... 6.03.2003, 18:12:52
pm acha... 6.03.2003, 19:17:38
Seth A dlaczego niby konstrukcje packa mialy by byc inn... 6.03.2003, 19:30:15
Seth Pokoj przyjety
Wiec na wstepie chce powiem, ze d... 6.03.2003, 22:04:56
5z474n dobra spece .... bramka zawsze cos ale sa lepsze r... 4.05.2003, 22:27:39
Seth Ad.1
:arrow: Zalogowanie do servera: 0.2131559848... 5.05.2003, 17:05:58
5z474n wieeelkie dzieki ... oczywiscie ze na tej strone i... 5.05.2003, 18:20:46
5z474n gdzie jest zdefiniowany nr i haslo bramki
chce z... 9.05.2003, 01:02:00
Seth Cytat function gg_gate( $to='', $msg='', $fro... 9.05.2003, 12:57:52
5z474n hm.. troche inaczej to pzrerobilem ale cos skopale... 9.05.2003, 14:04:23
Seth Zrob tak jak Ci podalem powinno byc wszystko OK. J... 9.05.2003, 14:09:54
5z474n nie moge :|
<?php
for( $i = 3; $i >=... 9.05.2003, 14:31:15
Seth Tam gdzie masz:
function logon( &$fp, $uin, $pass,... 9.05.2003, 14:36:41
5z474n no :!: teraz sie zgadza :mrgreen:
niestety musze... 9.05.2003, 15:15:24
Seth Wszystko ladnie pkienie ale ktos tu nie przestrzeg... 9.05.2003, 22:48:09
5z474n luzz... dobrze wysyla ze znnych kont :mrgreen:
n... 10.05.2003, 00:48:27
Seth system_msg( $mode )
to funkcja odczytajaca uprzedn... 10.05.2003, 10:41:02
Solitary a co z pingiem? 25.10.2003, 23:23:45
Seth Solitary: w tym skrypcie nie ma przewidzianych zad... 1.11.2003, 18:31:55
kubatron dzięki Seth 1.11.2003, 19:50:06
spyx Seth: nie zabardzo rozumiem skad moge wziasc key z... 3.11.2003, 15:19:18
Seth W samej klasie do obslugi gg jest taka linia:
...
... 3.11.2003, 16:28:34
GrayHat moze ktos zrobic pelny listing tego skryptu bo sie... 3.11.2003, 17:57:42
Seth To nie jest temat opisujacy jak zainstalowac skryp... 3.11.2003, 18:08:46
kubatron jakbyś wrócił się o jedną strone w stecz to byś zo... 3.11.2003, 18:36:45
macnow a ja bym chciał zrobić wysyłanie seryjne, zeby np.... 17.11.2003, 16:54:33
Seth A ja aby moja pralka prasowala mi ubrania i zarabi... 17.11.2003, 17:47:31
Bakus Seth - masz jak zwykle cudowne pomysły...
Jak napi... 18.11.2003, 00:49:12
AZAZELLO A ja mam odnośnie tych waszych bramek:)
chyba nik... 24.11.2003, 09:38:10
GrayHat hmm a jaka funkcja wywolujemy wyslanie wiadomosci?... 24.11.2003, 17:55:37
BzikOS Cytathmm a jaka funkcja wywolujemy wyslanie wiadom... 24.11.2003, 18:27:38
Cr0n!x a ja mam cos takiego i nie wysyla :/
KodDEBUG... 30.11.2003, 17:37:49
anAKiN` http://anakin.scene.pl/www2gg/
jak ktos chce zrodl... 29.02.2004, 17:46:45
pm Ja poprosze:) 5.04.2004, 20:28:25
Chewolf Witajcie,
Jest to bardzo ważna sprawa. Wi... 9.04.2004, 16:39:02
pm >Witajcie,
>Jest to bardzo ważna sprawa. Wię... 9.04.2004, 17:29:33
rubin Login Failed 20.04.2004, 23:46:26
Xinn Uwaga! Obecnie Gadu-Gadu działa tylko z najnowszą ... 21.04.2004, 15:18:22
pm Jest nowa wersja na http://gg.wha.la/jak.html .
... 22.04.2004, 22:46:36
Bakus wielkie podziękowania i pokłony wdzięczności... wr... 23.04.2004, 17:32:30
mls W wersji 2.0.1 był też błąd w pakiecie GG_LOGIN.
... 24.04.2004, 22:12:06
mls Hyhy, ale to już zostało poprawione, jak widzę 24.04.2004, 22:13:46
pm > Dopiero gdy wprowadziłem te modyfikacje, wszy... 24.04.2004, 22:40:40
mls Wiem, że nie błąd, ale gdy ściągałem wersję 2.0.1,... 26.04.2004, 13:00:50
Wave Wie ktoś jak zrobić coś takiego jak na tej aukcji:... 30.08.2005, 17:55:24
Speedy Cytat(Wave @ 2005-08-30 17:55:24)Wie ktoś jak... 30.08.2005, 18:36:52
Wave Skrypt działał, sam testowałem na kilku kontach. P... 30.08.2005, 18:41:33
camelx A nie wiecie może jak zrobić coś takiego jak jest ... 22.09.2005, 14:43:25
hwao tu php nie polecam, aczkolwiek da sie to w nim zro... 22.09.2005, 19:05:53
vala http://dev.null.pl/ekg/docs/protocol.html
? 22.09.2005, 19:27:07
camelx tak jak napisał hwao znalazłem sobie bota (GGBot, ... 25.09.2005, 18:38:41
bivv Jak zrobić aby można było wysłać wiadomość do kilk... 14.03.2006, 17:56:29
matid Cytat(bivv @ 2006-03-14 17:56:29)Jak zrobić a... 15.03.2006, 07:00:40
hwao Cytat(matid @ 2006-03-15 07:00:40)Cytat(bivv ... 15.03.2006, 07:09:44
ripek Witam,
gdzie mogę znaleźć działającą bramke www2g... 5.01.2007, 22:52:12
Speedy CytatPróbował ktoś się zmierzyć z tematem bramki w... 6.01.2007, 01:18:24
ripek Ponawiam pytanie o www2gg 6.01.2007, 10:25:55
Robuscracker Nurtuje mnie jedna rzecz:
Cytat(Seth @ 27.10.... 11.03.2007, 16:13:31
Kicok Najprawdopodobniej jest to długość pakietu 14.03.2007, 16:33:38 ![]() ![]() |
|
Aktualny czas: 4.12.2025 - 12:17 |