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で働いています(しかし、すべての文字列は逆です)。私がそれなしでそれを働かせるために私は何ができますか?
どの問題が発生していますか?エラーメッセージがなければ、何が間違っているかを伝えるのは非常に難しいです。 – Antimony
バイトコードエラーです。それを逆コンパイルすると、エラーが表示されます – GraxCode
手動でこれを行い、バイトコードを比較しましたか?これをした後に何が変わる必要があるのかははっきりしているはずです。 –