Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Разработка
Войти через OpenID

Разработка Раздел для совместной разработки/доработки программы

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 27.02.2012, 23:01   #141
Новичок
 
Регистрация: 12.02.2012
Сообщений: 27
Сказал Спасибо: 8
Имеет 0 спасибок в 0 сообщенях
ErgoZ пока неопределено
По умолчанию

Да в том то и дело что похоже на правду, но сервер меня посылает далеко, и явно не на хутор))

Я не могу понять где у меня косяк. Тин, если не трудно, возьми мои пакеты, покажи какая чексумма должна быть, мне кажется у меня где-то расчёт идёт не правильно, может это из-за андроида, хз, но затык именно тут.

Сессия 1 - 3A 97 AF 4E
Сессия 2 - 28 B6 C1 26

Добавлено через 4 часа 2 минуты
только что отловил сессию из la2_client_emu, подставил сессию в свою функцию, всё сходится, пакеты полностью одинаковы получаются... возможно я не правильно беру сессию, может не те байты... может ли из-за этого быть ошибочный чексумм? сервер проверяет сессию в пакете и ту сессию что он отправлял? вообще очень странно..

Добавлено через 1 час 45 минут
проверил получение ID сессии.. всё норм.. не пойму где проблема...

Пакет с моей софтины: 2A 00 07 4E 72 6D 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 4E 72 6D 00 00 00 00 00 00 00 00 00 00 00 00

Пакет с la2_client_emu: 2A 00 07 4E 72 6D 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 4E 72 6D 00 00 00 00 00 00 00 00 00 00 00 00

Чё за бред... и пишет что не правильная чек сумма, однако при отправке через клиент эму - ошибок не выдаёт, а через андроид - сразу на чек сумму ругается...

Добавлено через 2 часа 7 минут
нашёл косяк, спасибо wpepro! я отправлял на сервер пакет ГГ не закриптованный по блоуфишу!!! Т.е. как сформировал его сразу отправлял, а его перед отправкой нужно криптануть по ключу, как я понял из инита. )))

Последний раз редактировалось ErgoZ, 28.02.2012 в 00:24. Причина: Добавлено сообщение
ErgoZ вне форума   Ответить с цитированием
Старый 27.02.2012, 23:32   #142
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

ErgoZ Как ты организуешь архитектуру клиента. Как обрабатываешь данные из сокета (всмысле как работаешь с сокетом)? Выделяешь в поток или как?
Просто это я к чему, у меня ща проблема в том что сервер отправляет пакеты а мой клиент почему-то их не обрабатывает. А начинает через определенное время... немогу понять в чем дело...
Tin-moon вне форума   Ответить с цитированием
Старый 28.02.2012, 00:17   #143
Новичок
 
Регистрация: 12.02.2012
Сообщений: 27
Сказал Спасибо: 8
Имеет 0 спасибок в 0 сообщенях
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; public class L2Socket {     static Socket la2_socket = new Socket();     static InetAddress AddrAsIAddr = null;         public static void 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!");        };     }         public static 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;     }         public static void SendPKG(byte[] buf){         try {             la2_socket.getOutputStream().write(buf);         } catch (IOException e) {             // TODO Auto-generated catch block             e.printStackTrace();         }     }     public static void 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. Причина: Добавлено сообщение
ErgoZ вне форума   Ответить с цитированием
Старый 28.02.2012, 00:22   #144
Новичок
 
Регистрация: 12.02.2012
Сообщений: 27
Сказал Спасибо: 8
Имеет 0 спасибок в 0 сообщенях
ErgoZ пока неопределено
По умолчанию

Кстати решил зашарить код, который я написал для удобства определения типа пакета по его направлению и типу и вывод это в println
JAVA Код:
package com.ergoz.mychat.functions; public class LogPKG {     public static void log_LS_CS(byte[] buf) {  //пакет клиент -> лс         byte dst = buf[0];                 switch(dst) {         case (byte) 0x00: System.out.println("RequestAuthLogin"); break;         case (byte) 0x02: System.out.println("RequestServerLogin"); break;         case (byte) 0x05: System.out.println("RequestServerList"); break;         case (byte) 0x07: System.out.println("RequestGGAuth"); break;         default: System.out.println ("Отправлен неопределённый пакет.");         }         //System.out.println (dst[0]+dst[1]);     }     public static void log_LS_SC(byte[] buf) {  //пакет лс->  клиент         byte dst = buf[0];                 switch(dst) {         case (byte) 0x00: System.out.println("Init"); break;         case (byte) 0x01: System.out.println("LoginFail"); break;         case (byte) 0x02: System.out.println("AccountKicked"); break;         case (byte) 0x03: System.out.println("LoginOk"); break;         case (byte) 0x04: System.out.println("ServerList"); break;         case (byte) 0x06: System.out.println("PlayFail"); break;         case (byte) 0x07: System.out.println("PlayOk"); break;         case (byte) 0x0B: System.out.println("GGAuth"); break;         default: System.out.println ("Получен неопределённый пакет.");         }     }         public static void log_GS_CS(byte[] buf) {  //пакет клиент -> гс         byte dst = buf[0];                 switch(dst) {         case (byte) 0x00: System.out.println("ProtocolVersion"); break;         case (byte) 0x01: System.out.println("MoveBackwardToLocation"); break;         case (byte) 0x02: System.out.println("Say"); break;         case (byte) 0x03: System.out.println("EnterWorld"); break;         case (byte) 0x04: System.out.println("Action"); break;         case (byte) 0x08: System.out.println("AuthRequest"); break;         case (byte) 0x09: System.out.println("Logout"); break;         case (byte) 0x0A: System.out.println("AttackRequest"); break;         case (byte) 0x0B: System.out.println("CharacterCreate"); break;         case (byte) 0x0C: System.out.println("CharacterDelete"); break;         case (byte) 0x0D: System.out.println("CharacterSelected"); break;         case (byte) 0x0F: System.out.println("RequestItemList"); break;         case (byte) 0x11: System.out.println("RequestUnEquipItem"); break;         case (byte) 0x12: System.out.println("RequestDropItem"); break;         case (byte) 0x14: System.out.println("UseItem"); break;         case (byte) 0x15: System.out.println("TradeRequest"); break;         case (byte) 0x16: System.out.println("AddTradeItem"); break;         case (byte) 0x17: System.out.println("TradeDone"); break;         case (byte) 0x1B: System.out.println("RequestSocialAction"); break;         case (byte) 0x1C: System.out.println("ChangeMoveType - устарел"); break;         case (byte) 0x1D: System.out.println("ChangeWaitType - устарел"); break;         case (byte) 0x1E: System.out.println("RequestSellItem"); break;         case (byte) 0x1F: System.out.println("RequestBuyItem"); break;         case (byte) 0x21: System.out.println("RequestBypassToServer"); break;         case (byte) 0x24: System.out.println("RequestJoinPledge"); break;         case (byte) 0x25: System.out.println("RequestAnswerJoinPledge"); break;         case (byte) 0x26: System.out.println("RequestWithdrawalPledge"); break;         case (byte) 0x27: System.out.println("RequestOustPledgeMember"); break;         case (byte) 0x29: System.out.println("RequestJoinParty"); break;         case (byte) 0x2A: System.out.println("RequestAnswerJoinParty"); break;         case (byte) 0x2B: System.out.println("RequestWithDrawalParty"); break;         case (byte) 0x2C: System.out.println("RequestOustPartyMember"); break;         case (byte) 0x2F: System.out.println("RequestMagicSkillUse"); break;         case (byte) 0x30: System.out.println("Appearing"); break;         case (byte) 0x33: System.out.println("RequestShortCutReg"); break;         case (byte) 0x35: System.out.println("RequestShortCutDel"); break;         case (byte) 0x37: System.out.println("RequestTargetCanceld"); break;         case (byte) 0x38: System.out.println("Say2"); break;         case (byte) 0x3C: System.out.println("RequestPledgeMemberList"); break;         case (byte) 0x3F: System.out.println("RequestSkillList"); break;         case (byte) 0x40: System.out.println("AnswerTradeRequest"); break;         case (byte) 0x45: System.out.println("RequestActionUse"); break;         case (byte) 0x46: System.out.println("RequestRestart"); break;         case (byte) 0x48: System.out.println("ValidatePosition"); break;         case (byte) 0x4A: System.out.println("StartRotating"); break;         case (byte) 0x4B: System.out.println("FinishRotating"); break;         case (byte) 0x4D: System.out.println("RequestStartPledgeWar"); break;         case (byte) 0x4F: System.out.println("RequestStopPledgeWar"); break;         case (byte) 0x55: System.out.println("RequestGiveNickName"); break;         case (byte) 0x58: System.out.println("RequestEnchantItem"); break;         case (byte) 0x59: System.out.println("RequestDestroyItem"); break;         case (byte) 0x5E: System.out.println("RequestFriendInvite"); break;         case (byte) 0x5F: System.out.println("RequestAnswerFriendInvite"); break;         case (byte) 0x60: System.out.println("RequestFriendList"); break;         case (byte) 0x61: System.out.println("RequestFriendDel"); break;         case (byte) 0x62: System.out.println("CharacterRestore"); break;         case (byte) 0x63: System.out.println("RequestQuestList"); break;         case (byte) 0x64: System.out.println("RequestQuestAbort"); break;         case (byte) 0x66: System.out.println("RequestPledgeInfo"); break;         case (byte) 0x68: System.out.println("RequestPledgeCrest"); break;         case (byte) 0x6A: System.out.println("RequestRide"); break;         case (byte) 0x6B: System.out.println("RequestAquireSkillInfo"); break;         case (byte) 0x6C: System.out.println("RequestAquireSkill"); break;         case (byte) 0x6D: System.out.println("RequestRestartPoint"); break;         case (byte) 0x6E: System.out.println("RequestGMCommand"); break;         case (byte) 0x6F: System.out.println("RequestPartyMatchConfig"); break;         case (byte) 0x70: System.out.println("RequestPartyMatchList"); break;         case (byte) 0x71: System.out.println("RequestPartyMatchDetail"); break;         case (byte) 0x72: System.out.println("RequestCrystallizeItem"); break;         case (byte) 0x77: System.out.println("SetPrivateStoreMsgSell"); break;         case (byte) 0x81: System.out.println("RequestGmList"); break;         case (byte) 0x82: System.out.println("RequestJoinAlly"); break;         case (byte) 0x83: System.out.println("RequestAnswerJoinAlly"); break;         case (byte) 0x84: System.out.println("AllyLeave"); break;         case (byte) 0x85: System.out.println("AllyDismiss"); break;         case (byte) 0x88: System.out.println("RequestAllyCrest"); break;         case (byte) 0x89: System.out.println("RequestChangePetName"); break;         case (byte) 0x8A: System.out.println("RequestPetUseItem"); break;         case (byte) 0x8B: System.out.println("RequestGiveItemToPet"); break;         case (byte) 0x8C: System.out.println("RequestGetItemFromPet"); break;         case (byte) 0x8E: System.out.println("RequestAllyInfo"); break;         case (byte) 0x8F: System.out.println("RequestPetGetItem"); break;         case (byte) 0x94: System.out.println("SetPrivateStoreMsgBuy"); break;         case (byte) 0x98: System.out.println("RequestStartAllianceWar"); break;         case (byte) 0x9A: System.out.println("RequestStopAllianceWar"); break;         case (byte) 0xA0: System.out.println("RequestBlock"); break;         case (byte) 0xA2: System.out.println("RequestSiegeAttackerList"); break;         case (byte) 0xA4: System.out.println("RequestJoinSiege"); break;         case (byte) 0xA8: System.out.println("NetPing"); break;         case (byte) 0xAC: System.out.println("RequestRecipeBookOpen"); break;         case (byte) 0xB9: System.out.println("RequestEvaluate"); break;         case (byte) 0xBA: System.out.println("RequestHennaList"); break;         case (byte) 0xBB: System.out.println("RequestHennaItemInfo"); break;         case (byte) 0xBC: System.out.println("RequestHennaEquip"); break;         case (byte) 0xC1: System.out.println("RequestMakeMacro"); break;         case (byte) 0xC2: System.out.println("RequestDeleteMacro"); break;         case (byte) 0xCF: System.out.println("RequestAutoSoulShot"); break; //тут надо ещё D0 пакет над вставить но лень         case (byte) 0xEE: System.out.println("RequestChangePartyLeader"); break;         default: System.out.println ("Получен неопределённый пакет.");         }     }     public static void log_GS_SC(byte[] buf) { //пакет гс -> клиент         byte dst = buf[0];                 switch(dst) {         case (byte) 0x00: System.out.println("CryptInit"); break;         case (byte) 0x01: System.out.println("MoveToLocation"); break;         case (byte) 0x04: System.out.println("UserInfo"); break;         case (byte) 0x0E: System.out.println("StatusUpdate"); break;         case (byte) 0x13: System.out.println("CharList"); break;         case (byte) 0x14: System.out.println("AuthLoginFail"); break;         case (byte) 0x19: System.out.println("CharCreateOk"); break;         case (byte) 0x1A: System.out.println("CharCreateFail"); break;         case (byte) 0x23: System.out.println("CharDeleteOk"); break;         case (byte) 0x24: System.out.println("CharDeleteFail"); break;         case (byte) 0x25: System.out.println("ActionFailed"); break;         case (byte) 0x2F: System.out.println("ChangeWaitType"); break;         case (byte) 0x38: System.out.println("TeleportToLocation"); break;         case (byte) 0x3E: System.out.println("ChangeMoveType"); break;         case (byte) 0x7E: System.out.println("LogoutOK"); break;         case (byte) 0x80: System.out.println("QuestList"); break;         case (byte) 0xD3: System.out.println("NetPingRequest"); break;         case (byte) 0xAF: System.out.println("ServerSocketClose"); break;         case (byte) 0xE1: System.out.println("ChairSit"); break;         case (byte) 0xFE: System.out.println("ExSendManorList"); break;         default: System.out.println ("Получен неопределённый пакет.");         }     } }

Опять же напоминаю, я нуб в яве, я веб прогер)))
ErgoZ вне форума   Ответить с цитированием
Старый 28.02.2012, 05:22   #145
Новичок
 
Регистрация: 12.02.2012
Сообщений: 27
Сказал Спасибо: 8
Имеет 0 спасибок в 0 сообщенях
ErgoZ пока неопределено
По умолчанию

Тин, не поделишься формированием пакета 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 Код:
public static byte[] RepairKey(byte[] key)     {         byte[] k = new byte[128];         int i;         byte temp;         if (key.length != 128) return null;         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;     }         public static 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 = new BigInteger(sD_temp);         m = new BigInteger(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. Причина: Добавлено сообщение
ErgoZ вне форума   Ответить с цитированием
Старый 28.02.2012, 13:02   #146
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Нашел в чем проблема. Кто может объяснить?
Ситуация следующая:
Когда сканю пакеты в l2ph там видно что их приходит много. Общий размер после EnterWord до того как клиент начинает отправлять новые пакет = 4930 байт. Мой клиент также после EnterWord получает 4930 байт, но эти 4930 байт не целой кучей пакетов а всего 2... как решить эту проблему??
Tin-moon вне форума   Ответить с цитированием
Старый 28.02.2012, 13:14   #147
Новичок
 
Регистрация: 12.02.2012
Сообщений: 27
Сказал Спасибо: 8
Имеет 0 спасибок в 0 сообщенях
ErgoZ пока неопределено
По умолчанию

Выложи свою софтину скомпиленную, попробую соснифать, может коллективным разумом решим эту проблему
ErgoZ вне форума   Ответить с цитированием
Старый 28.02.2012, 14:20   #148
Пользователь
 
Регистрация: 29.01.2012
Адрес: г. Минск
Сообщений: 64
Сказал Спасибо: 10
Имеет 5 спасибок в 5 сообщенях
Tin-moon пока неопределено
По умолчанию

Решил поснифать трафик. Вывод нормальному клиенту приходит тоже 2 здоровых пакета. Как его потом разбирать? Всмысле брать разбивать на куски? Тогда как следить за размером? И "Хорить" нужно эти 2 большие или те которые разбили??

Пробовал найти решение в исходниках l2ph, что-то не увидел...

Последний раз редактировалось Tin-moon, 28.02.2012 в 14:35.
Tin-moon вне форума   Ответить с цитированием
Старый 28.02.2012, 14:22   #149
Новичок
 
Регистрация: 12.02.2012
Сообщений: 27
Сказал Спасибо: 8
Имеет 0 спасибок в 0 сообщенях
ErgoZ пока неопределено
По умолчанию

может оно бьётся по MAX_PKT_SIZE или как там переменная зовётся, уже не помню, видел в исходниках, вроде... думаю ксорится по отдельности как самостоятельные пакеты, вообще надо смотреть исходники сервера, наверное, на предмет того как формируются пакеты.
ErgoZ вне форума   Ответить с цитированием
Старый 28.02.2012, 15:00   #150
Новичок
 
Регистрация: 17.02.2012
Сообщений: 3
Сказал Спасибо: 2
Имеет 2 спасибок в 1 сообщении
sko пока неопределено
По умолчанию

Чтобы не гонять много мелких пакетов по сети, они склеиваются в один побольше.

Расклеить их просто. С самого начала идут 2 не зашифрованных байта, это размер первого пакета. Сдвигаемся на этот размер, там опять 2 байта, это размер второго пакета и т.д.

Ксорить надо мелкие.
sko вне форума   Ответить с цитированием
За это сообщение sko нажился 2 спасибками от:
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Разработка



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 10:02.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!