Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
RequestAuthLogin на Lindvior
#1
Здравствуйте!

Я пишу оффгейм-бота для 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, или как его там) с соответствующим кодом ошибки.

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

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

Спасибо,
Андрей
Ответ
#2
Если ничего не путаю, там возможны два варианта формата (от чего зависят не понял, то ли от 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
oSg Написал:Если ничего не путаю, там возможны два варианта формата (от чего зависят не понял, то ли от 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 минут
Вот как формируется пакет:

[Изображение: dump-p2.png]
Ответ
#4
Каким образом после декрипта получились блоки по 0x80 байт ?
http://rghost.ru/51644971.view
Ответ
#5
oSg, спасибо за ответ!
Дело в том, что мне этот пакет нужно сформировать, а не расшифровать, поэтому не все моменты понятные. Заполняю так, как на моей картинке (только теперь еще и добавил длину на то место, где у вас "4" (ASCII - 53).
Вот только не понимаю, почему клиент формирует длину 53 байта.

Насчет длины:
Насчет длины в 128 байт

Добавлено через 23 минуты
oSg, был бы вам очень признателен, если б вы могли скинуть мне еще один расшифрованный дамп, но с 30-значным логином и 10-значным паролем.
Ответ
#6
del/////////
Ответ
#7
oSg Написал:Прошу прощения, неправильно понял сначала
Попробуйте два блока по 53 байта:

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

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

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

Сработало!

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

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

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

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

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

Добавлено через 7 минут
Рано обрадовался, 20 - это "System Error", теперь опять не пускает )) роюсь далее.
Ответ
#8
del/////////
Ответ
#9
oSg Написал:Хм, разница в два байта откуда-то взялась
Код:
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 минут

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

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

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

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

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


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Kamael(GF,HF,Lindvior) клиент на сборке CT0 Vangant monami 1 1,632 03-18-2018, 09:27 PM
Последний пост: lordofdest
  Lindvior и Win 10 -> 40% ЦП Main 18 5,105 02-22-2018, 08:12 PM
Последний пост: smeli
  [share] lin][info 2.3 [Lindvior] Gaikotsu 0 1,901 09-22-2017, 08:40 PM
Последний пост: Gaikotsu
  Структура пакета SystemMsg (531 Lindvior) Alay 0 1,332 02-12-2017, 11:24 AM
Последний пост: Alay
  Совместимость Rguard И Lindvior Krasavella 32 14,394 10-27-2014, 03:29 PM
Последний пост: 4arli
  RequestAuthLogin скелет PlayToWin 1 1,433 10-02-2014, 07:32 AM
Последний пост: n3k0nation
  Шара L2WT Lindvior Dolwin 12 5,095 08-22-2014, 07:18 PM
Последний пост: SouthBridge
  Декомпилированный Engine.dll Lindvior WoWan-SM 11 4,620 07-23-2014, 10:42 AM
Последний пост: Daan Raven
  Неизвестные пакеты Lindvior WoWan-SM 4 2,159 07-22-2014, 12:29 PM
Последний пост: WoWan-SM
  Какие приватные сейчас сборки Lindvior? Altino 4 2,221 03-27-2014, 09:38 PM
Последний пост: DXVSI

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


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