Помогите Плагин аутентификации для BungeeCord

Reality_SC

Старожил
Пользователь
Баллы
123
Имя в Minecraft
Reality_SC
Я очень сильно не помню, создавал ли я такую тему или нет, скорее всего просто где-то невнятно спросил в чужой с год назад и всё.

Мне нужно написать drag-and-drop плагин для BungeeCord. Плагин должен модифицировать рантайм так, чтобы при подключении игрока к прокси вот в этих вызовах:
Java:
String authURL
   = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username="
   + encName + "&serverId=" + encodedHash;
заменялась часть URL на мою. Без модификации исходного кода или .jar-файла самого BungeeCord-а!

Что у меня уже есть? Пустая заготовка плагина, и небольшая хакалка, которая использует рефлексию и подмену URLStreamHandler для других задач (подмена ссылок в клиентах и на серверах), но не может решить данную проблему с BungeeCord-ом.

Можно не писать код, а на словах объяснить принцип что и как сделать.
Я умею писать код и заменить часть строки я умею сам, я не могу найти точку входа так, чтобы интегрировать свой код в это место.
P.S. Я практически не знаю, как внутри устроены реализации URL и т.п.

@Dereku @Shevchik @alexandrage
 
Если Вы сможете получить доступ к объекту с данной строкой(сам я не пробовал), то сможете с легкостью изменить в нем значение любого поля, используя рефлексию.
 
Последнее редактирование:
Если Вы сможете получить доступ к объекту с данной строкой(сам я не пробовал), то сможете с легкостью изменить в нем значение любого поля, используя рефлексию.
В том-то и проблема, что это не поле объекта, а константа в теле метода, и рефлексией до неё не добраться.
Тут плагином вряд ли что-то сделаешь, тебе нужен свой classloader.
Всё-таки склоняюсь к тому, что сделать что-то можно.
P.S. Вот иерархия ClassLoader-ов, которые видит запускаемый плагин:
upload_2016-5-12_18-22-1.png
Первые два системные, последний кастомный.
 
В том-то и проблема, что это не поле объекта, а константа в теле метода, и рефлексией до неё не добраться.
Всё-таки склоняюсь к тому, что сделать что-то можно.
P.S. Вот иерархия ClassLoader-ов, которые видит запускаемый плагин:
Посмотреть вложение 40824
Есть 1 способ - плагин-редактор InitialHandler, который редактирует код класса в архиве во время запуска, но я не знаю, можно ли редактировать классы в jar файле запущенной программы.

Попробуй: http://asm.ow2.org/
На русском: https://www.ibm.com/developerworks/ru/library/l-jvmbytecode_mdf_1/
 
Поддерживаю @Larin. Кроме как изменения кода класса, Вы никак не сможете изменить значение локальной переменной, ибо переменная не существует, пока метод не будет вызван.
 
Легко, javaassist or asm. А простой рефлексией тут делать нечего. Хотя на счет asm не уверен, он вроде патчит класс до загрузки, но не после.
Хотя, можно попробовать реализовать псевтоонлайнмод на плагине при офлайн моде банжы, используя продление класса и overide. Или полностью на своей либе.
 
Последнее редактирование:
Легко, javaassist or asm. А простой рефлексией тут делать нечего. Хотя на счет asm не уверен, он вроде патчит класс до загрузки, но не после.
Хотя, можно попробовать реализовать псевтоонлайнмод на плагине при офлайн моде банжы, используя продление класса и overide. Или полностью на своей либе.
Продлить не выйдет, там в других классах используется конструктор этого класса, а что там происходит - фиг его знает. Лучше сразу запатчить 1 раз и всё.

Имхо: если надо быстро - javassist.
 
Никогда не юзал ни asm, ни javaassist.. Оно сложно?
Если я правильно понял, мне нужно организовать пролог для InitialHandler::handle(final EncryptionResponse encryptResponse), или прокси метод...
Примеры где-то искать, на стеке, да?)) у вас под рукой нету?
 
Никогда не юзал ни asm, ни javaassist.. Оно сложно?
Если я правильно понял, мне нужно организовать пролог для InitialHandler::handle(final EncryptionResponse encryptResponse), или прокси метод...
Примеры где-то искать, на стеке, да?)) у вас под рукой нету?
https://rawgit.com/jboss-javassist/javassist/master/tutorial/tutorial.html

2 пути:
1. Свой classloader + javassist для изменения кода(Подмена класса во время загрузки)
2. Javassist + включенный дебаггер java при запуске(не рекомендую)(Подмена class файла своппером)
 
https://rawgit.com/jboss-javassist/javassist/master/tutorial/tutorial.html

2 пути:
1. Свой classloader + javassist для изменения кода(Подмена класса во время загрузки)
2. Javassist + включенный дебаггер java при запуске(не рекомендую)(Подмена class файла своппером)
Лол, зачем целый класс подменять. Или ты не вкурсе на что способен javassist.
И класслоадер тут совсем не в тему.
 
Можно какие-нибудь примеры и то, как ты себе это представляешь? незнакомые слова нагуглю :)
Короче жабаассист способен менять начинку в классе. за исключением rt.jar и прочих жабобиблиотек.
 
Я правильно понял, что и javaassist, и asm требуют, чтобы класс ещё не был загружен?
В общем, наверное, это допустимо, если никакие другие классы не тянут загрузку класса InitialHandler при своей инициализации, и игроки ещё не начинают ломиться до окончания загрузки плагинов...
 
Последнее редактирование:
a93DwOP.png
 
Больно уж интересная тема. ТС, не мог бы рассказать о результатах, если таковые имеются?
 
Больно уж интересная тема. ТС, не мог бы рассказать о результатах, если таковые имеются?
Пока результаты не имеются, я отвлекаюсь на миллион разных дел одновременно.
Как будет — расскажу.
 
Назад
Верх