Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   RequestAuthLogin на Lindvior (https://forum.zone-game.info/showthread.php?t=33554)

Anderson 14.01.2014 04:10

RequestAuthLogin на Lindvior
 
Здравствуйте!

Я пишу оффгейм-бота для l2, на данный момент уже есть неплохой функционал (карта, таргеты, скилы, инвентарь, скрипты на фарм, общение с NPC). Пока что играл с чистым Interlude.

Вопрос касается пакета логин-сервера RequestAuthLogin в хрониках Lindvior и Valiance. На интерлюде он состоял из ID сессии (ну или ответа гг), шифрованного публичным ключём куска с логином и паролем (128 байт), чексумы и некой восьмёрки. Но на Lindvior этот пакет весит не 176 + 2 байт, а 320 + 2 байт, а анализ расшифрованного пакета наводит на мысль, что RSA-блок тепер имеет размер 256 байт. Пакет фактически совпадает по структуре со старым, кроме размера этого блока с логином и паролем. Это кажется логичным, т.к. увеличена длина логина и пароля в этих хроника - в качестве логина теперь мэйл, который явно не поместится в привычные 14 байт.

Не подскажете, где взять структуру пакета? Перерыл множество ява-сборок, везде старая структура (176+2), новой (320+2) нет нигде. Методом тыка (128 б логин + 128 б пароль, 128 б логин + 124 б пароль + 4 б отп) не получилось. Остальная часть вроде норм, раньше серв дропал конект, а теперь (п осле уведичентя блока RSA вдвое) говорит, что "неправильный пароль", т.е. прииходит AuthLoginFail (или LoginFail, или как его там) с соответствующим кодом ошибки.

Как формируется этот пакет?

Буду очень благодарен за любую помощь.

Спасибо,
Андрей

qweqwe1 14.01.2014 07:42

Re: RequestAuthLogin на Lindvior
 
Если ничего не путаю, там возможны два варианта формата (от чего зависят не понял, то ли от engine.dll, то ли от чего-то из l2.ini), у меня используется старый:

Код:

var decrypt1 = rsa.processBlock(this.raw, 0x00, 0x80);
var decrypt2 = rsa.processBlock(this.raw, 0x80, 0x80);

var username = Encoding.ASCII.GetString(decrypt1, 0x03, 0x0D);
var password = Encoding.ASCII.GetString(decrypt2, 0x11, 0x10);

Здесь есть небольшое упущение - логин может быть длиннее 0x0D. Попробовал ввести логин максимальной длины в клиенте, получилось так, что username доходит до конца первого блока и продолжается до начала пароля (с третьего байта) во втором блоке. Сейчас исправлю.
В итоге получилось вот так:

Код:

var decrypt1 = rsa.processBlock(this.raw, 0x00, 0x80);
var decrypt2 = rsa.processBlock(this.raw, 0x80, 0x80);

var username = Encoding.ASCII.GetString(decrypt1, 0x03, 0x32) + Encoding.ASCII.GetString(decrypt2, 0x03, 0x0E);
var password = Encoding.ASCII.GetString(decrypt2, 0x11, 0x10);

Ну и там выбросить нули нужно

Anderson 14.01.2014 12:42

Re: RequestAuthLogin на Lindvior
 
Цитата:

Сообщение от oSg (Сообщение 345772)
Если ничего не путаю, там возможны два варианта формата (от чего зависят не понял, то ли от engine.dll, то ли от чего-то из l2.ini), у меня используется старый:

Код:

var decrypt1 = rsa.processBlock(this.raw, 0x00, 0x80);
var decrypt2 = rsa.processBlock(this.raw, 0x80, 0x80);

var username = Encoding.ASCII.GetString(decrypt1, 0x03, 0x0D);
var password = Encoding.ASCII.GetString(decrypt2, 0x11, 0x10);

Здесь есть небольшое упущение - логин может быть длиннее 0x0D. Попробовал ввести логин максимальной длины в клиенте, получилось так, что username доходит до конца первого блока и продолжается до начала пароля (с третьего байта) во втором блоке. Сейчас исправлю.
В итоге получилось вот так:

Код:

var decrypt1 = rsa.processBlock(this.raw, 0x00, 0x80);
var decrypt2 = rsa.processBlock(this.raw, 0x80, 0x80);

var username = Encoding.ASCII.GetString(decrypt1, 0x03, 0x32) + Encoding.ASCII.GetString(decrypt2, 0x03, 0x0E);
var password = Encoding.ASCII.GetString(decrypt2, 0x11, 0x10);

Ну и там выбросить нули нужно

То есть просто логин и пароль заполняются с 3-го байта нуль-терминированными строками один сразу за другим, я верно понял?
Сейчас за 20 минут буду на работе, попробую

Добавлено через 2 часа 10 минут
oSg: спасибо за совет, но, увы, не получается залогинится. Пакет правильно формирую, а сервер всё равно не пускает - мол, неверный пароль. Не могли бы вы скинуть мне какой-то исходник с имплементацией этого пакета? Может, я что-то другое упускаю.

Добавлено через 2 часа 22 минуты
Прошу прощения, невнимательно прочёл ваш пост.
Прочитав ваш код, попробовал этот способ. Допустим, есть такие данные:

Login: aaaabbbbccccdddd
Password: 1111222233334444

Получается так:

Код:

1 блок: <3 байта отспупа> <16 байтов логина> <109 байтов до конца первого блока>
2 блок: <17 нолей> <16 байтов пароля> <95 байтов до конца второго блока>

Но так не работает :<

Добавлено через 2 часа 47 минут
Вот как формируется пакет:

http://andrewdunai.com/images/dump-p2.png

qweqwe1 14.01.2014 15:32

Re: RequestAuthLogin на Lindvior
 
Каким образом после декрипта получились блоки по 0x80 байт ?
http://rghost.ru/51644971.view

Anderson 14.01.2014 16:15

Re: RequestAuthLogin на Lindvior
 
oSg, спасибо за ответ!
Дело в том, что мне этот пакет нужно сформировать, а не расшифровать, поэтому не все моменты понятные. Заполняю так, как на моей картинке (только теперь еще и добавил длину на то место, где у вас "4" (ASCII - 53).
Вот только не понимаю, почему клиент формирует длину 53 байта.

Насчет длины:
Насчет длины в 128 байт:
Свернуть ↑Развернуть ↓


Добавлено через 23 минуты
oSg, был бы вам очень признателен, если б вы могли скинуть мне еще один расшифрованный дамп, но с 30-значным логином и 10-значным паролем.

qweqwe1 14.01.2014 16:39

Re: RequestAuthLogin на Lindvior
 
del/////////

Anderson 14.01.2014 17:21

Re: RequestAuthLogin на Lindvior
 
Цитата:

Сообщение от oSg (Сообщение 345846)
Прошу прощения, неправильно понял сначала
Попробуйте два блока по 53 байта:

1 блок: 52 0 0 <50 символов логина>
2 блок: 52 0 0 <оставшиеся 13 символов логина> <16 символов пароля> <21 ноль>

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

30 логин, 10 пароль
http://rghost.ru/51647197.view

Сработало!

Всё-таки нужно обязательно ставить первым байтом в обоих пакетах "52", иначе не работает :)

Так выглядит мой рабочий пакет*:
http://andrewdunai.com/images/dump-final.png
Легенда:
  • желтый - тип пакета
  • красный - логин**
  • голубой - пароль**
  • оранжевый - GG auth response
  • фиолетовый - мистическая восьмёрка
  • зеленый - тут будет чексума

* Забыл отметить дополнительные 13 байт логина, если он очень длинный.
** Логин и пароль на этом изображении не зашифрованы RSA.

Сейчас кидает ерор меседж 20 (подозреваю, что это - "аккаунт используется", т.к. друг скинул логин и пас и играет сейчас:) )
Огромное вам спасибо, тыкнул бы вам еще один плюс в карму, но слишком маленький ещё :(

Огромное вам спасибо!

Добавлено через 7 минут
Рано обрадовался, 20 - это "System Error", теперь опять не пускает )) роюсь далее.

qweqwe1 14.01.2014 17:53

Re: RequestAuthLogin на Lindvior
 
del/////////

Anderson 14.01.2014 17:56

Re: RequestAuthLogin на Lindvior
 
Цитата:

Сообщение от oSg (Сообщение 345858)
Хм, разница в два байта откуда-то взялась
Код:

BA 83 D5 53 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 08 00 00 00 00 00 00 99 B3 88 E0 64
17 C8 CD 33 9A F5 9E 26 9D C1 3A 00 00 00 00 E7
DC C2 41 00 00 00 00 00 00 00 00 00 00

Это дамп после шифрованных блоков
До 08 правильно, потом различия

А, забыл сказать, что я длину не дописал на картинке.
Кстати, всё так же не работает. Логин и пароль те, что надо, но сервер не хавает.
Кстати, может подскажете, что там еще есть в пакете, чего я не указал в описании?

Добавлено через 6 часов 29 минут
Собсно, на Линдвиор (яву) получилось залогинится, на офф (и Линдвиор на dragonwind.ru) не пускает - "неверный пароль". 99%, что проблемма в RSA-блоке.

Добавлено через 21 час 27 минут

Проблема решена.

Ночью психанул и написал свой эмулятор логин-сервера (т.к. это для меня быстрее, чем поднять ява-сборку с дебагингом пакетов :) ). Оказалось, был в нескольких шагах от успеха.

Оказалось, что те саммые 52 байта данных в каждом из этих блоков выравниваются не по левой стороне, а по правой, т.к. блок, начинающийся с той самой четверки, обозначающей длину последующей секции в 52 байта, начинается не с первого байта, а с 75-го.

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

Такое количество матов и теплых слов в адреса матерей корейцев, как вчера, я за последний год вряд ли употребил. :)


Текущее время: 12:20. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot