Сообщений: 10
Тем: 1
Зарегистрирован: Jan 2014
Репутация:
38
01-14-2014, 04:10 AM
(Сообщение последний раз редактировалось: 01-14-2014, 04:23 AM Anderson.)
Здравствуйте!
Я пишу оффгейм-бота для 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, или как его там) с соответствующим кодом ошибки.
Как формируется этот пакет?
Буду очень благодарен за любую помощь.
Спасибо,
Андрей
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
01-14-2014, 07:42 AM
(Сообщение последний раз редактировалось: 01-14-2014, 08:28 AM qweqwe1.)
Если ничего не путаю, там возможны два варианта формата (от чего зависят не понял, то ли от 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);
Ну и там выбросить нули нужно
Сообщений: 10
Тем: 1
Зарегистрирован: Jan 2014
Репутация:
38
01-14-2014, 12:42 PM
(Сообщение последний раз редактировалось: 01-14-2014, 03:30 PM Anderson.)
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 минут
Вот как формируется пакет:
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
Каким образом после декрипта получились блоки по 0x80 байт ?
http://rghost.ru/51644971.view
Сообщений: 10
Тем: 1
Зарегистрирован: Jan 2014
Репутация:
38
01-14-2014, 04:15 PM
(Сообщение последний раз редактировалось: 01-14-2014, 04:39 PM Anderson.)
oSg, спасибо за ответ!
Дело в том, что мне этот пакет нужно сформировать, а не расшифровать, поэтому не все моменты понятные. Заполняю так, как на моей картинке (только теперь еще и добавил длину на то место, где у вас "4" (ASCII - 53).
Вот только не понимаю, почему клиент формирует длину 53 байта.
Насчет длины:
Насчет длины в 128 байт
А пакет у меня 128 байт имеет на входе, т.к. дополняется нулями через специфичность моих библиотек. Во всяком случае, на RSA это не влияет, т.к. шифрую публичным ключём способом получения модуля после возведения в степень - т.е.:
Код: encrypted = pow(data, E, N)
Оно же:
Код: encrypted = pow(data, E) % N
где pow - возведение в степень.
Перед этим data переводится в число как масив little-endian байтов. Собсно, все нули, как старшие байты, не влияют на него.
Добавлено через 23 минуты
oSg, был бы вам очень признателен, если б вы могли скинуть мне еще один расшифрованный дамп, но с 30-значным логином и 10-значным паролем.
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
01-14-2014, 04:39 PM
(Сообщение последний раз редактировалось: 02-11-2015, 06:52 PM qweqwe1.)
del/////////
Сообщений: 10
Тем: 1
Зарегистрирован: Jan 2014
Репутация:
38
01-14-2014, 05:21 PM
(Сообщение последний раз редактировалось: 01-14-2014, 05:29 PM Anderson.)
oSg Написал:Прошу прощения, неправильно понял сначала
Попробуйте два блока по 53 байта:
1 блок: 52 0 0 <50 символов логина>
2 блок: 52 0 0 <оставшиеся 13 символов логина> <16 символов пароля> <21 ноль>
если логин закончился раньше - заполняйте нулями
по поводу остатка - без понятия, что после этих двух блоков идет
30 логин, 10 пароль
http://rghost.ru/51647197.view
Сработало!
Всё-таки нужно обязательно ставить первым байтом в обоих пакетах "52", иначе не работает
Так выглядит мой рабочий пакет*:
![[Изображение: dump-final.png]](http://andrewdunai.com/images/dump-final.png)
Легенда: - желтый - тип пакета
- красный - логин**
- голубой - пароль**
- оранжевый - GG auth response
- фиолетовый - мистическая восьмёрка
- зеленый - тут будет чексума
* Забыл отметить дополнительные 13 байт логина, если он очень длинный.
** Логин и пароль на этом изображении не зашифрованы RSA.
Сейчас кидает ерор меседж 20 (подозреваю, что это - "аккаунт используется", т.к. друг скинул логин и пас и играет сейчас  )
Огромное вам спасибо, тыкнул бы вам еще один плюс в карму, но слишком маленький ещё
Огромное вам спасибо!
Добавлено через 7 минут
Рано обрадовался, 20 - это "System Error", теперь опять не пускает )) роюсь далее.
Сообщений: 150
Тем: 18
Зарегистрирован: Jan 2013
01-14-2014, 05:53 PM
(Сообщение последний раз редактировалось: 02-11-2015, 06:52 PM qweqwe1.)
del/////////
Сообщений: 10
Тем: 1
Зарегистрирован: Jan 2014
Репутация:
38
01-14-2014, 05:56 PM
(Сообщение последний раз редактировалось: 01-15-2014, 03:32 PM Anderson.)
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 минут
Проблема решена.
Ночью психанул и написал свой эмулятор логин-сервера (т.к. это для меня быстрее, чем поднять ява-сборку с дебагингом пакетов  ). Оказалось, был в нескольких шагах от успеха.
Оказалось, что те саммые 52 байта данных в каждом из этих блоков выравниваются не по левой стороне, а по правой, т.к. блок, начинающийся с той самой четверки, обозначающей длину последующей секции в 52 байта, начинается не с первого байта, а с 75-го.
Самое интересное - то, что на яве работают оба варианта, а на офе - только этот. Наверное, разница в RSA-отступах нулями, но голова уже трещит, не хочу и думать больше об этом. RSA у меня ванильной имплементации, так что виноваты NCSoft со своими "пакращеннями".
Такое количество матов и теплых слов в адреса матерей корейцев, как вчера, я за последний год вряд ли употребил.
|