[Не просто][Не легко]Хуки

Изменение байт-кода с помощью ASM

1,111
47
422
JustAGod добавил(а) новый ресурс:

[Не просто][Не легко]Хуки - Изменение байт-кода с помощью ASM

Итак, согласитесь, частенько бывают ситуации когда очень хочеться изменить стандартное поведение майна добавив всего одно дополнительную строку или изменить какую нибудь переменую или модификаторы доступа. Не спорю для этого есть глуми с его либой да и AT не плохи, но я уверен вам интересно как это работает изнутри, не так ли?

Так вот, прежде чем начать нам нужно познакомиться с понятием байт-кода. Ни для кого не секрет, что Java имеет свой компилятор, который явно что-то делает. А делает...

Узнать больше об этом ресурсе...
 
Супер!
Прикрепил ссылку на GitHub на кнопку "Дополнительная информация" справа.
 
Можно ли получить пример обратного тому, что есть сейчас в гайде?
Т.Е. Сделать так, что бы поле major из класса Loader принимало на себя число из метода doGet ?
 
Ну, да.
Нужно для паблик мода изменить один метод из ванили, а добавлять хук либу из-за одного метода, это такое себе...
 
Нужно заменить ванильный метод получения на мой метод.
 
Давай я тебе на словах опишу самый простой способ.
1) Делаешь статичный метод который возвращает то же что и целевой метод
2) Доходишь до целевого метода и в MethodVisitor в функции visitCode вызываешь метод visitMethodInsn() с параметрами (Opcodes.INVOKESTATIC, "путь.до.класса", "имяФункции", "(СИГНАТУРА)", true). Сигнатуру ты можешь посмотреть в просмоторщике байт-кода.
3) Затем вызываешь visitInsn(Opcodes.ARETURN) если твой метод возвращает объект, Opcodes.IRETURN если int ну и так далее.
4) Все

P.S. Не забудь про то что в обфусцированое среде имена меняются
 
А если BlockPos - то что в visitInsn вписывать?
 
1519766513398.png
Краш.
Изменил:
Код:
@Override
public void visitCode() {
    super.visitMethodInsn(Opcodes.INVOKESTATIC, "net.minecraft.world.WorldEntitySpawner", "getRandomChunkPosition", "II", true);
    super.visitInsn(Opcodes.ARETURN);
}
В visitField изменил на name.equals("getRandomChunkPosition")
И в хук лоадере изменил путь с fml лоадера на свой класс.
 
Не правильная сигнатура это раз
Покажи флаги это два
 
Из сигнатуры нашел только II.
Флаги откуда?
 
1519838244590.png
И в Acessor - тот же метод, с public static.
 
1) По поводу сигнатуры я ответил в дискорде, чекай)) (Она такая: (Lnet/minecraft/world/World;II)Lnet/minecraft/util/math/BlockPos; ;))
2) Хз как это работает, но getRandomChunkPosition это метод а ты ищешь его в полях)
3) Ищешь ты getRandomChunkPosition в JustALoaderVisitor, а код посещения метода ты почему то разместил в другом классе))0
4) Чтобы вызвать метод нужно положить его аргументы на стэк ты же этого не делаешь
5) Помни про нормальный Type Casting чтобы ASM смог нормальный стакмэп сгенерить
 
Тебя у меня нету в дс.
Пойду юзать хук либу, на много проще..
 
Назад
Сверху