2016-04-10 3 views
-2

Я попытался создать программу, которая реверсирует каждую строку в банке, а затем сделает то же самое, чтобы сделать ее похожей на обфускацию строки. например.Java-реверс всех строк в банке с ASM

Normal Код: new String("example");

После запуска: new String(new StringBuilder().append("elpmaxe").reverse().toString()

Мой код:

public class Main { 
static String obfuscationFile; 

public static void main(String[] args) throws IOException { 
    obfuscationFile = "C:\\Users\\Leonhard\\Desktop\\CrackingTools-v1.0.jar"; // TODO: 
                       // args[0] 
    File jar = new File(obfuscationFile); 
    Map<String, byte[]> out = JarUtil.loadNonClassEntries(jar); 
    Map<String, ClassNode> nodes = JarUtil.loadClasses(jar); 
    for (ClassNode cn : nodes.values()) { 
     for (Object mn : cn.methods) { 
      MethodNode mnode = (MethodNode) mn; 
      ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); 
      cn.accept(cw); 
      if (mnode.name.startsWith("")) { 
       for (Integer i : reverse(mnode, cw)) { 
        // TODO: Not needed.. 
       } 
      } 
      out.put(cn.name, cw.toByteArray()); 
     } 
    } 
    JarUtil.saveAsJarAndClasses(out, nodes, jar.getAbsolutePath().replace(".jar", "") + "_Reverse" + ".jar"); 
} 

private static ArrayList<Integer> reverse(MethodNode method, ClassWriter cw) { 
    ArrayList<Integer> i = new ArrayList<Integer>(); 
    int e = 0; 
    for (AbstractInsnNode ain : method.instructions.toArray()) { 
     e++; 
     if (ain.getOpcode() == Opcodes.LDC) { 
      if (ain instanceof LdcInsnNode) { 
       LdcInsnNode ldc = (LdcInsnNode) ain; 
       if (ldc.cst instanceof String) { 
        i.add(e); 
        ldc.cst = new StringBuilder().append(ldc.cst).reverse().toString(); 
        MethodVisitor mv = null; 
        mv = cw.visitMethod(method.access, method.name, method.desc, method.signature, 
          (String[]) method.exceptions.toArray(new String[method.exceptions.size()])); 
        if (mv != null) { 
         // mv.visitLineNumber(e, new Label()); 
         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", 
           "(Ljava/lang/String;)Ljava/lang/StringBuilder;", true); 
         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "reverse", 
           "()Ljava/lang/StringBuilder;", true); 
         mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", 
           "()Ljava/lang/String;", true); 
         mv.visitMaxs(0, 0); 
         mv.visitEnd(); 
         // System.out.println(method.name + " " + 
         // method.desc); 
        } 
       } 
      } 
     } 
    } 
    return i; 
} 

(Использование ASM 5.0.4)

Где моя ошибка/Что я сделал неправильно с mv.visitMethodInsn()?

EDIT: Я заметил, что он работает с -noverify (но все строки меняются на противоположные). Что я могу сделать, чтобы заставить его работать без него?

+0

Какие проблемы вы испытываете? Без сообщения об ошибке очень сложно сказать, что не так. – Antimony

+0

Это дает мне ошибку байт-кода. если вы декомпилируете его, вы увидите ошибку – GraxCode

+0

Вы сделали это вручную и сравнили байт-код? Должно быть совершенно очевидно, что нужно изменить после этого. –

ответ

1

Трудно точно сказать, в чем дело, без какой-либо информации об ошибках или проблемах, которые вы испытываете. Однако, есть одна ошибка, которую я заметил:

   mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "append", 
         "(Ljava/lang/String;)Ljava/lang/StringBuilder;", true); 
       mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "reverse", 
         "()Ljava/lang/StringBuilder;", true); 
       mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", 
         "()Ljava/lang/String;", true); 

В этом коде, вы забыли фактически создать StringBuilder, который вы используете. Вам нужно будет вставить команду new и invokespecial для создания нового StringBuilder.

На боковой ноте вызов добавления не требуется. Вы можете передать строку непосредственно в ctor StringBuilder.

+0

Отредактировано, что все еще не работает. Такая же ошибка, как и раньше. – GraxCode

+1

@GraxCode Какая ошибка? Вы даже не указали сообщение об ошибке, не говоря уже о копии файла classfile. Кроме того, разместите обновленный код. – Antimony

+1

Передача 'true' в качестве последнего аргумента параметра, утверждая, что тип владельца (' java/lang/StringBuilder') был «интерфейсом», не помогает ... – Holger