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?
Welche Probleme haben Sie? Ohne eine Fehlermeldung ist es sehr schwierig zu sagen, was falsch ist. – Antimony
Es gibt mir einen Bytecode-Fehler. Wenn Sie es dekompilieren, können Sie den Fehler sehen – GraxCode
Haben Sie dies manuell getan und den Bytecode verglichen? Es sollte ziemlich offensichtlich sein, was sich ändern muss, nachdem Sie dies getan haben. –