Wyłączenie filtru antyspimowego GG

tech • 909 słów • 5 minut czytania

Jakiś czas temu spółka GG Network S.A. wprowadziła filtr antyspimowy w swoim komunikatorze. Jego działanie oraz sama wiadomość o wprowadzeniu takiego zabezpieczenia odbiła się szerokim echem po całej sieci. Wielu użytkowników dopadło wielkie niezadowolenie po wprowadzeniu tego zabezpieczenia, a ich frustracja i gorycz zalała sieć. W dużej mierze przez “dziwną” politykę firmy oraz mechanizm działania filtru i pewne jego niedoskonałości w początkowej fazie.

Działanie tego mechanizmu jest bardzo proste. Jeśli wiadomość od osoby nieznajomej zawiera link to zamiast pełnej wiadomości otrzymamy odpowiednią notyfikację:

UWAGA: W trosce o bezpieczeństwo, w wiadomości od Nieznajomych 
podejrzane treści zastąpiono ciągiem "[xxxxx]". Jeśli chcesz otrzymywać 
od Nieznajomego kompletne wiadomości - dodaj go do swoich kontaktów.

Treść wiadomości:
[xxxxx]

Może nie wszyscy wiedzą i zdają sobie sprawę z tego, że filtr ten można w prosty sposób wyłączyć. Nie chodzi tutaj o dodanie nieznajomego do listy kontaktów, ale o całkowite wyłączenie tej funkcjonalności. Dokonać tego można (jedynie) w oryginalnym kliencie Gadu-Gadu 8. Służy do tego ostatni checkbox (Pokazuj linki od nieznajomych) na pierwszej zakładce (Komunikator) okna ustawień programu.

Filtr antyspamowy działa na serwerach Gadu-Gadu przez co wszystkie programy korzystające z protokołu GG domyślnie pozwalają na filtrację wiadomości w każdej sesji z serwerem. Skoro filtr działa na serwerze i można go wyłączyć w oryginalnym kliencie Gadu-Gadu to da się to zrobić w każdej innej aplikacji. Wystarczy tylko poznać mechanizm powiadamiania serwera o przepuszczaniu wszystkich wiadomości do odbiorcy bez jakiejkolwiek ingerencji na serwerze.

Co mnie skłoniło do zaprzęgania sobie głowy jakimś tam filtrem GG? Wszystko zaczęło się przez temat na forum WTW, dotyczący nieszczęsnego filtru, a dokładnie to informacja, że można to wyłączyć w oryginalnym kliencie i nie dowierzanie niektórych użytkowników. Nie udało mi się znaleźć nic na ten temat w dokumentacji protokołu, więc pomyślałem, że sam to sprawdzę, podzielę się analizami i udowodnię innym, że jednak można ;)

W końcu taka informacja nie tylko mi się przyda (w przyszłości), ale także pozwoli uzupełnić opis protokołu. Odpaliłem więc sniffera i zacząłem się bawić oryginalnym klientem i opcjami komunikatora, zbierając i analizując generowany przeze mnie ruch sieciowy z/do aplikacji.

Reakcją na włączenie interesującej nas funkcji, czyli wyłączenia filtru, jest wysłanie do serwera poniższego pakietu:

0x0000   00 30 4F 3F 45 0C 00 0E-A6 CE 35 A2 08 00 45 00   .0O?E...¦Î5˘..E.
0x0010   00 72 A6 35 40 00 80 06-29 C4 C0 A8 00 FC 5B C5   .r¦5@.€.)ÄŔ¨.ü[Ĺ
0x0020   0D 23 10 C3 1F 8A 87 C2-F3 D6 48 8C 06 88 50 18   .#.Ă.Š‡ÂóÖHŚ.ˆP.
0x0030   BC C0 A8 E2 00 00 38 00-00 00 42 00 00 00 04 40   ĽŔ¨â..8...B....@
0x0040   00 00 01 00 80 00 36 00-00 00 68 74 74 70 3A 2F   ....€.6...http:/
0x0050   2F 77 77 77 2E 67 61 64-75 2D 67 61 64 75 2E 70   /www.gadu-gadu.p
0x0060   6C 2F 70 6F 62 69 65 72-7A 20 0A 57 69 64 7A 69   l/pobierz .Widzi
0x0070   61 C5 82 65 C5 9B 20 4E-6F 77 65 20 47 47 3F 20   ałeś Nowe GG? 

Podobnie w przeciwnym przypadku, wyłączenia pokazywania, czyli włączenia filtru na serwerze:

0x0000   00 30 4F 3F 45 0C 00 0E-A6 CE 35 A2 08 00 45 00   .0O?E...¦Î5˘..E.
0x0010   00 72 A6 53 40 00 80 06-29 A6 C0 A8 00 FC 5B C5   .r¦S@.€.)¦Ŕ¨.ü[Ĺ
0x0020   0D 23 10 C3 1F 8A 87 C2-F4 20 48 8C 06 88 50 18   .#.Ă.Š‡Âô HŚ.ˆP.
0x0030   BC C0 28 99 00 00 38 00-00 00 42 00 00 00 04 40   ĽŔ(™..8...B....@
0x0040   00 00 01 00 00 00 36 00-00 00 68 74 74 70 3A 2F   ......6...http:/
0x0050   2F 77 77 77 2E 67 61 64-75 2D 67 61 64 75 2E 70   /www.gadu-gadu.p
0x0060   6C 2F 70 6F 62 69 65 72-7A 20 0A 57 69 64 7A 69   l/pobierz .Widzi
0x0070   61 C5 82 65 C5 9B 20 4E-6F 77 65 20 47 47 3F 20   ałeś Nowe GG? 

W celu łatwiejszego odróżnienia poszczególnych części pakietu, wyszarzano nagłówki ramki ethernetowej, protokołu TCP oraz IP, bo informacje te dla nas nie są zbyt istotne. Kolorem ciemno-czerwonym zaznaczono pierwsze 8 bajtów pakietu protokołu GG - nagłówek, a pozostała cześć to dane pakietu.

Zgodnie z opisem protokołu, pierwsze 4 bajty nagłówka określają typ pakietu, czyli identyfikujemy nasz pakiet jako informacja o zmianie naszego statusu - 0x0038 przez co cały pakiet możemy odwzorować jako poniższą strukturę języka C:

struct gg_new_status80 {
	int status;             /* na jaki zmienić? */
	int flags;              /* flagi (nieznane przeznaczenie) */
	int description_size;   /* rozmiar opisu */
	char description[];     /* opis (nie musi wystąpić, bez \0) */
};

Porównując dokładnie oba pakiety bajt po bajcie możemy wywnioskować, że zmianie ustawień programu odpowiada zmiana 15-tego bajtu pakietu. Zgodnie ze strukturą pakietu statusu, bajt ten jest częścią liczby 32-bitowej odpowiedzialnej za flagi, czyli dodatkowe właściwości/opcje statusu - kolor ciemno-zielony na dumpie pakietu.

W opisie protokołu pole flags opisane jest jako nieznane przeznaczenie, więc udało nam się odkryć jedną z możliwości tego pola. Wartość 0x0080000 wyłącza filtr antyspimowy, a 0x00000001 nadal pozostaje nieznane, aczkolwiek, chyba zawsze ustawiony jest ten bit w wersji 8 klienta Gadu-Gadu.

[dodano 16:00]

A jednak w opisie protokołu jest wzmianka o wartości 0x0080000, ale tylko dla pola flags pakietu logowania. Z szybkiej analizy wnioskuję, że zawiera te same wartości co pakiet ustawiania statusu. Zatem możemy także już podczas logowania określić, czy chcemy cenzurowane linki, ale aby podtrzymać ten stan cenzora to przy każdej zmianie statusu należy ustawiać żądaną wartość maski bitowej. W przeciwnym razie ustawienie statusu “nadpisze” opcje dla filtru wysłane podczas logowania.

Komentarze (3)

Nowaker
20090830-223012-nowaker

Niedawno przeniosłem się na Linuksa i nie przeniosłem sobie kontaktów - myślałem, że to Pidgin ma taką funkcję antyspamową. ;-)

Malcom
20090901-104232-malcom

Jeszcze nie, chcę ustalić jeszcze kilka rzeczy związanych z flags, ale brak czasu trochę mi to utrudnia ;)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/