123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- package me.ktcm;
- import net.minecraft.launchwrapper.IClassTransformer;
- import net.minecraft.launchwrapper.Launch;
- import org.objectweb.asm.ClassReader;
- import org.objectweb.asm.ClassWriter;
- import org.objectweb.asm.Opcodes;
- import org.objectweb.asm.tree.AbstractInsnNode;
- import org.objectweb.asm.tree.ClassNode;
- import org.objectweb.asm.tree.FieldInsnNode;
- import org.objectweb.asm.tree.FrameNode;
- import org.objectweb.asm.tree.InsnList;
- import org.objectweb.asm.tree.InsnNode;
- import org.objectweb.asm.tree.LineNumberNode;
- import org.objectweb.asm.tree.MethodInsnNode;
- import org.objectweb.asm.tree.MethodNode;
- import org.objectweb.asm.tree.VarInsnNode;
- public class KajetansTransformer implements IClassTransformer
- {
- private final boolean obfuscated;
-
- public KajetansTransformer()
- {
- Boolean ldev = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
- if(ldev == null)
- {
- obfuscated = true;
- }
- else
- {
- obfuscated = !ldev;
- }
- }
-
- @Override
- public byte[] transform(String old, String searge, byte[] bytes)
- {
- if(searge.equals("net.minecraft.client.gui.FontRenderer"))
- {
- //net.minecraft.client.gui.FontRenderer;
- System.out.println("|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾");
- System.out.println("| Patching net.minecraft.client.gui.FontRenderer");
- System.out.println("|___________________________________________________");
- return patchColorHook(old, bytes);
- }
- return bytes;
- }
- public byte[] patchColorHook(String c, byte[] bytes)
- {
- try
- {
- ClassNode classNode = new ClassNode();
- ClassReader classReader = new ClassReader(bytes);
- classReader.accept(classNode, 0);
-
- // net/minecraft/client/gui/FontRenderer bip
- // func_78255_a renderStringAtPos Render a single line string at the current (posX,posY) and update posX
- // MD: net/minecraft/client/gui/FontRenderer/renderStringAtPos (Ljava/lang/String;Z)V bip/a (Ljava/lang/String;Z)V
- MethodNode mn;
- if(obfuscated)
- {
- mn = classNode.methods.stream().filter(me -> me.name.equals("a")).filter(me -> "(Ljava/lang/String;Z)V".equals(me.desc)).findAny().get();
- }
- else
- {
- mn = classNode.methods.stream().filter(me -> me.name.equals("renderStringAtPos")).findAny().get();
- }
-
- InsnList ins = mn.instructions;
- int index = 0;
- boolean found = false;
- AbstractInsnNode next;
- while(index < ins.size())
- {
- next = ins.get(index);
- if(next instanceof MethodInsnNode)
- {
- MethodInsnNode mnode = (MethodInsnNode) next;
- if(mnode.name.equals("valueOf") && mnode.desc.equals("(C)Ljava/lang/String;"))
- {
- found = true;
-
- // LdcInsnNode 18 9 - loading of string constant "0123456789abcdefklmnor", must be removed
- // VarInsnNode 25 2 1
- // VarInsnNode 21 2 3
- // InsnNode 4 0
- // InsnNode 96 0
- // MethodInsnNode 182 5 (I)C false charAt java/lang/String
- // insert new instruction here
- // MethodInsnNode 184 5 (C)Ljava/lang/String; false valueOf java/lang/String - search for this instruction, its not obfuscated
- // FieldInsnNode 178 4 Ljava/util/Locale; ROOT java/util/Locale - must be removed
- // MethodInsnNode 182 5 (Ljava/util/Locale;)Ljava/lang/String; false toLowerCase java/lang/String - must be removed
- // InsnNode 3 0 - must be removed
- // MethodInsnNode 182 5 (I)C false charAt java/lang/String - must be removed
- // MethodInsnNode 182 5 (I)I false indexOf java/lang/String - must be removed
- // VarInsnNode 54 2 5
- // LabelNode -1 8
-
- index--;
- ins.remove(ins.get(index - 5)); // remove "0123456789abcdefklmnor"
- ins.remove(ins.get(index));
- ins.remove(ins.get(index));
- ins.remove(ins.get(index));
- ins.remove(ins.get(index));
- ins.remove(ins.get(index));
- ins.remove(ins.get(index));
- ins.insert(ins.get(index - 1), new MethodInsnNode(Opcodes.INVOKESTATIC, "me/ktcm/events/Hooks", "onColorCodeChosen", "(CZ)I", false));
- ins.insert(ins.get(index - 1), new VarInsnNode(Opcodes.ILOAD, 2)); // push boolean shadow on the stack, inverted order
- break;
- }
- }
- index++;
- }
-
- if(!found)
- {
- System.out.println("Start of color hook was not found");
- return bytes;
- }
-
- /*java.util.ListIterator<AbstractInsnNode> list = ins.iterator();
- while(list.hasNext())
- {
- System.out.println(getString(list.next()));
- }*/
- ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
- classNode.accept(writer);
- return writer.toByteArray();
- }
- catch(Exception ex)
- {
- ex.printStackTrace();
- }
- return bytes;
- }
-
- public String getString(AbstractInsnNode node)
- {
- StringBuilder sb = new StringBuilder();
- sb.append(node.getClass().getSimpleName());
- sb.append(" ");
- sb.append(node.getOpcode());
- sb.append(" ");
- sb.append(node.getType());
- sb.append(" ");
- if(node instanceof LineNumberNode)
- {
- LineNumberNode n = (LineNumberNode) node;
- sb.append(n.line);
- sb.append(" ");
- sb.append(n.start);
- }
- else if(node instanceof VarInsnNode)
- {
- VarInsnNode n = (VarInsnNode) node;
- sb.append(n.var);
- }
- else if(node instanceof MethodInsnNode)
- {
- MethodInsnNode n = (MethodInsnNode) node;
- sb.append(n.desc);
- sb.append(" ");
- sb.append(n.itf);
- sb.append(" ");
- sb.append(n.name);
- sb.append(" ");
- sb.append(n.owner);
- }
- else if(node instanceof FrameNode)
- {
- FrameNode n = (FrameNode) node;
- if(n.local != null)
- {
- n.local.forEach(s -> {sb.append(s); sb.append(" ");});
- }
- if(n.stack != null)
- {
- n.stack.forEach(s -> {sb.append(s); sb.append(" ");});
- }
- }
- else if(node instanceof InsnNode)
- {
- }
- else if(node instanceof FieldInsnNode)
- {
- FieldInsnNode n = (FieldInsnNode) node;
- sb.append(n.desc);
- sb.append(" ");
- sb.append(n.name);
- sb.append(" ");
- sb.append(n.owner);
- }
- return sb.toString();
- }
- }
|