public static void renameClassNode(final String oldName, final String newName) {
    for (ClassNode c : BytecodeViewer.getLoadedClasses()) {
      for (Object oo : c.innerClasses) {
        InnerClassNode innerClassNode = (InnerClassNode) oo;
        if (innerClassNode.innerName != null && innerClassNode.innerName.equals(oldName)) {
          innerClassNode.innerName = newName;
        }
        if (innerClassNode.name.equals(oldName)) {
          innerClassNode.name = newName;
        }
        if (innerClassNode.outerName != null && innerClassNode.outerName.equals(oldName)) {
          innerClassNode.outerName = newName;
        }
      }

      if (c.signature != null) c.signature = c.signature.replace(oldName, newName);

      if (c.superName.equals(oldName)) {
        c.superName = newName;
      }
      for (Object o : c.fields.toArray()) {
        FieldNode f = (FieldNode) o;
        f.desc = f.desc.replace(oldName, newName);
      }
      for (Object o : c.interfaces.toArray()) {
        String truxerLipton = (String) o;
        truxerLipton = truxerLipton.replace(oldName, newName);
      }
      for (Object o : c.methods.toArray()) {
        MethodNode m = (MethodNode) o;

        if (m.localVariables != null) {
          for (LocalVariableNode node : (List<LocalVariableNode>) m.localVariables) {
            node.desc = node.desc.replace(oldName, newName);
          }
        }

        if (m.signature != null) m.signature = m.signature.replace(oldName, newName);

        for (int i = 0; i < m.exceptions.size(); i++) {
          if (m.exceptions.get(i).equals(oldName)) m.exceptions.set(i, newName);
        }

        for (AbstractInsnNode i : m.instructions.toArray()) {
          if (i instanceof TypeInsnNode) {
            TypeInsnNode t = (TypeInsnNode) i;
            if (t.desc.equals(oldName)) {
              t.desc = newName;
            }
          }
          if (i instanceof MethodInsnNode) {
            MethodInsnNode mi = (MethodInsnNode) i;
            if (mi.owner.equals(oldName)) mi.owner = newName;
            mi.desc = mi.desc.replace(oldName, newName);
          }
          if (i instanceof FieldInsnNode) {
            FieldInsnNode fi = (FieldInsnNode) i;
            if (fi.owner.equals(oldName)) fi.owner = newName;
            fi.desc = fi.desc.replace(oldName, newName);
          }
        }
      }
    }
  }
示例#2
0
  @SuppressWarnings("unchecked")
  private void modify(ClassNode node) {
    if (!mappings.containsKey(node.name)) return;
    JSONObject object = mappings.get(node.name);

    String identity = (String) object.get("identity");
    String parentOverride = (String) object.get("parent_override");
    if (parentOverride != null && !parentOverride.equals("null")) {
      node.superName = parentOverride;
      if (node.superName.contains("Canvas")) {
        for (MethodNode mn : (List<MethodNode>) node.methods) {
          if (mn.name.equals("<init>")) {
            for (AbstractInsnNode insn : mn.instructions.toArray()) {
              if (insn.getOpcode() == Opcodes.INVOKESPECIAL) {
                MethodInsnNode min = (MethodInsnNode) insn;
                if (min.owner.contains("Canvas")) {
                  min.owner = node.superName;
                }
              }
            }
          }
        }
      }

      // System.out.println("\t"+node.name+" parent changed to "+parentOverride);
    }

    JSONArray interfaces = (JSONArray) object.get("interfaces");
    for (int i = 0; i < interfaces.size(); i++) {
      if (!node.interfaces.contains(interfaces.get(i))) {
        // System.out.println("\tAdded interface " + interfaces.get(i) + " to " + identity + " (" +
        // node.name + ")");

        node.interfaces.add(interfaces.get(i));
      }
    }

    // remove interfaces not specified
    for (int i = 0; i < node.interfaces.size(); i++) {
      if (!interfaces.contains(node.interfaces.get(i))) {
        // System.out.println("\tRemoved interface " + node.interfaces.get(i) + " from " + identity
        // + " (" + node.name + ")");
        node.interfaces.remove(i);
      }
    }

    if (identity.equals("Renderable")) {

      for (MethodNode mn : (List<MethodNode>) node.methods) {
        if ((mn.access & Opcodes.ACC_STATIC) != 0) {
          continue;
        }

        if (!mn.desc.endsWith("V")) {
          continue;
        }

        InstructionSearcher searcher =
            new InstructionSearcher(mn.instructions, 0, Opcodes.INVOKEVIRTUAL, Opcodes.ASTORE);

        if (searcher.match()) {
          InstructionSearcher search =
              new InstructionSearcher(mn.instructions, 0, Opcodes.INVOKEVIRTUAL);
          AbstractInsnNode[] primMatches = searcher.getMatches().get(0);
          if (search.match()) {
            AbstractInsnNode[] matches = search.getMatches().get(1);

            VarInsnNode var = new VarInsnNode(Opcodes.ALOAD, 0);
            VarInsnNode var2 =
                new VarInsnNode(
                    Opcodes.ALOAD, ((VarInsnNode) primMatches[primMatches.length - 1]).var);

            mn.instructions.insert(matches[matches.length - 1], var);
            mn.instructions.insert(var, var2);
            mn.instructions.insert(
                var2,
                new MethodInsnNode(
                    Opcodes.INVOKESTATIC,
                    "org/vinsert/bot/script/callback/ModelCallback",
                    "callback",
                    "(Lorg/vinsert/insertion/IRenderable;Lorg/vinsert/insertion/IModel;)V"));

            // System.out.println("\tInserted model callback to "+node.name+"."+mn.name);
          }
        }
      }
    }

    //		if (identity.equals("GameObject")) {
    //			for (MethodNode mn : (List<MethodNode>) node.methods) {
    //				if ((mn.access & Opcodes.ACC_STATIC) != 0) {
    //					continue;
    //				}
    //
    //				if (mn.desc.endsWith("V")) {
    //					continue;
    //				}
    //
    //				InstructionSearcher searcher = new InstructionSearcher(mn.instructions, 10, Opcodes.LDC,
    // Opcodes.IMUL, Opcodes.LDC, Opcodes.INVOKEVIRTUAL, Opcodes.ARETURN);
    //
    //				if (searcher.match()) {
    //
    //					AbstractInsnNode[] matches = searcher.getMatches().get(0);
    //
    //					VarInsnNode var = new VarInsnNode(Opcodes.ALOAD, 0);
    //					VarInsnNode var2 = new VarInsnNode(Opcodes.ALOAD, ((VarInsnNode) matches[matches.length -
    // 1]).var);
    ////
    //					mn.instructions.insert(mn.instructions.get(mn.instructions.size() - 1), var);
    //					mn.instructions.insert(var, var2);
    //					mn.instructions.insert(var2, new MethodInsnNode(Opcodes.INVOKESTATIC,
    // "com/hijackrs/bot/script/callback/ModelCallback", "callback",
    // "(Lcom/hijackrs/insertion/Renderable;Lcom/hijackrs/insertion/Model;)V"));
    //					System.out.println("\tInserted model callback to "+node.name+"."+mn.name);
    //				}
    //			}
    //		}

    JSONArray mappings = (JSONArray) object.get("mappings");
    for (int i = 0; i < mappings.size(); i++) {
      JSONObject entry = (JSONObject) mappings.get(i);
      String parent = (String) entry.get("parent");
      String name = (String) entry.get("name");
      String getterName = (String) entry.get("identity");
      String signature = (String) entry.get("signature");
      String fieldSignature = (String) entry.get("field_signature");
      boolean isStatic = (Boolean) entry.get("static");
      int opLoad = ((Number) entry.get("op_load")).intValue();
      int opReturn = ((Number) entry.get("op_return")).intValue();
      int modBits = ((Number) entry.get("mod_bits")).intValue();
      int modDirect = ((Number) entry.get("mod_value")).intValue();
      boolean modInverse = (Boolean) entry.get("mod_inverse");

      insert(
          node,
          parent,
          name,
          getterName,
          signature,
          fieldSignature,
          isStatic,
          opLoad,
          opReturn,
          modBits,
          modDirect,
          modInverse);
    }
  }