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?
Hangi sorunları yaşıyorsunuz? Bir hata mesajı olmadan, neyin yanlış olduğunu söylemek çok zor. – Antimony
Bana bir bytecode hatası veriyor. Eğer onu koda dönüştürürseniz, – GraxCode
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ı. –