2016-04-10 42 views
-2

Bir dizgideki her dizeyi tersine çeviren bir program yapmaya çalıştım ve daha sonra bir dizgi gizleme gibi olmasını sağlamak için aynısını tekrar yapmaya çalıştım. örn.Java, bir kavanoza ASM ile tüm dizgileri ters çevir

Normal Kodu: new String("example");

çalıştırdıktan sonra: new String(new StringBuilder().append("elpmaxe").reverse().toString()

Benim Kod:

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

(kullanma ASM 5.0.4)

i ne yaptın benim hatam/olduğu mv.visitMethodInsn() ile yanlış?

DÜZENLEME: Fark ettim, -noverify ile çalışıyor (ancak tüm dizeler tersine çevriliyor). Onsuz çalışmasını sağlamak için ne yapabilirim?

+0

Hangi sorunları yaşıyorsunuz? Bir hata mesajı olmadan, neyin yanlış olduğunu söylemek çok zor. – Antimony

+0

Bana bir bytecode hatası veriyor. Eğer onu koda dönüştürürseniz, – GraxCode

+0

hatasını görebilirsiniz. Bunu manuel olarak yaptınız ve bytecode'u karşılaştırdınız mı? Bunu yaptıktan sonra nelerin değişmesi gerektiği oldukça açık olmalı. –

cevap

1

Yaşadığınız hatalar veya sorunlar hakkında herhangi bir bilgi olmadan tam olarak neyin yanlış olduğunu söylemek zor. Ancak fark ettim bir hata vardır:

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

Bu kodda, gerçekte kullandığınız StringBuilder oluşturmak unuttum. Yeni bir StringBuilder oluşturmak için new ve invokespecial talimatlarını eklemeniz gerekir.

Bir yan notta, ek arama gereksizdir. Bir dizeyi doğrudan StringBuilder'ın ctoruna iletebilirsiniz.

+0

Düzenlenmiş, hala çalışmıyor. Aynı Hata, önceki gibi. – GraxCode

+1

@GraxCode Hata nedir? Hata mesajını bile vermediniz, sadece sınıf dosyasının bir kopyasını izin verin. Ayrıca, lütfen güncellenmiş kodunuzu gönderin. – Antimony

+1

Son parametre argümanı olarak "true" geçilirse, sahip tipinin ('java/lang/StringBuilder') bir' interface' olduğunu iddia etmemiştir… – Holger