Я попытался создать программу, которая реверсирует каждую строку в банке, а затем сделает то же самое, чтобы сделать ее похожей на обфускацию строки. например.Java-реверс всех строк в банке с ASM
Normal Код: new String("example");
После запуска: new String(new StringBuilder().append("elpmaxe").reverse().toString()
Мой код:
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;
}
(Использование ASM 5.0.4)
Где моя ошибка/Что я сделал неправильно с mv.visitMethodInsn()?
EDIT: Я заметил, что он работает с -noverify (но все строки меняются на противоположные). Что я могу сделать, чтобы заставить его работать без него?
Какие проблемы вы испытываете? Без сообщения об ошибке очень сложно сказать, что не так. – Antimony
Это дает мне ошибку байт-кода. если вы декомпилируете его, вы увидите ошибку – GraxCode
Вы сделали это вручную и сравнили байт-код? Должно быть совершенно очевидно, что нужно изменить после этого. –