Autor Wątek: Łącznie z GG  (Przeczytany 1103 razy)

Offline krajew4

  • Użytkownik

# Marzec 11, 2010, 18:49:18
Witam,
od kilku dni mam problem, usiłuję napisać bota do GG. Problem wygląda następująco:
mam wzorcowy program, który przepisuje z C++ do Javy, łączy się on poprawnie z serwerem gg i udostepnia się:
#include <cstdlib>
#include <iostream>

using namespace std;
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <windows.h>

using namespace std;


#define GG_LIST_EMPTY 0x0012
#define GG_WELCOME 0x0001
struct gg_welcome {
        int seed;       /* klucz szyfrowania hasła */
}welcome;

#pragma pack(1)
#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;
}n_status;

int gg_login_hash(char *password, int seed){   
       // fcja hashujaca, wycieta dla czytelnosci
}

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 = "xxx";
    char descr[]="success";
    char *sized="400";
   
    printf("[=] Hashed password: [%s]\n", password);
   
login.uin            = numer;
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);

  byte * b = (byte*)&login;                                 
   for (int i = 0;i<sizeof(login);i++) {
       char u[256];
       sprintf(u,"\nbyte[%d] = %d",i,*b);
       printf(u);
       b++;
   }                                 
   system("PAUSE");

    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 0x0004
    #define GG_STATUS_INVISIBLE 0x0014
    #define GG_STATUS_AVAIL     0x0004
    /*------zmiana statusu------*/
    n_status.status=GG_STATUS_AVAIL;   
    strcpy(n_status.description,"opis");
    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;
    } 
   
    header.type=GG_LIST_EMPTY;
    header.length=0;
    send(sockd, (char*)&header, sizeof(header),0);
    return EXIT_SUCCESS;
}
Chciałem zrobić to samo w Javie, więc ochoczo zabrałem się za pisanie:
package action;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;

import util.StaticFields;
import util.ggheader;
import util.gglogin60;
import util.ggwelcome;

public class Main {

public void log(String str) {
System.out.println(str);
}

public long gg_login_hash(String pwd,long seed) {
// fcja hashujaca, wycieta dla czytelnosci
}

public int readInt(DataInputStream dis) throws IOException {
int b1 = dis.readUnsignedByte();
int b2 = dis.readUnsignedByte();
int b3 = dis.readUnsignedByte();
int b4 = dis.readUnsignedByte();
return b1 + b2 * 16 + b3 * 16 * 16 + b4 * 16 * 16 * 16;
}

public void initialize() {
try {
log("Connecting...");
Socket socket = new Socket();
socket.connect(new InetSocketAddress(StaticFields.SERVER_IP,StaticFields.SERVER_PORT));
socket.setReceiveBufferSize(1024);
socket.setSendBufferSize(1024);
log("Connected!");

InputStream input = socket.getInputStream();
DataInputStream dataInput = new DataInputStream(input);
OutputStream output = socket.getOutputStream();
//DataOutputStream dataOutput = new DataOutputStream(output);

ggheader gg_header = new ggheader();
ggwelcome gg_welcome = new ggwelcome();
gg_header.type = readInt(dataInput);
gg_header.length = readInt(dataInput);
gg_welcome.seed = readInt(dataInput);
log(gg_header.type + " ");
log(gg_header.length + " ");
log(gg_welcome.seed + " ");

// -- logowanie
gglogin60 login = new gglogin60();
login.uin            = numer;
login.hash           = (int)gg_login_hash("xxx",gg_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 = 0;
login.unknown2       = (byte)0;
login.time = 0;
// login header
ByteBuffer m = ByteBuffer.allocate(8);
m.putInt(StaticFields.GG_LOGIN60);
m.putInt(105);
output.write(m.array());
output.flush();
// login struct
ByteBuffer buf = ByteBuffer.allocate(105);
buf.putInt(login.uin);
buf.putInt(login.hash);
buf.putInt(login.status);
buf.putInt(login.version);
buf.put(login.unknown1);
buf.putInt(login.local_ip);
buf.putChar(login.local_port);
buf.putInt(login.external_ip);
buf.putChar(login.external_port);
buf.put((byte)login.image_size);
buf.put((byte)login.unknown2);
buf.put(login.description,0,70);
buf.putInt(login.time);
IntBuffer intb = buf.asIntBuffer();
output.write(buf.array());
output.flush();

int loginResult = (int)readInt(dataInput);
log("loginResult: "+loginResult);

socket.close();
log("Connection close!");
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
Main m = new Main();
m.initialize();
}
}
Musialem napisac wlasne readInt pownieważ to z DataInputStream zwraca mi ciągle 16777216, i to jest moje pierwsze pytanie, dlaczego tak się dzieje? (popieram się linkiem http://java.sun.com/j2se/1.4.2/docs/api/java/io/DataInput.html#readInt() gdzie widać, że to to samo co moje) A drugie pytanie dlaczego w linijce:
int loginResult = (int)readInt(dataInput);
dostaje wyjątek EOFException, wygląda na to, że serwer niczym nie odpowiada, ale dlaczego nie odpowiada, skoro program jest analogiczny do tego z C++?
« Ostatnia zmiana: Marzec 11, 2010, 18:51:29 wysłana przez krajew4 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych