2016-04-10 5 views
-2

Ich habe versucht, ein Programm, das jede Zeichenfolge in einem Glas und dann wieder dasselbe tun, um es wie eine Zeichenfolge Verschleierung zu machen. z.Java reverse alle Strings in einem Glas mit ASM

Normaler Code: new String("example");

Nach dem Laufen: new String(new StringBuilder().append("elpmaxe").reverse().toString()

Mein Code:

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; 
} 

(mit ASM 5.0.4)

Wo ist mein Fehler/was ich tat falsch mit mv.visitMethodInsn()?

EDIT: Ich bemerkte, es funktioniert mit -noverify (aber alle Zeichenfolgen sind umgekehrt). Was kann ich tun, um es ohne zu arbeiten?

+0

Welche Probleme haben Sie? Ohne eine Fehlermeldung ist es sehr schwierig zu sagen, was falsch ist. – Antimony

+0

Es gibt mir einen Bytecode-Fehler. Wenn Sie es dekompilieren, können Sie den Fehler sehen – GraxCode

+0

Haben Sie dies manuell getan und den Bytecode verglichen? Es sollte ziemlich offensichtlich sein, was sich ändern muss, nachdem Sie dies getan haben. –

Antwort

1

Es ist schwer zu sagen, was genau falsch ist, ohne Informationen über die Fehler oder Probleme, die auftreten. Doch ein Fehler ist mir aufgefallen:

   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); 

In diesem Code vergessen, Sie tatsächlich die Stringbuilder erstellen Sie verwenden. Sie müssen eine new und invokespecial Anweisung einfügen, um einen neuen StringBuilder zu erstellen.

Nebenbei bemerkt, der Append-Aufruf ist nicht erforderlich. Sie können eine Zeichenfolge direkt an den ctor von StringBuilder übergeben.

+0

Bearbeitet, funktioniert immer noch nicht. Gleicher Fehler wie zuvor. – GraxCode

+1

@GraxCode Was ist der Fehler? Sie haben nicht einmal die Fehlermeldung angegeben, geschweige denn eine Kopie der Klassendatei. Bitte posten Sie Ihren aktualisierten Code. – Antimony

+1

Die Übergabe von 'true' als letztes Parameterargument mit der Behauptung, dass der Eigentuemertyp (' java/lang/StringBuilder') eine 'Schnittstelle' war, hilft auch nicht ... – Holger