2016-04-10 1 views
-2

J'ai essayé de faire un programme qui inverse chaque chaîne dans un pot, puis faites de même, pour faire comme une obfuscation de chaîne. par ex.Java inverse toutes les chaînes dans un pot avec ASM

code normal: new String("example");

Après l'exécution: new String(new StringBuilder().append("elpmaxe").reverse().toString()

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

(via ASM 5.0.4)

Où est mon erreur/ce que je ne fais mal avec mv.visitMethodInsn()?

EDIT: J'ai remarqué que cela fonctionnait avec -noverify (mais toutes les chaînes sont inversées). Que puis-je faire pour le faire fonctionner sans cela?

+0

Quels problèmes rencontrez-vous? Sans message d'erreur, il est très difficile de dire ce qui ne va pas. – Antimony

+0

Il me donne une erreur de bytecode. Si vous le décompilez, vous pouvez voir l'erreur – GraxCode

+0

L'avez-vous fait manuellement et avez-vous comparé le bytecode? Il devrait être assez évident ce qui doit changer après que vous fassiez ceci. –

Répondre

1

Il est difficile de dire exactement ce qui ne va pas sans aucune information sur les erreurs ou les problèmes que vous rencontrez. Cependant, il y a une erreur que je remarqué:

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

Dans ce code, vous avez oublié de créer réellement le StringBuilder que vous utilisez. Vous devrez insérer une instruction new et invokespecial pour créer un nouveau StringBuilder.

Sur une note de côté, l'appel d'ajout n'est pas nécessaire. Vous pouvez passer une chaîne directement au ctor de StringBuilder.

+0

Édité cela, ne fonctionne toujours pas. Même erreur, comme avant. – GraxCode

+1

@GraxCode Quelle est l'erreur? Vous n'avez même pas fourni le message d'erreur, et encore moins une copie du classfile. Aussi, s'il vous plaît poster votre code mis à jour. – Antimony

+1

Passer 'true' comme argument du dernier paramètre, affirmant que le type du propriétaire (' java/lang/StringBuilder') était une 'interface' n'aide pas non plus ... – Holger