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?
Quels problèmes rencontrez-vous? Sans message d'erreur, il est très difficile de dire ce qui ne va pas. – Antimony
Il me donne une erreur de bytecode. Si vous le décompilez, vous pouvez voir l'erreur – GraxCode
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. –