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

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

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

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

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

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

Узнать больше об этом ресурсе...
 

CMTV

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

P.S. Не забудь про то что в обфусцированое среде имена меняются
 
3,005
192
592
А если BlockPos - то что в visitInsn вписывать?
 
3,005
192
592
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 лоадера на свой класс.
 
1,111
47
420
Не правильная сигнатура это раз
Покажи флаги это два
 
3,005
192
592
Из сигнатуры нашел только II.
Флаги откуда?
 
3,005
192
592
1519838244590.png
И в Acessor - тот же метод, с public static.
 
1,111
47
420
1) По поводу сигнатуры я ответил в дискорде, чекай)) (Она такая: (Lnet/minecraft/world/World;II)Lnet/minecraft/util/math/BlockPos; ;))
2) Хз как это работает, но getRandomChunkPosition это метод а ты ищешь его в полях)
3) Ищешь ты getRandomChunkPosition в JustALoaderVisitor, а код посещения метода ты почему то разместил в другом классе))0
4) Чтобы вызвать метод нужно положить его аргументы на стэк ты же этого не делаешь
5) Помни про нормальный Type Casting чтобы ASM смог нормальный стакмэп сгенерить
 
3,005
192
592
Тебя у меня нету в дс.
Пойду юзать хук либу, на много проще..
 
7,099
324
1,509
Сверху