Пакеты логин-скрина Lineage 2

Как вычислить их айдишник?

  • Он там присутствует, нужно только поискать (возможно дополнение в комментах)

    Голосов: 0 0,0%

  • Всего проголосовало
    8

Mizuwokiru

Величайший
Проверенный
Сообщения
945
Розыгрыши
0
Решения
1
Репутация
1 038
Реакции
451
Баллы
1 553
Всем привет! Давно хотел заняться ла2ой с нуля, да еще и на C++ без WinAPI, а вместо чистых Winsock2 какой-то там asio или libuv, но как-то впадлу было. Но вот как-то приспичило и давай-ка я лезть для начала в клиент, благо для этого есть RPGClub с его Ertheia и растемиженными в нем дллками (да-да, я хз как ее снимать и кажется это довольно муторно, поэтому впадлу разбираться :D). Так вот, сделал дамп сразу + псевдокод в asm и cpp виде (на всякий, так как мне пока cpp более читабелен). Так вот столкнулся я с одной проблемкой: геймсерверные пакеты вроде как в дампе по порядку идут (по идентификатору), а вот с логиновскими бяда - нифига не по порядку. Так вот вопрос: как вычислить их айдишник? Методом подбора? Или все же там где-то этот айдишник спрятан? Кто разбирался в этом, подскажите плэс! Прикладываю сюда архивчик с этими 3-мя файлами.
 

Всем привет! Давно хотел заняться ла2ой с нуля, да еще и на C++ без WinAPI, а вместо чистых Winsock2 какой-то там asio или libuv, но как-то впадлу было. Но вот как-то приспичило и давай-ка я лезть для начала в клиент, благо для этого есть RPGClub с его Ertheia и растемиженными в нем дллками (да-да, я хз как ее снимать и кажется это довольно муторно, поэтому впадлу разбираться :D). Так вот, сделал дамп сразу + псевдокод в asm и cpp виде (на всякий, так как мне пока cpp более читабелен). Так вот столкнулся я с одной проблемкой: геймсерверные пакеты вроде как в дампе по порядку идут (по идентификатору), а вот с логиновскими бяда - нифига не по порядку. Так вот вопрос: как вычислить их айдишник? Методом подбора? Или все же там где-то этот айдишник спрятан? Кто разбирался в этом, подскажите плэс! Прикладываю сюда архивчик с этими 3-мя файлами.

Взять исходники сервера, и там посмотреть.

Ну или тут, практически вся инфа до сих пор актуальна, с некоторыми поправками:




Но проще всего поставить бряк на функцию SendPacket, и смотреть ид пакетов, там вроде первым параметром this, потом форматная строка пакета, и потом будет ид пакета)
 
Взять исходники сервера, и там посмотреть.

Ну или тут, практически вся инфа до сих пор актуальна, с некоторыми поправками:




Но проще всего поставить бряк на функцию SendPacket, и смотреть ид пакетов, там вроде первым параметром this, потом форматная строка пакета, и потом будет ид пакета)
Ну я это и имел в виду под перебором. А там инфа устаревшая, как и в большинстве исходников (некоторые начинания видел во фришной л2юнити). Вот че и спрашиваю, мб эти айдишники там где-то заныканы...
 
Ну я это и имел в виду под перебором. А там инфа устаревшая, как и в большинстве исходников (некоторые начинания видел во фришной л2юнити). Вот че и спрашиваю, мб эти айдишники там где-то заныканы...

Не понимаю, что значит перебор) Ставишь бряк на функцию SendPacket, логинишься, смотришь последовательность ID пакетов к логин серверу, записываешь, и все)
 
  • Мне нравится
Реакции: kick
Наф тебе C++? Пиши на YoptaScript, так все поцоны делают!
 
Через функцию SendPacket не проходят логин серверные пакеты

Была ц меня идея как все это дело обойти , только она тебе не понравится
 
Последнее редактирование модератором:
Надо просто включить нетворк логгинг в клиенте. Там если включена эта опция, то в консоль выбиваются дебаг строчки

крч я понял, надо послать n-ное кол-во пакетов с первым байтом от 1 до n и глянуть на вывод консольки. Заразом и названия пакетов получу, и их структуру
 
Последнее редактирование модератором:
Через функцию SendPacket не проходят логин серверные пакеты

Была ц меня идея как все это дело обойти , только она тебе не понравится

У меня проходят) Просто функций SendPacket две, одна для логин пакетов, другая для гейм) Или что ты понимаешь под серверными? Пакеты C->LS ловишь в функции SendLoginPacket, пакеты C<-LS ловишь в DispatchNetworkQueue, там есть switch, который в зависимости от ИД пакета вызывает нужный хендлер)

крч я понял, надо послать n-ное кол-во пакетов с первым байтом от 1 до n и глянуть на вывод консольки. Заразом и названия пакетов получу, и их структуру

Какой то черезжопный метод, если честно)
 
Последнее редактирование модератором:
У меня проходят) Просто функций SendPacket две, одна для логин пакетов, другая для гейм) Или что ты понимаешь под серверными? Пакеты C->LS ловишь в функции SendLoginPacket, пакеты C<-LS ловишь в DispatchNetworkQueue, там есть switch, который в зависимости от ИД пакета вызывает нужный хендлер)



Какой то черезжопный метод, если честно)
Внатуре , я серверные пакеты хукаю через AddNetwork
 
Внатуре , я серверные пакеты хукаю через AddNetwork

Думаю не суть, факт в том, что есть место, где можно хендлить пакеты от логин сервера, о чем и было утверждение и вопрос ТС'а)
 
Собсна тут такое дело, а как консоль включить? Пробовал пропихнуть вместе с dsetup AllocConsole, но увы и ах, у них видать чистейший дсетап.
Решил праблемес, ошибка была в ошибочном расположении руки (в районе таза). Но вот только теперь в эту консоль ниче не летит, че делать? Мб есть другой способ, менее костыльный?
 
Последнее редактирование:
Как в пихнуть? Если в длл то вот варик
Код:
void CreateConsole()
{
    int hConHandle = 0;
    long lStdHandle = 0;
    FILE* fp = 0;

    AllocConsole();
    setlocale(LC_ALL, "RUS");
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);

    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;
    setvbuf(stdout, NULL, _IONBF, 0);
}
#include <conio.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
включи, и еще что там не хватает, потом просто вызывай CreateConsole(), и выводи как в обычную консоль
 
Как в пихнуть? Если в длл то вот варик
Код:
void CreateConsole()
{
    int hConHandle = 0;
    long lStdHandle = 0;
    FILE* fp = 0;

    AllocConsole();
    setlocale(LC_ALL, "RUS");
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);

    fp = _fdopen(hConHandle, "w");
    *stdout = *fp;
    setvbuf(stdout, NULL, _IONBF, 0);
}
#include <conio.h>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
включи, и еще что там не хватает, потом просто вызывай CreateConsole(), и выводи как в обычную консоль
Дак я так и делаю :) Только вот вывод FOutputDevice::Logf туда не поступает. Как сделать вывод этого Logf в консоль?
 
Ну собсна профит! Но тут явно чего-то не хватает... Наверное аргументов форматированного вывода ну и самого форматирования :D
Qurlik1.png

Сейчас это крч так выглядит:
 
Теперь собсна выглядит лучше:
Qurlik2.png

HookedLogf:
 
Назад
Сверху Снизу