gg_login80* login = new gg_login80;
login->header.type = GG_LOGIN80;
login->header.length = sizeof(gg_login80) - sizeof(gg_header);
login->uin = ggNumber;
login->language = "pl";
login->hash_type = GG_LOGIN_HASH_GG32;
login->hash = gg_login_hash(ggPassword, GGwelcome.seed);
login->status = GG_STATUS_AVAIL;
login->flags = 0;
login->features = 0x00000007;
login->local_ip = 0;
login->local_port = 0;
login->external_ip = 0;
login->external_port = 0;
login->image_size = 255;
login->unknown2 = 0x64;
login->version = "Gadu-Gadu Client build 8.0.0.7669";
login->version_len = sizeof(login->version);
login->description_size = 0;
login->description;
iResult = send(realSocket, (char*)&login, sizeof(login), 0);
Wzoruje sie na tym kodzie:
vector<char> buf(sizeof(gg_login80) + opis.size());
gg_login80 *gg8 = (gg_login80*)&buf[0];
Wzorowałem się na tamtym kodzie bo jest dla mnie bardziej zrozumiały a autor pisze ze zalogował się.
poczytałem trochę o tej funkcji.
jak się domyślam w vectorze buf przetrzymywany będzie rozmiar struktury gg_login80.
Dlaczego składasz do char zamiast do int skoro wielkość do serwera należy wysłać właśnie w takiej zmiennej?
do czego on służy ?
gg_login80 *gg8 = (gg_login80*)&buf.front();
Nie, w buf przechowywana będzie cała struktura gg_login80 i opis (gg_login80::description).
vector<char> buf(sizeof(gg_login80) + opis.size());
//Logowanie
string opis = "Aktywny";
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));
gg_login80 *logowanie = (gg_login80*)&buf[0];
char haslo[] = "`mko000";
int hasz = gg_login_hash((unsigned char*)haslo,(unsigned int)seed.seed);
Memo1->Lines->Add("Hasz:");
Memo1->Lines->Add(hasz);
logowanie->uin = 18199693;
memcpy(logowanie->language,"pl",2);
logowanie->hash_type = 0x01;
memset(logowanie->hash, 0, 64);
memcpy((void*)logowanie->hash,(void *)&hasz,sizeof(int));
logowanie->status = 0x0003;
logowanie->flags = 0x00000001;
logowanie->features = 0x00000007;
logowanie->local_ip = 0;
logowanie->local_port = 0;
logowanie->external_ip = 0;
logowanie->external_port = 0;
logowanie->image_size = 255;
logowanie->unknown2 = 0x64;
logowanie->version_len = 0x21;
memcpy(logowanie->version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie->description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie->description);
pakiet.type = GG_LOGIN80;
pakiet.length = sizeof(buf);
ClientSocket1->Socket->SendBuf(logowanie,sizeof(buf)) ;
Przecież w przykładzie który podałeś buf ma w nawiasie rozmiar struktury logowania i opisu a nie całą strukturę. Mylę się?
- Kod: Zaznacz cały
pakiet.length = sizeof(buf);
- Kod: Zaznacz cały
vector<char> buf(... + sizeof(gg_header));
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));
gg_header* gghdr = (gg_header*)&buf[0];
gg_login80* logowanie = (gg_login80*)(gghdr + 1);
gghdr.type = GG_LOGIN80;
gghdr.length = sizeof(gg_login80) + opis.size();
...
ClientSocket1->Socket->SendBuf(&buf[0],buf.size());
Memo1->Lines->Clear();
gg_welcome seed;
gg_header pakiet;
gg_recv_msg80 odbior;
////////////////////////////////////////////////////////////////////////////////
// Sprawdzanie połączenia z serwerem gg
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
Memo1->Lines->Add("Połączenie z serwerem:");
if(pakiet.type == GG_WELCOME)
Memo1->Lines->Add("OK");
else{
Memo1->Lines->Add("BRAK");
Memo1->Lines->Add(pakiet.type); }
//
////////////////////////////////////////////////////////////////////////////////
// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
Memo1->Lines->Add("Ziarno:");
Memo1->Lines->Add(seed.seed);
////////////////////////////////////////////////////////////////////////////////
//Logowanie
string opis = "Aktywny";
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));
gg_header* gghdr = (gg_header*)&buf[0];
gg_login80* logowanie = (gg_login80*)(gghdr + 1);
char haslo[] = "`mko000";
int hasz = gg_login_hash((unsigned char*)haslo,(unsigned int)seed.seed);
Memo1->Lines->Add("Hasz:");
Memo1->Lines->Add(hasz);
logowanie->uin = 18199693;
memcpy(logowanie->language,"pl",2);
logowanie->hash_type = 0x01;
memset(logowanie->hash, 0, 64);
memcpy((void*)logowanie->hash,(void *)&hasz,sizeof(int));
logowanie->status = 0x0003;
logowanie->flags = 0x00000001;
logowanie->features = 0x00000007;
logowanie->local_ip = 0;
logowanie->local_port = 0;
logowanie->external_ip = 0;
logowanie->external_port = 0;
logowanie->image_size = 255;
logowanie->unknown2 = 0x64;
logowanie->version_len = 0x21;
memcpy(logowanie->version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie->description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie->description);
gghdr->type = GG_LOGIN80;
gghdr->length = sizeof(gg_login80) + opis.size();
ClientSocket1->Socket->SendBuf(&buf[0],buf.size());
ClientSocket1->Socket->ReceiveBuf(&gghdr,sizeof(gghdr));
Memo1->Lines->Add("Logowanie");
if(gghdr->type == GG_LOGIN80_OK)
Memo1->Lines->Add("OK");
if(gghdr->type == GG_LOGIN_FAILED)
Memo1->Lines->Add("BŁĄD PODCZAS LOGOWANIA");
Memo1->Lines->Add(pakiet.type);
//
////////////////////////////////////////////////////////////////////////////////
}
- Kod: Zaznacz cały
ClientSocket1->Socket->ReceiveBuf(&gghdr,sizeof(gghdr));
Obym choć w małym stopniu posiadł taką wiedzę.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <string>
#include <vector.h>
using namespace std;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define GG_WELCOME 0x0001
#define GG_LOGIN80 0x0031
#define GG_LOGIN80_OK 0x0035
#define GG_LOGIN_FAILED 0x0009
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
gg_welcome seed;
gg_header pakiet;
gg_recv_msg80 odbior;
////////////////////////////////////////////////////////////////////////////////
// Sprawdzanie połączenia z serwerem gg
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
Memo1->Lines->Add("Połączenie z serwerem:");
if(pakiet.type == GG_WELCOME)
Memo1->Lines->Add("OK");
else{
Memo1->Lines->Add("BRAK");
Memo1->Lines->Add(pakiet.type); }
//
////////////////////////////////////////////////////////////////////////////////
// Odbiór ziarna
ClientSocket1->Socket->ReceiveBuf(&seed,sizeof(seed));
Memo1->Lines->Add("Ziarno:");
Memo1->Lines->Add(seed.seed);
////////////////////////////////////////////////////////////////////////////////
//Logowanie
string opis = "Aktywny";
vector<char> buf(sizeof(gg_login80) + opis.size() + sizeof(gg_header));
gg_header* gghdr = (gg_header*)&buf[0];
gg_login80* logowanie = (gg_login80*)(gghdr + 1);
char haslo[] = "`mko000";
int hasz = gg_login_hash((unsigned char*)haslo,(unsigned int)seed.seed);
Memo1->Lines->Add("Hasz:");
Memo1->Lines->Add(hasz);
logowanie->uin = 18199693;
memcpy(logowanie->language,"pl",2);
logowanie->hash_type = 0x01;
memset(logowanie->hash, 0, 64);
memcpy((void*)logowanie->hash,(void *)&hasz,sizeof(int));
logowanie->status = 0x0003;
logowanie->flags = 0x00000001;
logowanie->features = 0x00000007;
logowanie->local_ip = 0;
logowanie->local_port = 0;
logowanie->external_ip = 0;
logowanie->external_port = 0;
logowanie->image_size = 255;
logowanie->unknown2 = 0x64;
logowanie->version_len = 0x21;
memcpy(logowanie->version,"Gadu-Gadu Client build 8.0.0.7666",0x21);
logowanie->description_size = opis.size();
copy(opis.begin(),opis.end(),logowanie->description);
gghdr->type = GG_LOGIN80;
gghdr->length = sizeof(gg_login80) + opis.size();
ClientSocket1->Socket->SendBuf(&buf[0],buf.size());
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
Memo1->Lines->Add("Logowanie");
if(gghdr->type == GG_LOGIN80_OK)
Memo1->Lines->Add("OK");
if(gghdr->type == GG_LOGIN_FAILED)
Memo1->Lines->Add("BŁĄD PODCZAS LOGOWANIA");
Memo1->Lines->Add(pakiet.type);
//
////////////////////////////////////////////////////////////////////////////////
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
ClientSocket1->Active = false;
ClientSocket1->Active = true;
Memo1->Clear();
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ScktComp.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TClientSocket *ClientSocket1;
TMemo *Memo1;
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
#pragma pack(push, 1)
struct gg_header {
int type; /* typ pakietu */
int length; /* długość reszty pakietu */
};
struct gg_welcome {
int seed; /* ziarno */
};
struct gg_login80 {
int uin; /* numer Gadu-Gadu */
char language[2]; /* język: "pl" */
char hash_type; /* rodzaj funkcji skrótu hasła */
char hash[64]; /* skrót hasła dopełniony \0 */
int status; /* początkowy status połączenia */
int flags; /* początkowe flagi połączenia */
int features; /* opcje protokołu (0x00000007)*/
int local_ip; /* lokalny adres połączeń bezpośrednich (nieużywany) */
short local_port; /* lokalny port połączeń bezpośrednich (nieużywany) */
int external_ip; /* zewnętrzny adres (nieużywany) */
short external_port; /* zewnętrzny port (nieużywany) */
char image_size; /* maksymalny rozmiar grafiki w KB */
char unknown2; /* 0x64 */
int version_len; /* długość ciągu z wersją (0x21) */
char version[0x21]; /* "Gadu-Gadu Client build 8.0.0.7669" (bez \0) */
int description_size; /* rozmiar opisu */
char description[255]; /* opis (nie musi wystąpić, bez \0) */
};
struct gg_login80_ok {
int unknown1; /* 01 00 00 00 */
};
struct gg_send_msg80 {
int recipient; /* numer odbiorcy */
int seq; /* numer sekwencyjny */
int clas; /* klasa wiadomości */
int offset_plain; /* położenie treści czystym tekstem */
int offset_attributes; /* położenie atrybutów */
char html_message[0]; /* treść w formacie HTML (zakończona \0) */
char plain_message[0]; /* treść czystym tekstem (zakończona \0) */
char attributes[0]; /* atrybuty wiadomości */
};
struct gg_recv_msg80 {
int sender; /* numer nadawcy */
int seq; /* numer sekwencyjny */
int time; /* czas nadania */
int clas; /* klasa wiadomości */
int offset_plain; /* położenie treści czystym tekstem */
int offset_attributes; /* położenie atrybutów */
char html_message[0]; /* treść w formacie HTML (zakończona \0) */
char plain_message[0]; /* treść czystym tekstem (zakończona \0) */
char attributes[0]; /* atrybuty wiadomości */
};
#pragma pack(pop)
int gg_login_hash(unsigned char *password, unsigned 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;
}
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
- Kod: Zaznacz cały
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
...
if(gghdr->type == GG_LOGIN80_OK)
...
if(gghdr->type == GG_LOGIN_FAILED)
...
- Kod: Zaznacz cały
struct gg_login80
{
...
char description[255]; /* opis (nie musi wystąpić, bez \0) */
}
- Kod: Zaznacz cały
struct gg_send_msg80
{
...
char html_message[0];
char plain_message[0];
char attributes[0];
};
struct gg_recv_msg80
{
...
char html_message[0];
char plain_message[0];
char attributes[0];
};
ClientSocket1->Socket->ReceiveBuf(&pakiet,sizeof(pakiet));
...
if(pakiet.type == GG_LOGIN80_OK)
...
if(pakiet.type == GG_LOGIN_FAILED)
struct gg_send_msg80 {
int recipient; /* numer odbiorcy */
int seq; /* numer sekwencyjny */
int clas; /* klasa wiadomości */
int offset_plain; /* położenie treści czystym tekstem */
int offset_attributes; /* położenie atrybutów */
char html_message[1989]; /* treść w formacie HTML (zakończona \0) */
char plain_message[1989]; /* treść czystym tekstem (zakończona \0) */
char attributes[0x01]; /* atrybuty wiadomości */
};
Co do struktury logowania:
Dobrze uzupelniona?
struct gg_send_msg80
{
int recipient;
int seq;
int clas;
int offset_plain;
int offset_attributes;
};
Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość