Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Строим эмулятор B&S emulator from scratch
#1
Дорогие, друзья!

К сожалению мой проект не стал опенсурсом. Не стал не потому, что я "зажал" код, а потому что труды мои никто в конце концов не оценит. Да, да, даже ника не вспомните. Поэтому я пилил эмулятор в привате. Сегодня хочу сообщить вам, что разработка эмулятора почти прекращена. Причина очевидная - разработчики изменяют сетевую часть игры каждый вторник, среду. Новые пакеты, новые опкоды. Идти по пути обновлений означает тратить свое время на сбор новых опкодов и разбор структуры пакетов. Не имею желания больше заниматься этим говном. Не потому что игра плохая, игра отличная, но потому что разработчики сами не определились со своей игрой. На этом сопельки можно закончить.

Что я планирую сделать в этом топике? Нет, я не выложу вам сурсы и свои наработки, поскольку это означало бы дать вам рыбу, сожрав которую, вы пришли бы в поисках очередной. Я дам вам удачку, ловите сами.

Большая часть наработок принадлежит разработчикам Атомикса, ребятам, которые поделились со мной своими наработками. Вопрос о доступности кода мы обсуждали, и они не против, если я покажу вам отрывки кода snippets.

Я покажу структуры серверов, покажу опкоды, пакеты, крипты и всякое навроде этого постепенно и шаг за шагом. Вы сможете сами запилить себе эмулятор. Как вы поступите со своими наработками мне не важно. Расшарите или продадите, но начальная информация будет общедоступной на этом форуме.

Язык программирования будет C# и все примеры будут включать в себя принципы C#. Но поскольку я не планирую отдать вам рабочий сурс ввиде "просто копипейст энд мейк билд", вы сможете переписать под любой вам нужный язык.

Данный топик, пожалуй посвящен людям с опытом в кодинге, нубы и нубские вопросы не приветствуются, т.к. обучать кого-либо я не собираюсь. Нуб? Проходи мимо. Также не приветствуются в топике "Одминистраторы фришек" с вопросами "когда уже выложат рабочий сервер, чтобы на школьниках можно было рубить бабло?". Никто вам ничего не выложит, и если у вас есть деньги но нету мозгов, вам тоже никто не собирается помогать, в частности я.

Поэтому не пишите мне в ЛС с предложениями.

Ну а теперь перейдем к технической части топика. Начнем естественно с логин сервера.

Относительно логин сервера / Concerning LoginServer

Продолжение следует.

Топик буду обновлять по мере ваших успехов и продвижений в разработке.
Ответ
#2
Автора знаю прилично и сталкивались с разными проблемами в работе, которые были успешно исправлены. Конечно по поводу архитектуры у всех свои фломастеры , но уверен что будет успех
Ответ
#3
offtop
m0nster.art - clear client patches, linkz to utils & code.
Гадаю по капче.
Ответ
#4
Хотя интерес к данной теме угас значительно, все-таки решил продолжить ее наполнение. Перед тем, как преступить к изложению концепции системы крипта, который мы использовали, хочу выразить свое негодование по поводу идиотов, которые критикуют код и пишут болдом в каждой теме. Ни о каком уважении речь идти не может. О таких гуру кодертсва могу сказать одно - конченные.

Для отсальных скажу лишь то, что код атомикса выдерживал онлайн в 3к человек и выдерживал его стабильно. Поэтому если хотите убедить меня в том, что наш код плохой, напишите свой сервер без наших наработок и протестируйте его на живом онлайне.

Относительно Лобби Сервера

Человеческая просьба. Если вы не ставите плюсики или "спасибо", то хотя бы не пишите гадости про код. Не нравится? Не комментируйте, пройдите мимо, закройте эту закладку, а лучше забудьте.

п.с. чуть позже выложу сниффы пакетов лобби сервера, уже раскодированные под последнюю версию клиента. Сможете сами их ковырять.

Добавлено через 1 час 33 минуты
Далее выкладываю свежий снифф лобби сервера:

Пакеты Лобби Сервера (снифф)

Первый байт означает опкод, второй байт является определяющим тип пакета. Таким образом грубо говоря, первые два байта можно использовать как опкод. Пакеты читаются очень легко, поэтому читающий да прочтет!
Ответ
#5
А что за аргумент checkHash в методе public void OnAuthKeyData(byte[] exchangeKey, string checkHash, int serial)? Как он генерируется?

В роуте /Auth/KeyData я получают 2массива каких то.
По первому - я генерирую ключики:
Код:
handler.getKeyExchange().generateKey( AbstractKeyExchange.Mode.SERVER, exchangeKey );
      String hash = handler.getKeyExchange().getAuthentication();

Дальше не до проверить хеш с checkHash
Но вот что за checkHash я так и не понял

От клиент приходит вторым массивом какой то ключ 32 байта
То это далеко не текст..
Помогите плиз)

п.с.

Код:
package openbns.loginserver.net.client.impl;

import io.netty.buffer.ByteBufInputStream;
import openbns.commons.crypt.AbstractKeyExchange;
import openbns.commons.crypt.CryptUtil;
import openbns.commons.xml.StsXStream;
import openbns.loginserver.net.client.AbstractRequestPacket;
import openbns.loginserver.net.client.dto.KeyDataDTO;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

/**
* Created with IntelliJ IDEA.
* User: Eugene Chipachenko
* Date: 27.01.14
* Time: 21:14
*/
public class RequestKeyData extends AbstractRequestPacket
{
  private static final Log log = LogFactory.getLog( RequestKeyData.class );
  private KeyDataDTO keyData;

  @Override
  public void read()
  {
    StsXStream stream = new StsXStream();
    stream.processAnnotations( KeyDataDTO.class );
    keyData = (KeyDataDTO) stream.fromXML( new ByteBufInputStream( buf ) );
    log.debug( "Read from client object: " + keyData );
  }

  @Override
  public void execute()
  {
    byte[] data = CryptUtil.base64( keyData.getKeyData() );
    ByteBuffer bf = ByteBuffer.wrap( data );
    bf.order( ByteOrder.LITTLE_ENDIAN );

    int size1 = bf.getInt();
    byte[] exchangeKey = new byte[ size1 ];
    bf.get( exchangeKey );

    int size2 = bf.getInt();
    byte[] checkHash = new byte[ size2 ];
    bf.get( checkHash );

    try
    {
      handler.getKeyExchange().generateKey( AbstractKeyExchange.Mode.SERVER, exchangeKey );
      String hash = handler.getKeyExchange().getAuthentication();
      [B]// Что я тут забыл то??[/B]
      System.out.println( hash );
    }
    catch( Exception e )
    {
      e.printStackTrace();
    }

    System.out.println( new String( exchangeKey ) );
    System.out.println( new String( checkHash ) );
  }
}
Ответ
#6
Dolwin Написал:А что за аргумент checkHash в методе public void OnAuthKeyData(byte[] exchangeKey, string checkHash, int serial)? Как он генерируется?

В роуте /Auth/KeyData я получают 2массива каких то.
По первому - я генерирую ключики:
Код:
handler.getKeyExchange().generateKey( AbstractKeyExchange.Mode.SERVER, exchangeKey );
      String hash = handler.getKeyExchange().getAuthentication();

Дальше не до проверить хеш с checkHash
Но вот что за checkHash я так и не понял

От клиент приходит вторым массивом какой то ключ 32 байта
То это далеко не текст..
Помогите плиз)

checkhash идет от пакета CM_AUTH_KEYDATA

CM_AUTH_KEYDATA

Ключ который приходит в 32 байтах считываем путем: byte[] hash = br.ReadBytes(br.ReadInt32());

И затем переводим в base64 string checkHash = Convert.ToBase64String(hash);

получая значение checkHash

Желательно в этой теме не обсуждать строительство эмулятора, лучше писать уже в существующих темах, чтобы данная тема была максимально чистой и понятной.
Ответ
#7
you started this for which client ?
Ответ
#8
I already told you, take one thread and put all your questions there. Don't make a MESS on forum. OK? Moreover current thread is suppose to be guide-like, I strongly don't recommend you to put any dicussion here. Otherwise I will ask moderator to clean this thread up.

The answer you are looking for, there is no certain client. All information above is the same for all BNS versions. So doesn't matter what version you will choose, the login server, lobby always the same. The game part would be slightly different because of opcodes which are different for each update. The info above gives you basics to understand how things should work, but it never meant to be a source.

And you should understand too, why do you need a client without GG and Themida. First of all, full BNS encryption consists of RSA and Deffie-Hellman with Ripemd128 cipher which later is used to generate 16 bytes AES key, which will be used for main packets encryption. Got it? To get AES keys you don't need to reverse RSA stuff, you just need to write small hooker for AES Encryption function and you will get all of AES keys which are used in encryption process. Once you did it, you can decrypt all packets and see the structure... If you are good with C++ you can use MS Detour, if C# then use EasyHook. That's it.
Ответ
#9
An English translation would be great!
(i know a little bit russian but its not enough tho Tongue)
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Blade And Soul эмулятор (Atomix исходники) Manguster 44 39,300 08-28-2016, 03:59 PM
Последний пост: Gitty32
  Куплю Эмулятор warrfar 1 2,854 04-25-2014, 06:15 PM
Последний пост: KalasH[UA]
  Open source Blade & Soul Scala Server Emulator hex1r0 64 34,209 02-25-2014, 04:01 PM
Последний пост: KalasH[UA]
  BNS эмулятор JAVA luna9966 122 52,514 01-15-2014, 06:50 PM
Последний пост: Deazer
  Продам эмулятор BNS niktout 2 4,174 11-30-2013, 10:18 AM
Последний пост: niktout
  [BNSONLINE.ORG] Новый эмулятор/сервер по игре Blade & Soul valsha 81 56,434 09-18-2013, 06:19 PM
Последний пост: irekhan

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)