Ĺadny brzuch
Mam ostatnio chwilę wolnego czasu postanowiłem pobawić się protokołem gadu-gadu:
Wszystko oparłem na http://toxygen.net/libgadu/protocol/
A teraz problem: Po połączeniu się z serwerem nie zmienia mi się status - nadal jestem nieodstępny, tak jakbym się w ogóle nie połączył, ale wszystkie pakiety oryginalnego klienta jak i te które są wymienione na stronie powyżej, przychodzą.
Więc o co w tym chodzi ? ;p
#include <cstdlib> #include <iostream> #include <winsock2.h> #include <windows.h> using namespace std; #define GG_WELCOME 0x0001 struct gg_welcome { int seed; /* klucz szyfrowania hasła */ }welcome; #define GG_LOGIN60 0x0015 struct gg_login60 { int uin; /* mój numerek */ int hash; /* hash hasła */ int status; /* status na dzień dobry */ int version; /* moja wersja klienta */ char unknown1; /* 0x00 */ int local_ip; /* mój adres ip */ short local_port; /* port, na którym słucham */ int external_ip; /* zewnętrzny adres ip */ short external_port; /* zewnętrzny port */ char image_size; /* maksymalny rozmiar grafiki w KB */ char unknown2; /* 0xbe */ char description[70]; /* opis, nie musi wystąpić */ int time; /* czas, nie musi wystąpić */ }login; struct gg_header { int type; /* typ pakietu */ int length; /* długość reszty pakietu */ }header,returned; #define GG_NEW_STATUS 0x0002 struct gg_new_status { int status; /* na jaki zmienić? */ char description[]; /* opis, nie musi wystąpić */ int time; /* czas, nie musi wystąpić */ }n_status; int gg_login_hash(char *password, int seed){ unsigned int x, y, z; y = seed; for (x = 0; *password; password++) { x = (x & 0xffffff00) | *password; y ^= x; y += x; x <<= 8; y ^= x; x <<= 8; y -= x; x <<= 8; y ^= x; z = y & 0x1f; y = (y << z) | (y >> (32 - z)); } return y; } void clear(struct gg_header *header) { header->type = 0; header->length = 0; } int main(int argc, char *argv[]) { WSADATA wd; WSAStartup(0x101,&wd); int test; int sockd; struct sockaddr_in serv_name; sockd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serv_name.sin_family = AF_INET; serv_name.sin_port = ntohs(8074); //inet_aton("217.17.41.88", &serv_name.sin_addr); //inet_pton(AF_INET,"217.17.41.88", &serv_name.sin_addr); serv_name.sin_addr.s_addr = inet_addr("91.197.13.33"); printf("[+] IP converted...\n"); printf("[ ] Connecting..."); /*------laczenie------*/ if (connect(sockd, (struct sockaddr*)&serv_name, sizeof(serv_name)) >= 0) { printf("\r[+] Connected!\n"); } else { printf("\r[-] Couldn`t connect...\n"); return 0; } clear(&header); /*------odbieranie hashu------*/ if (recv(sockd, (char *)&header, sizeof(header),0) ) { printf("[+] Seed recieved!\n"); recv(sockd, (char *)&welcome, header.length,0); } else { printf("[-] Failed recieving seed.\n"); return 0; } printf("0x%x %d\n", header.type, welcome.seed); char *password = "thisisjustatest"; char descr[]="success"; char *sized="400"; printf("[=] Hashed password: [%s]\n", password); login.uin = 13098970; login.hash = gg_login_hash(password, welcome.seed); login.status = 0x0002; login.version = 0x20; login.unknown1 = 0x00; login.local_ip = 0x00; login.local_port = 1550; login.external_ip = 0x00; login.external_port = 1550; //login.image_size = *sized; //strcpy(login.image_size,sized); login.unknown2 = 0xbe; //login.description = "success"; //strcpy(login.description,descr); printf("[ ] Sending login request..."); #define GG_LOGIN_OK 0x0003 #define GG_LOGIN_FAILED 0x0009 /*------wysylanie loginu------*/ header.type=GG_LOGIN60; header.length=sizeof(login); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&login, header.length,0 ) ) { clear(&header); recv(sockd, (char*)&header, sizeof(header),0 ); printf("\r[+] Login information send - you`re logged in 0x%x!\n", header.type); } else { printf("\r[-] Failed logging...\n"); return 0; } returned.type = 0; recv(sockd, (char*)&returned, sizeof(returned) ,0); printf("0x%x\n", returned.type); #define GG_STATUS_BUSY 0x0003 #define GG_STATUS_INVISIBLE 0x0014 #define GG_STATUS_AVAIL 0x0002 /*------zmiana statusu------*/ n_status.status=GG_STATUS_BUSY; header.type=GG_NEW_STATUS; header.length=sizeof(n_status); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&n_status, header.length,0 ) ) { clear(&header); printf("\r[+] Status informacion changed \n"); } else { printf("\r[-] Status change failed...\n"); return 0; } system("PAUSE"); return EXIT_SUCCESS; }
Użytkownik destin edytował ten post 13 grudzień 2008, 23:29
musisz wysłać listę ludzi o których chcesz żeby Cię serwer informował, nawet jeśli jest pusta
Dzięki.
A dla potomnych, odpowiedz do pytanie:
#define GG_LIST_EMPTY 0x0012
header.type=GG_LIST_EMPTY;
header.length=0;
send(sockd, (char*)&header, sizeof(header),0);
Użytkownik destin edytował ten post 13 grudzień 2008, 23:59
Witam, mam problem z poniższym kodem... Może ktoś na to rzucić okiem i powiedzieć co jest nie tak?
void CgggDlg::OnBnClickedOk() { WSAData wsaData; SOCKET sock; SOCKET sockd; struct sockaddr_in sin; struct sockaddr_in serv_name; struct hostent* host; if ((WSAStartup(MAKEWORD(2, 0), &wsaData))) { CgggDlg::Pisz("ERROR! While starting WSAData."); } else{ CgggDlg::Pisz("OK! While starting WSAData."); } host = gethostbyname("appmsg.gadu-gadu.pl"); sin.sin_family = AF_INET; sin.sin_addr.s_addr = *((unsigned long*) host->h_addr); sin.sin_port = htons(80); memset(sin.sin_zero, 0, 8); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock<0) { CgggDlg::Pisz("ERROR! While starting socket."); } else{ CgggDlg::Pisz("OK! While starting socket."); } connect(sock, (struct sockaddr*)&sin, sizeof(sin)); char *zapytanie = "GET /appsvc/appmsg4.asp?fmnumber=2231046&version=7,0,0,20&lastmsg=1%20HTTP/1.0%20Accept-Language: pl%20User-Agent:Mozilla/4.0(compatible;MSIE5.0;Windows98)%20Pragma:no-cacheHost:appmsg. gadu-gadu.pl\r\n"; send(sock, zapytanie, strlen(zapytanie), 0); CgggDlg::Pisz(zapytanie); char odpowiedz[1024]; memset(odpowiedz,NULL,sizeof(odpowiedz)); recv(sock, odpowiedz, sizeof(odpowiedz), 0); CgggDlg::Pisz(odpowiedz); char cip[16], cport[5]; int port; memset(cip,NULL,sizeof(cip)); memset(cport,NULL,sizeof(cport)); do{ i++; }while (odpowiedz[i+42]!=':'); memcpy(cip,&odpowiedz[42],i); memcpy(cport,&odpowiedz[43+i],4); sockd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serv_name.sin_family = AF_INET; serv_name.sin_addr.s_addr = inet_addr(cip); port=atoi(cport); serv_name.sin_port = ntohs(port); CgggDlg::Pisz(cip); CgggDlg::Pisz(cport); if (connect(sockd, (struct sockaddr*)&sin, sizeof(sin)) >= 0) { CgggDlg::Pisz("Connected!"); } else { CgggDlg::Pisz("Couldn`t connect..."); } clear(&header); header.type=GG_LIST_EMPTY; header.length=0; send(sockd, (char*)&header, sizeof(header),0); clear(&header); if (recv(sockd, (char *)&header, sizeof(header),0) ) { CgggDlg::Pisz("Seed recieved!"); recv(sockd, (char *)&welcome, header.length,0); } else { CgggDlg::Pisz("Failed recieving seed."); } sprintf_s(buff,"%#x %d\n", header.type, welcome.seed); CgggDlg::Pisz(buff); char *password = "marchewka"; char descr[]="success"; char *sized="400"; CgggDlg::Pisz(password); login.uin = 2231046; login.hash = gg_login_hash(password, welcome.seed); login.status = 0x0002; login.version = 0x20; login.unknown1 = 0x00; login.local_ip = 0x00; login.local_port = 1550; login.external_ip = 0x00; login.external_port = 1550; //login.image_size = *sized; //strcpy(login.image_size,sized); login.unknown2 = 0xbe; //login.description = "success"; //strcpy(login.description,descr); CgggDlg::Pisz("Sending login request..."); header.type=GG_LOGIN60; header.length=sizeof(login); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&login, header.length,0 ) ) { clear(&header); recv(sockd, (char*)&header, sizeof(header),0 ); sprintf_s(buff,"Login information send - you`re logged in %#x\n", header.type); CgggDlg::Pisz(buff); } else { CgggDlg::Pisz("Failed logging..."); } returned.type = 0; recv(sockd, (char*)&returned, sizeof(returned) ,0); sprintf_s(buff,"%#x", returned.type); CgggDlg::Pisz(buff); n_status.status=0x0002; header.type=GG_NEW_STATUS; header.length=sizeof(n_status); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&n_status, header.length,0 ) ) { clear(&header); CgggDlg::Pisz("Status informacion changed"); } else { CgggDlg::Pisz("Status change failed..."); } header.type=GG_LIST_EMPTY; header.length=0; send(sockd, (char*)&header, sizeof(header),0); }
W wyniku dostaje to:
http://fotoo.pl/host...9d9d9e4/ggg.jpg
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Wszystko oparłem na http://toxygen.net/libgadu/protocol/
A teraz problem: Po połączeniu się z serwerem nie zmienia mi się status - nadal jestem nieodstępny, tak jakbym się w ogóle nie połączył, ale wszystkie pakiety oryginalnego klienta jak i te które są wymienione na stronie powyżej, przychodzą.
Więc o co w tym chodzi ? ;p
#include <cstdlib> #include <iostream> #include <winsock2.h> #include <windows.h> using namespace std; #define GG_WELCOME 0x0001 struct gg_welcome { int seed; /* klucz szyfrowania hasła */ }welcome; #define GG_LOGIN60 0x0015 struct gg_login60 { int uin; /* mój numerek */ int hash; /* hash hasła */ int status; /* status na dzień dobry */ int version; /* moja wersja klienta */ char unknown1; /* 0x00 */ int local_ip; /* mój adres ip */ short local_port; /* port, na którym słucham */ int external_ip; /* zewnętrzny adres ip */ short external_port; /* zewnętrzny port */ char image_size; /* maksymalny rozmiar grafiki w KB */ char unknown2; /* 0xbe */ char description[70]; /* opis, nie musi wystąpić */ int time; /* czas, nie musi wystąpić */ }login; struct gg_header { int type; /* typ pakietu */ int length; /* długość reszty pakietu */ }header,returned; #define GG_NEW_STATUS 0x0002 struct gg_new_status { int status; /* na jaki zmienić? */ char description[]; /* opis, nie musi wystąpić */ int time; /* czas, nie musi wystąpić */ }n_status; int gg_login_hash(char *password, int seed){ unsigned int x, y, z; y = seed; for (x = 0; *password; password++) { x = (x & 0xffffff00) | *password; y ^= x; y += x; x <<= 8; y ^= x; x <<= 8; y -= x; x <<= 8; y ^= x; z = y & 0x1f; y = (y << z) | (y >> (32 - z)); } return y; } void clear(struct gg_header *header) { header->type = 0; header->length = 0; } int main(int argc, char *argv[]) { WSADATA wd; WSAStartup(0x101,&wd); int test; int sockd; struct sockaddr_in serv_name; sockd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serv_name.sin_family = AF_INET; serv_name.sin_port = ntohs(8074); //inet_aton("217.17.41.88", &serv_name.sin_addr); //inet_pton(AF_INET,"217.17.41.88", &serv_name.sin_addr); serv_name.sin_addr.s_addr = inet_addr("91.197.13.33"); printf("[+] IP converted...\n"); printf("[ ] Connecting..."); /*------laczenie------*/ if (connect(sockd, (struct sockaddr*)&serv_name, sizeof(serv_name)) >= 0) { printf("\r[+] Connected!\n"); } else { printf("\r[-] Couldn`t connect...\n"); return 0; } clear(&header); /*------odbieranie hashu------*/ if (recv(sockd, (char *)&header, sizeof(header),0) ) { printf("[+] Seed recieved!\n"); recv(sockd, (char *)&welcome, header.length,0); } else { printf("[-] Failed recieving seed.\n"); return 0; } printf("0x%x %d\n", header.type, welcome.seed); char *password = "thisisjustatest"; char descr[]="success"; char *sized="400"; printf("[=] Hashed password: [%s]\n", password); login.uin = 13098970; login.hash = gg_login_hash(password, welcome.seed); login.status = 0x0002; login.version = 0x20; login.unknown1 = 0x00; login.local_ip = 0x00; login.local_port = 1550; login.external_ip = 0x00; login.external_port = 1550; //login.image_size = *sized; //strcpy(login.image_size,sized); login.unknown2 = 0xbe; //login.description = "success"; //strcpy(login.description,descr); printf("[ ] Sending login request..."); #define GG_LOGIN_OK 0x0003 #define GG_LOGIN_FAILED 0x0009 /*------wysylanie loginu------*/ header.type=GG_LOGIN60; header.length=sizeof(login); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&login, header.length,0 ) ) { clear(&header); recv(sockd, (char*)&header, sizeof(header),0 ); printf("\r[+] Login information send - you`re logged in 0x%x!\n", header.type); } else { printf("\r[-] Failed logging...\n"); return 0; } returned.type = 0; recv(sockd, (char*)&returned, sizeof(returned) ,0); printf("0x%x\n", returned.type); #define GG_STATUS_BUSY 0x0003 #define GG_STATUS_INVISIBLE 0x0014 #define GG_STATUS_AVAIL 0x0002 /*------zmiana statusu------*/ n_status.status=GG_STATUS_BUSY; header.type=GG_NEW_STATUS; header.length=sizeof(n_status); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&n_status, header.length,0 ) ) { clear(&header); printf("\r[+] Status informacion changed \n"); } else { printf("\r[-] Status change failed...\n"); return 0; } system("PAUSE"); return EXIT_SUCCESS; }
Użytkownik destin edytował ten post 13 grudzień 2008, 23:29
musisz wysłać listę ludzi o których chcesz żeby Cię serwer informował, nawet jeśli jest pusta
Dzięki.
A dla potomnych, odpowiedz do pytanie:
#define GG_LIST_EMPTY 0x0012
header.type=GG_LIST_EMPTY;
header.length=0;
send(sockd, (char*)&header, sizeof(header),0);
Użytkownik destin edytował ten post 13 grudzień 2008, 23:59
Witam, mam problem z poniższym kodem... Może ktoś na to rzucić okiem i powiedzieć co jest nie tak?
void CgggDlg::OnBnClickedOk() { WSAData wsaData; SOCKET sock; SOCKET sockd; struct sockaddr_in sin; struct sockaddr_in serv_name; struct hostent* host; if ((WSAStartup(MAKEWORD(2, 0), &wsaData))) { CgggDlg::Pisz("ERROR! While starting WSAData."); } else{ CgggDlg::Pisz("OK! While starting WSAData."); } host = gethostbyname("appmsg.gadu-gadu.pl"); sin.sin_family = AF_INET; sin.sin_addr.s_addr = *((unsigned long*) host->h_addr); sin.sin_port = htons(80); memset(sin.sin_zero, 0, 8); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock<0) { CgggDlg::Pisz("ERROR! While starting socket."); } else{ CgggDlg::Pisz("OK! While starting socket."); } connect(sock, (struct sockaddr*)&sin, sizeof(sin)); char *zapytanie = "GET /appsvc/appmsg4.asp?fmnumber=2231046&version=7,0,0,20&lastmsg=1%20HTTP/1.0%20Accept-Language: pl%20User-Agent:Mozilla/4.0(compatible;MSIE5.0;Windows98)%20Pragma:no-cacheHost:appmsg. gadu-gadu.pl\r\n"; send(sock, zapytanie, strlen(zapytanie), 0); CgggDlg::Pisz(zapytanie); char odpowiedz[1024]; memset(odpowiedz,NULL,sizeof(odpowiedz)); recv(sock, odpowiedz, sizeof(odpowiedz), 0); CgggDlg::Pisz(odpowiedz); char cip[16], cport[5]; int port; memset(cip,NULL,sizeof(cip)); memset(cport,NULL,sizeof(cport)); do{ i++; }while (odpowiedz[i+42]!=':'); memcpy(cip,&odpowiedz[42],i); memcpy(cport,&odpowiedz[43+i],4); sockd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); serv_name.sin_family = AF_INET; serv_name.sin_addr.s_addr = inet_addr(cip); port=atoi(cport); serv_name.sin_port = ntohs(port); CgggDlg::Pisz(cip); CgggDlg::Pisz(cport); if (connect(sockd, (struct sockaddr*)&sin, sizeof(sin)) >= 0) { CgggDlg::Pisz("Connected!"); } else { CgggDlg::Pisz("Couldn`t connect..."); } clear(&header); header.type=GG_LIST_EMPTY; header.length=0; send(sockd, (char*)&header, sizeof(header),0); clear(&header); if (recv(sockd, (char *)&header, sizeof(header),0) ) { CgggDlg::Pisz("Seed recieved!"); recv(sockd, (char *)&welcome, header.length,0); } else { CgggDlg::Pisz("Failed recieving seed."); } sprintf_s(buff,"%#x %d\n", header.type, welcome.seed); CgggDlg::Pisz(buff); char *password = "marchewka"; char descr[]="success"; char *sized="400"; CgggDlg::Pisz(password); login.uin = 2231046; login.hash = gg_login_hash(password, welcome.seed); login.status = 0x0002; login.version = 0x20; login.unknown1 = 0x00; login.local_ip = 0x00; login.local_port = 1550; login.external_ip = 0x00; login.external_port = 1550; //login.image_size = *sized; //strcpy(login.image_size,sized); login.unknown2 = 0xbe; //login.description = "success"; //strcpy(login.description,descr); CgggDlg::Pisz("Sending login request..."); header.type=GG_LOGIN60; header.length=sizeof(login); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&login, header.length,0 ) ) { clear(&header); recv(sockd, (char*)&header, sizeof(header),0 ); sprintf_s(buff,"Login information send - you`re logged in %#x\n", header.type); CgggDlg::Pisz(buff); } else { CgggDlg::Pisz("Failed logging..."); } returned.type = 0; recv(sockd, (char*)&returned, sizeof(returned) ,0); sprintf_s(buff,"%#x", returned.type); CgggDlg::Pisz(buff); n_status.status=0x0002; header.type=GG_NEW_STATUS; header.length=sizeof(n_status); send(sockd, (char*)&header, sizeof(header),0); if (send(sockd, (char*)&n_status, header.length,0 ) ) { clear(&header); CgggDlg::Pisz("Status informacion changed"); } else { CgggDlg::Pisz("Status change failed..."); } header.type=GG_LIST_EMPTY; header.length=0; send(sockd, (char*)&header, sizeof(header),0); }
W wyniku dostaje to:
http://fotoo.pl/host...9d9d9e4/ggg.jpg