LordPankake

Allatori Decrypt

Dec 13th, 2016
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.27 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.IOException;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5.  
  6. import org.objectweb.asm.Opcodes;
  7. import org.objectweb.asm.commons.ClassRemapper;
  8. import org.objectweb.asm.commons.Remapper;
  9. import org.objectweb.asm.tree.AbstractInsnNode;
  10. import org.objectweb.asm.tree.ClassNode;
  11. import org.objectweb.asm.tree.InsnList;
  12. import org.objectweb.asm.tree.InvokeDynamicInsnNode;
  13. import org.objectweb.asm.tree.LdcInsnNode;
  14. import org.objectweb.asm.tree.MethodInsnNode;
  15. import org.objectweb.asm.tree.MethodNode;
  16.  
  17. public class Transformer {
  18.     public static void main(String[] args) throws IOException {
  19.         Map<String, ClassNode> map = Utils.loadClasses(new File("CPSMod.jar"));
  20.         Map<String, byte[]> out = new HashMap<>();
  21.         // Patch bytecode bugs
  22.         for (ClassNode cn : map.values()) {
  23.             for (MethodNode mn : cn.methods) {
  24.                 InsnList ins = mn.instructions;
  25.                 removePops(ins);
  26.                 decryptSwaps(ins);
  27.                 decryptInvokeDynamics(ins);
  28.                 decryptStrings(ins);
  29.             }
  30.         }
  31.         // Rename
  32.         Remapper remapper = new MemberRemapper(map);
  33.         for (ClassNode cn : map.values()) {
  34.             ClassNode node = new ClassNode();
  35.             ClassRemapper adapter = new ClassRemapper(node, remapper);
  36.             cn.accept(adapter);
  37.             map.put(cn.name, node);
  38.         }
  39.         // Recompile
  40.         for (ClassNode cn : map.values())
  41.             out.put(cn.name, Utils.getNodeBytes(cn, true));
  42.         Utils.saveAsJar(out, "updated.jar");
  43.     }
  44.  
  45.     private static void decryptSwaps(InsnList ins) {
  46.         for (int i = 0; i < ins.size(); i++) {
  47.             AbstractInsnNode ain = ins.get(i);
  48.             if (ain.getOpcode() == Opcodes.SWAP) {
  49.                 AbstractInsnNode v1 = ain.getPrevious();
  50.                 AbstractInsnNode v2 = ain.getPrevious().getPrevious();
  51.                 if (Utils.isConstant(v1) && Utils.isConstant(v2)) {
  52.                     ins.remove(v2);
  53.                     ins.remove(v1);
  54.                     ins.insertBefore(ain, v1);
  55.                     ins.insertBefore(ain, v2);
  56.                     ins.remove(ain);
  57.                 }
  58.             }
  59.         }
  60.     }
  61.  
  62.     private static void removePops(InsnList ins) {
  63.         for (int i = 0; i < ins.size(); i++) {
  64.             AbstractInsnNode ain = ins.get(i);
  65.             if (ain.getOpcode() == Opcodes.POP) {
  66.                 int value = Utils.getPushValue(ain.getPrevious());
  67.                 if (value >= 1) {
  68.                     ins.remove(ain.getPrevious());
  69.                     ins.remove(ain);
  70.                 }
  71.             } else if (ain.getOpcode() == Opcodes.POP2) {
  72.                 int value1 = Utils.getPushValue(ain.getPrevious());
  73.                 int value2 = Utils.getPushValue(ain.getPrevious().getPrevious());
  74.                 int sum = value1 + value2;
  75.                 if (value1 > 0 && value2 > 0 && sum >= 2) {
  76.                     ins.remove(ain.getPrevious());
  77.                     ins.remove(ain.getPrevious());
  78.                     ins.remove(ain);
  79.                 }
  80.             }
  81.         }
  82.     }
  83.  
  84.     private static void decryptInvokeDynamics(InsnList ins) {
  85.         for (int i = 0; i < ins.size(); i++) {
  86.             AbstractInsnNode ain = ins.get(i);
  87.             if (ain.getOpcode() == Opcodes.INVOKEDYNAMIC) {
  88.                 InvokeDynamicInsnNode dyn = (InvokeDynamicInsnNode) ain;
  89.                 if (dyn.bsmArgs.length == 4) {
  90.                     int opcode = (int) dyn.bsmArgs[0];
  91.                     String owner = ((String) dyn.bsmArgs[1]).replace(".", "/");
  92.                     String name = (String) dyn.bsmArgs[2];
  93.                     String desc = (String) dyn.bsmArgs[3];
  94.                     boolean itf = opcode == Opcodes.INVOKEINTERFACE;
  95.                     ins.set(ain, new MethodInsnNode(opcode, owner, name, desc, itf));
  96.                 }
  97.             }
  98.         }
  99.     }
  100.  
  101.     private static void decryptStrings(InsnList ins) {
  102.         for (int i = 0; i < ins.size(); i++) {
  103.             AbstractInsnNode ain = ins.get(i);
  104.             if (ain.getOpcode() == Opcodes.LDC && ain.getNext().getOpcode() == Opcodes.INVOKESTATIC) {
  105.                 LdcInsnNode ldc = (LdcInsnNode) ain;
  106.                 MethodInsnNode min = (MethodInsnNode) ain.getNext();
  107.                 if (min.desc.equals("(Ljava/lang/String;)Ljava/lang/String;")) {
  108.                     String decrypt = decrypt(ldc.cst.toString());
  109.                     ins.remove(ldc);
  110.                     ins.set(min, new LdcInsnNode(decrypt));
  111.                 }
  112.             }
  113.         }
  114.     }
  115.  
  116.     public static String decrypt(String s) {
  117.         final int length = s.length();
  118.         int counter = length - 1;
  119.         int i = length - 1;
  120.         final char[] arrOut = new char[length];
  121.         while (i >= 0) {
  122.             final int counterCopy = counter;
  123.             final char char1 = s.charAt(counterCopy);
  124.             --counter;
  125.             arrOut[counterCopy] = (char) (char1 ^ (3 << 3 ^ 0x2));
  126.             if (counter < 0) {
  127.                 break;
  128.             }
  129.             final int counterM1 = counter--;
  130.             arrOut[counterM1] = (char) (s.charAt(counterM1) ^ ((0x3 ^ 0x5) << 4 ^ 0x5));
  131.             i = counter;
  132.         }
  133.         return new String(arrOut);
  134.     }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment