Да в том то и дело что похоже на правду, но сервер меня посылает далеко, и явно не на хутор))
Я не могу понять где у меня косяк. Тин, если не трудно, возьми мои пакеты, покажи какая чексумма должна быть, мне кажется у меня где-то расчёт идёт не правильно, может это из-за андроида, хз, но затык именно тут.
Сессия 1 - 3A 97 AF 4E
Сессия 2 - 28 B6 C1 26
Добавлено через 4 часа 2 минуты
только что отловил сессию из la2_client_emu, подставил сессию в свою функцию, всё сходится, пакеты полностью одинаковы получаются... возможно я не правильно беру сессию, может не те байты... может ли из-за этого быть ошибочный чексумм? сервер проверяет сессию в пакете и ту сессию что он отправлял? вообще очень странно..
Добавлено через 1 час 45 минут
проверил получение ID сессии.. всё норм.. не пойму где проблема...
Чё за бред... и пишет что не правильная чек сумма, однако при отправке через клиент эму - ошибок не выдаёт, а через андроид - сразу на чек сумму ругается...
Добавлено через 2 часа 7 минут нашёл косяк, спасибо wpepro! я отправлял на сервер пакет ГГ не закриптованный по блоуфишу!!! Т.е. как сформировал его сразу отправлял, а его перед отправкой нужно криптануть по ключу, как я понял из инита. )))
Последний раз редактировалось ErgoZ, 28.02.2012 в 00:24.
Причина: Добавлено сообщение
ErgoZ Как ты организуешь архитектуру клиента. Как обрабатываешь данные из сокета (всмысле как работаешь с сокетом)? Выделяешь в поток или как?
Просто это я к чему, у меня ща проблема в том что сервер отправляет пакеты а мой клиент почему-то их не обрабатывает. А начинает через определенное время... немогу понять в чем дело...
В данный момент продвинулся до RequestAuthLogin... пытаюсь сформировать пакет... на сколько понимаю первые 128 байт это логин+пароль, потом нули, и это нужно будет ещё обработать ключём рса, который мы получаем из инита и дескрамблируем, после этого некодированные 14 байт логина и 16 байт пароля? И вопрос, нужно ли это блоуфишить, если да, то каким ключём, с инита? вроде в ггаус от сервера ключа небыло, или я ошибаюсь?
Добавлено через 14 минут
Тин, учитывая что это, по сути, моя первая софтина на яве, я сделал отдельный класс, в нём создал функцию коннекта, получения пакета и отправки.
Короче вот код, думаю ты сможешь понять:
JAVA Код:
import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;import java.net.SocketTimeoutException;publicclass L2Socket {staticSocket la2_socket = newSocket();
staticInetAddress AddrAsIAddr = null;
publicstaticvoid connect(){try{
AddrAsIAddr = InetAddress.getByName(Constants.hostname);
}catch(Exception e){System.err.println("Could not get IP-address");
};
try{
SocketAddress adr = new InetSocketAddress(AddrAsIAddr,Constants.port_ls);
System.out.println("Socket configured");
la2_socket.connect(adr, 3000);
System.out.println("Connected to "+AddrAsIAddr+":"+Constants.port_ls);
}catch(SocketTimeoutException e){System.err.println(e);
}catch(IOException e){System.err.println(e);
}catch(Exception e){System.err.println(e+" | Could not establish socket!");
};
}publicstatic byte[] recivePKG(int size){
byte[] buf = new byte[size];
if(la2_socket.isConnected()){//System.out.println("la2_socket is Connected");try{
la2_socket.getInputStream().read(buf);
}catch(IOException e){// TODO Auto-generated catch block
e.printStackTrace();
}}return buf;
}publicstaticvoid SendPKG(byte[] buf){try{
la2_socket.getOutputStream().write(buf);
}catch(IOException e){// TODO Auto-generated catch block
e.printStackTrace();
}}publicstaticvoid close(){try{
la2_socket.close();
}catch(IOException e){// TODO Auto-generated catch block
e.printStackTrace();
}}}
Потом после SendPKG я сразу запускаю recivePKG. Но это на этапе логин сервера. В геймсервере планирую сделать архитектуру, где будет что-то типа:
// Цикл до тех пор, пока есть поступающие сообщения
while (la2_socket.isConnected()) { //пока сокет подключен
//Отображаем полученное сообщение
System.out.println("Server: " + recivePKG(тут я придумаю расчёт размера));
}
Ну и внутри этого цикла сделать обработку по типу пакета, что мол если пакет типа Say или Say2 (не помню что за чат отвечает), то работать с пакетом, если нет то не обращать внимания.
Я понимаю что код нубский, не судите строго.
Последний раз редактировалось ErgoZ, 28.02.2012 в 00:17.
Причина: Добавлено сообщение
Тин, не поделишься формированием пакета RequestAuthLogin, а то немного запутался в нём...
Добавлено через 53 минуты
не совсем понял как его шифровать, как перегнать в аски формат логин и пароль, в общем этот пакет я так и не понял вообще
Добавлено через 2 часа 46 минут
в общем я застрял на этапе РСА шифрования логина и пароля, поделитесь под яву, плиз, а то всё какой то бред получается... в итоге не могу отправить этот пакет
Добавлено через 1 час 19 минут
мой рса кодер почему то выдаёт такую хрень:
02-28 00:19:20.517: E/AndroidRuntime(1654): java.lang.ArithmeticException: BigInteger: modulus not positive
Ошибка вот тут: r = d.modPow(exp, m);
Я так понимаю что это из-за того что m становится 0 или меньше 0... но
Вот мой рсаэнкодер и репейр кей (я так понимаю это и есть унскрамблер):
JAVA Код:
publicstatic byte[] RepairKey(byte[] key){
byte[] k = new byte[128];
int i;
byte temp;
if(key.length != 128)returnnull;
System.arraycopy(key, 0, k, 0, 128);
for(i = 0; i < 0x40; i++)
k[0x40 + i] = (byte)(k[0x40 + i] ^ k[i]);
for(i = 0; i < 4; i++)
k[0x0d + i] = (byte)(k[0x0d + i] ^ k[0x34 + i]);
for(i = 0; i < 0x40; i++)
k[i] = (byte)(k[i] ^ k[0x40 + i]);
for(i = 0; i < 4; i++){
temp = k[0x00 + i];
k[0x00 + i] = k[0x4d + i];
k[0x4d + i] = temp;
}return k;
}publicstatic byte[] RSAEncrypt(String a, String p, byte[] rsakey){String sD;
byte[] sD_temp, sM_temp;
int len;
BigInteger m, exp, d, r;
while(a.length() < 14) a = a + (byte)0x00;
while(p.length() < 16) p = p + (byte)0x00;
sD = a + p + (byte)0x00 + (byte)0x00 + (byte)0x00 + (byte)0x00;
System.out.println(sD);
sM_temp = rsakey;
sD_temp = new byte[37];
sD_temp[0] = 0x24;
System.arraycopy(sD.getBytes(), 0, sD_temp, 3, 34);
len = sD_temp.length;
d = newBigInteger(sD_temp);
m = newBigInteger(sM_temp);
exp = BigInteger.valueOf(65537);
r = d.modPow(exp, m);
byte [] sR = new byte[128];
System.arraycopy(r.toByteArray(), 0, sR, 0, r.toByteArray().length);
return sR;
}
Последний раз редактировалось ErgoZ, 28.02.2012 в 05:23.
Причина: Добавлено сообщение
Нашел в чем проблема. Кто может объяснить?
Ситуация следующая:
Когда сканю пакеты в l2ph там видно что их приходит много. Общий размер после EnterWord до того как клиент начинает отправлять новые пакет = 4930 байт. Мой клиент также после EnterWord получает 4930 байт, но эти 4930 байт не целой кучей пакетов а всего 2... как решить эту проблему??
Решил поснифать трафик. Вывод нормальному клиенту приходит тоже 2 здоровых пакета. Как его потом разбирать? Всмысле брать разбивать на куски? Тогда как следить за размером? И "Хорить" нужно эти 2 большие или те которые разбили??
Пробовал найти решение в исходниках l2ph, что-то не увидел...
Последний раз редактировалось Tin-moon, 28.02.2012 в 14:35.
может оно бьётся по MAX_PKT_SIZE или как там переменная зовётся, уже не помню, видел в исходниках, вроде... думаю ксорится по отдельности как самостоятельные пакеты, вообще надо смотреть исходники сервера, наверное, на предмет того как формируются пакеты.
Чтобы не гонять много мелких пакетов по сети, они склеиваются в один побольше.
Расклеить их просто. С самого начала идут 2 не зашифрованных байта, это размер первого пакета. Сдвигаемся на этот размер, там опять 2 байта, это размер второго пакета и т.д.