Разработка Раздел для совместной разработки/доработки программы
21.02.2012, 22:52
#1
Пользователь
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Цитата:
Сообщение от
Demion
На каком пакете проблема?
RequestAuthLogin() на гейм сервер
21.02.2012, 22:59
#2
Пользователь
Регистрация: 27.10.2009
Сообщений: 63
Сказал Спасибо: 6
Имеет 21 спасибок в 19 сообщенях
Если сервер ничего не отвечает, скорее всего на правильно шифруешь пакет. Вот часть исходников моего старого бота, может поможет.
Оффтоп
Код:
VOID XorEncrypt(BYTE *data, DWORD len, BYTE *Key)
{
int temp = 0;
for( unsigned int i = 0; i < len; i++) {
int temp2 = data[i] & 0xff;
data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
temp = data[i];
};
int old = Key[8] & 0xff;
old |= (Key[9] << 0x08) & 0xff00;
old |= (Key[10] << 0x10) & 0xff0000;
old |= (Key[11] << 0x18) & 0xff000000;
old += len;
Key[8] = old &0xff;
Key[9] = (old >> 0x08) & 0xff;
Key[10] = (old >> 0x10) & 0xff;
Key[11] = (old >> 0x18) & 0xff;
}
INT SendPacket(BYTE* buf, WORD size, SOCKET conn, DWORD EncodeType, DWORD EncodeData, DWORD TimeOut)
{
BYTE pbuf[65535];
memcpy(pbuf+2, buf, size);
size+=2;
memcpy(pbuf, &size, sizeof(WORD));
memcpy(buf, pbuf, size);
if (EncodeType == 1)
Blowfish_EncodeBlock((BLOWFISH_CTX*)EncodeData, pbuf+2, size-2);
if (EncodeType == 2)
XorEncrypt(pbuf+2, size-2, (BYTE*)EncodeData);
return SendNonBlock(conn, (CHAR*)pbuf, size, 0, TimeOut);
}
VOID GSCryptInit(BYTE *buf, DWORD size, BYTE *XorKeyEnc, BYTE *XorKeyDec)
{
BYTE KeyConst[8] = {0xC8, 0x27, 0x93, 0x01, 0xA1, 0x6C, 0x31, 0x97};
memcpy(XorKeyEnc, buf+4, 8);
memcpy(XorKeyDec, buf+4, 8);
memcpy(XorKeyEnc+8, KeyConst, 8);
memcpy(XorKeyDec+8, KeyConst, 8);
}
VOID GSAuthLogin(BYTE *buf, CHAR* Login, DWORD *SessionKey1, DWORD *SessionKey2, DWORD *SessionKey3, DWORD *SessionKey4, SOCKET s, BYTE *XorKeyEnc)
{
WCHAR ULogin[15];
swprintf(ULogin, 15, L"%hs", Login);
memset(buf, 0, 65535);
buf[0] = 0x2B;
memcpy(buf+1, ULogin, wcslen(ULogin)*2+2);
memcpy(buf+wcslen(ULogin)*2+3, SessionKey4, sizeof(DWORD));
memcpy(buf+wcslen(ULogin)*2+7, SessionKey3, sizeof(DWORD));
memcpy(buf+wcslen(ULogin)*2+11, SessionKey1, sizeof(DWORD));
memcpy(buf+wcslen(ULogin)*2+15, SessionKey2, sizeof(DWORD));
buf[wcslen(ULogin)*2+19]=0x08;
buf[wcslen(ULogin)*2+23]=0x7A;
buf[wcslen(ULogin)*2+24]=0x03;
buf[wcslen(ULogin)*2+31]=0x01;
SendPacket(buf, wcslen(ULogin)*2+35, s, 2, (DWORD)XorKeyEnc, 90);
}
21.02.2012, 23:20
#3
Пользователь
Регистрация: 27.10.2009
Сообщений: 63
Сказал Спасибо: 6
Имеет 21 спасибок в 19 сообщенях
Честно говоря, не помню. Судя по всему это какие-то константные данные. В любом случае бот работал на офф сервере. Сравни с тем, что шлет твой клиент.
Последний раз редактировалось Demion, 21.02.2012 в 23:24 .
22.02.2012, 11:45
#4
Пользователь
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Цитата:
Сообщение от
Demion
Честно говоря, не помню. Судя по всему это какие-то константные данные. В любом случае бот работал на офф сервере. Сравни с тем, что шлет твой клиент.
Ну если по тому что расшифровывает l2ph у меня тоже константа но другая. Какие хроники у тебя?
XorEncrypt - чот невтыкаю как она шифрут данные... (+)
Разобрался, результат такой же как и у меня....
Что возвращает?
Код:
memcpy(buf+1, ULogin, wcslen(ULogin)*2+2);
memcpy(buf+wcslen(ULogin)*2+3 , SessionKey4, sizeof(DWORD));
Добавлено через 12 часов 3 минуты
Возникла идея, кто может подсказать где на сервере(l2jserver или l2emu HF, можно любой другой где открытые исходники) сделать вывод того что отправляется на клиент (конкретно это сесионные ключи)? Лучше то место где еще не шифруется.
Все проверил, вроде верно. Есть предположение что не правильно получаю SessionKey2_1 и SessionKey2_2. Первые два скорее всего верно так как там потом с помощью их получам список серверов.
Это верно?:
Код:
// 0x07
public void LS_PlayOk(byte[] buff, int len){
if (len < 11){
return;
}
System.arraycopy(buff, 3, SK2_1, 0, 4);
System.arraycopy(buff, 7, SK2_2, 0, 4);
System.out.println("Авторизация на логин-сервере прошла успешно");
}
Последний раз редактировалось Tin-moon, 22.02.2012 в 12:28 .
Причина: Добавлено сообщение
22.02.2012, 20:16
#5
Пользователь
Регистрация: 27.10.2009
Сообщений: 63
Сказал Спасибо: 6
Имеет 21 спасибок в 19 сообщенях
Код:
BYTE LSLogin(BYTE *buf, DWORD size, DWORD *SessionKey1, DWORD *SessionKey2, BLOWFISH_CTX *BlowFish)
{
if (size >= 10)
{
memcpy(SessionKey1, buf+3, sizeof(DWORD));
memcpy(SessionKey2, buf+7, sizeof(DWORD));
}
return buf[2];
}
BYTE LSPlay(BYTE *buf, DWORD size, DWORD *SessionKey3, DWORD *SessionKey4, BLOWFISH_CTX *BlowFish)
{
if (size >= 10)
{
memcpy(SessionKey3, buf+3, sizeof(DWORD));
memcpy(SessionKey4, buf+7, sizeof(DWORD));
}
return buf[2];
}
У меня так. А отправляется потом на ГС в таком порядке 4 3 1 2 (видно из предыдущих исходников)
---
wcslen - кол-во символов в юникод строке
wcslen*2+2 - длина строки в байтах
+1 - это смещение (ИД)
Последний раз редактировалось Demion, 22.02.2012 в 20:20 .
23.02.2012, 12:17
#6
Пользователь
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Поставил отпечатку на сервере. Итог, данные которые отправляет читаю верно (сесионные ключи, пакет KeyPacket - 8 байт ключа). Отправляю данные на сервер после хор, он их пытается читать но .... Видимо все -таки неправильно отправляю.
Вот код:
Код:
byte[] temp = HelpFunctions.FillZero(100);
byte[] login = HelpFunctions.StringToWideString(gs.getData().getLOGIN());
int len = login.length;
temp[0] = 0x2b;
System.arraycopy(login, 0, temp, 1, len);
System.arraycopy(gs.getData().getSessionKey2_1b(), 0, temp, len, 4);
System.arraycopy(gs.getData().getSessionKey2_2b(), 0, temp, len, 4);
System.arraycopy(gs.getData().getSessionKey1_1b(), 0, temp, len, 4);
System.arraycopy(gs.getData().getSessionKey1_2b(), 0, temp, len, 4);
// блок 01 00 00 00
temp[len+17] = 1;
int to_copy = len+con.length;
byte[] send = HelpFunctions.FillZero(to_copy);
System.arraycopy(temp, 0, send, 0, to_copy);
gs.SendPKT(send, 1);
Последний раз редактировалось Tin-moon, 28.02.2012 в 01:52 .
23.02.2012, 19:55
#7
Пользователь
Регистрация: 27.10.2009
Сообщений: 63
Сказал Спасибо: 6
Имеет 21 спасибок в 19 сообщенях
System.arraycopy(login, 0, temp, 1, len);
у тебя копирует с нуль символом? Если это string, то, на сколько я помню, оно возвращает кол-во символов. А юникод строка занимает по 2 байта на символ + 2 байта на нуль символ.
---
Не углядел, что там масив, а не стринг. Тогда скорее всего проблема в шифровке. Позже посмотрю твой код
Последний раз редактировалось Demion, 23.02.2012 в 20:02 .
25.02.2012, 00:11
#8
Пользователь
Регистрация: 27.10.2009
Сообщений: 63
Сказал Спасибо: 6
Имеет 21 спасибок в 19 сообщенях
Обычно принято писать решение ошибки, может кому то пригодится
25.02.2012, 23:53
#9
Пользователь
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Дописал. Чат работает. Остались мелочи...
Заметил что есть проблемы с кодировкой при чтении. Неправильная интерпретация некоторых символов. немогу подобрать кодировку. Что за она?
Добавлено через 6 часов 6 минут
Поискал ошибку, оказалась что проблема не в кодировке. Почему-то портятся некоторые байты.. Предположение на ХОР.
Это получаю в l2ph
Код:
4A E1 07 01 10 00 00 00 00
50 00 50 00 5A 00 00 00
FF FF FF FF
3F 04 40 04 38 04 32 04 35 04 42 04 00 00
Это получаю в своим
Код:
4a e1 07 01 10 00 00 00 34
57 00 50 00 5a 00 00 00
ff ff ff ff
3f 04 40 30 3f 04 32 04 35 04 42 04 00 00
Что это может быть?
Добавлено через 47 минут
Кто може подсказать? После отправки пакета CharSelected приходят 2 пакета от гейм сервера. И после отправляем 2 пакета от клиента. Так вот у меня почему-то после CharSelected приходит только 1 пакет.. и на этом висит, если не отправить следующие 2 ничего не будет.
Таже история и после 2 пакетов Request.....
Я вот думаю, что возможно поэтому возникает проблема с чатом.
Последний раз редактировалось Tin-moon, 25.02.2012 в 23:54 .
Причина: Добавлено сообщение
26.02.2012, 00:04
#10
Рыцарь
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
Tin-moon , обнови пакетхак, будет показывать названия пакетов.
За это сообщение NLObP нажился спасибкой от:
Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
Часовой пояс GMT +4, время: 10:06 .
vBulletin style designed by
MSC Team .
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод:
zCarot
Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!