Hello!
W ramach nauki C# postanowiłem napisać sobie prosty program, który
zaloguje się i wyśle wiadomość.
Odbieram wiadomość powitalną, seed, etc., ale mam problem z samym
zalogowaniem się.
Stworzyłem taką strukturę:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct ggPacketLogin
{
public uint Type;
public uint Size;
public uint Uin;
public uint Hash;
public uint Status;
public uint Version;
public byte dunno1;
public uint local_ip;
public UInt16 local_port;
public uint external_ip;
public UInt16 external_port;
public byte image_size;
public byte dunno2;
}
i tak ją zapełniłem:
pckLogin.Type = 0x0015;
pckLogin.Size = GetStructureSize(pckLogin);
pckLogin.Uin = 9999999;
pckLogin.Hash = Convert.ToUInt32(gg_login_hash("haslo",
pckWelcome.Seed));
pckLogin.Status = 0x0003;
pckLogin.Version = 0x24;
pckLogin.dunno1 = 0x00;
pckLogin.local_ip = 1401964399;
pckLogin.local_port = 8074;
pckLogin.external_ip = 3641780572;
pckLogin.external_port = 8074;
pckLogin.image_size = 30;
pckLogin.dunno2 = 0xbe;
GetStructureSize liczy wieklość struktury bez Type oraz Size (czyli
wychodzi 35).
Funkcja gg_login_hash:
public long gg_login_hash(string password, uint seed)
{
uint x, y, z;
y = seed;
for (int i = 0; i < password.Length; i++)
{
x = 0;
x = (x & 0xffffff00) | password[i];
y ^= x;
y += x;
x <<= 8;
y ^= x;
x <<= 8;
y -= x;
x <<= 8;
y ^= x;
z = y & 0x1f;
y = (y << Convert.ToInt32(z)) | (y >> Convert.ToInt32((32 - z)));
}
return y;
}
I na koniec, tak wysyłam pakiet:
IntPtr pIP = Marshal.AllocHGlobal(1024);
Marshal.StructureToPtr(pckLogin, pIP, false);
Marshal.Copy(pIP, byBufor, 0, 1024);
this.scGniazdo.Send(this.byBufor);
W odpowiedzi zawsze otrzymuję 0x09, czyli błąd logowania.
Na tym się zatrzymuję, siedzę nad tym już trzeci dzień i nic nie
przychodzi mi do głowy. Prosiłbym o delikatne nakierowanie ;).
Pozdrawiam,
Rev.