- 236
- 4
- 22
Всем привет. Есть такой вопрос, который я всё время решал раньше костылём и, в принципе, было прекрасно. Но вот что-то сегодня этот костыль не прокатил. Вообщем вот есть кусок кода, комментарием помечен мой костыль:
Дело в том, чтобы полноценно использовать ASM нужно точно знать обфусцирована ли игра. Если, допустим, при поиске методов я и могу написать
Java:
public class MyASMHook implements IClassTransformer {
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
if(!transformedName.equals("net.minecraft.util.MessageDeserializer")) return basicClass;
var obf = !name.equals(transformedName); //Вот тот самый костыль
var classNode = new ClassNode();
var classReader = new ClassReader(basicClass);
classReader.accept(classNode, 0);
//Тут мои модификации методов, не относится к теме
var writer = new ClassWriter(0);
classNode.accept(writer);
return writer.toByteArray();
}
}
if(method.name.equals("a") || method.name.equals("func_103191a") || method.name.equals("normalName"))
, то при вставке опкодов на уровне INVOKE... уже требуется чёткое имя класса, метода и его дескриптор (а значит точные имена классов аргументов метода), ибо в противном случае будет краш из-за несуществующего метода. В transformedName, как я понял, всегда находится "нормальное" имя класса через '.', будь оно из майнкрафта или же из модов. А name - текущее имя класса ("в рантайме"). Логично, что по идеи, чтобы определить, обфусцирована ли игра - нужно проверить неравенство этих 2 строк, что я всегда и делал. Но на этот раз не повезло. Я думал ошибку сделал в логике хука, но нет. Для отладки я добавил принт неравенства строки и принт всех опкодов и (если они instanceof MethodInsNode) их owner, name и desc. В результате я получил необфусцированные (нормальные) имена классов и нормальные (для майнкрафта) имена методов (тобишь func_1121a и т.п.), а вот строки эти были не равны. В итоге obf = true
, но судя по опкодам - должна быть false. Как же гарантировано узнать, требуется использование обфусцированного или обычного имени класса/метода при поиске/инвоке?