2016-04-10 13 views
-2

jarのすべての文字列を逆順にして同じことを繰り返すプログラムを作って、文字列の難読化のようにしました。例えば、 。Java reverse ASMのあるJar内のすべての文字列

ノーマルコード:new String(new StringBuilder().append("elpmaxe").reverse().toString()

マイコード:実行した後new String("example");

(ASM 5.0.4を使用して)

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

私のミスです/私は何をしましたmv.visitMethodInsn()で間違っていますか?

編集:私は気づいた、それは-noverifyで働いています(しかし、すべての文字列は逆です)。私がそれなしでそれを働かせるために私は何ができますか?

+0

どの問題が発生していますか?エラーメッセージがなければ、何が間違っているかを伝えるのは非常に難しいです。 – Antimony

+0

バイトコードエラーです。それを逆コンパイルすると、エラーが表示されます – GraxCode

+0

手動でこれを行い、バイトコードを比較しましたか?これをした後に何が変わる必要があるのか​​ははっきりしているはずです。 –

答えて

1

発生したエラーや問題に関する情報がないと、何が間違っているかを正確に伝えるのは難しいです。しかし、私は気づいた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を作成するのを忘れました。新しいStringBuilderを作成するには、newおよびinvokespecial命令を挿入する必要があります。

追加メモでは、追加呼び出しは不要です。 StringBuilderのctorに直接文字列を渡すことができます。

+0

それを編集してもまだ動作しません。以前と同じエラーです。 – GraxCode

+1

@GraxCodeエラーは何ですか?あなたは、クラスファイルのコピーだけでなく、エラーメッセージも提供していません。また、更新されたコードを投稿してください。 – Antimony

+1

所有者の型( 'java/lang/StringBuilder')が' interface'だったと主張して、最後の引数として 'true'を渡すと、どちらも助けになりません... – Holger

関連する問題