Java使用ASM反转Jar中的所有字符串
我试图制作一个程序,反转jar中的每个字符串,然后再次执行相同的操作,使其像字符串混淆一样。 例如 普通代码:Java使用ASM反转Jar中的所有字符串,java,reverse-engineering,bytecode,java-bytecode-asm,Java,Reverse Engineering,Bytecode,Java Bytecode Asm,我试图制作一个程序,反转jar中的每个字符串,然后再次执行相同的操作,使其像字符串混淆一样。 例如 普通代码:新字符串(“示例”) 运行后:newstring(newstringbuilder().append(“elpmaxe”).reverse().toString() 我的代码: public class Main { static String obfuscationFile; public static void main(String[] args) throws IOExcept
新字符串(“示例”)代码>
运行后:newstring(newstringbuilder().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;
}
公共类主{
静态字符串模糊文件;
公共静态void main(字符串[]args)引发IOException{
obfuscationFile=“C:\\Users\\Leonhard\\Desktop\\CrackingTools-v1.0.jar”;//待办事项:
//args[0]
文件jar=新文件(模糊文件);
Map out=JarUtil.loadNonClassEntries(jar);
Map nodes=JarUtil.loadClasses(jar);
对于(ClassNode cn:nodes.values()){
for(对象mn:cn.methods){
MethodNode mnode=(MethodNode)mn;
ClassWriter cw=新的ClassWriter(ClassWriter.COMPUTE\u MAXS);
cn.accept(cw);
if(mnode.name.startsWith(“”){
用于(整数i:反向(mnode,cw)){
//TODO:不需要。。
}
}
out.put(cn.name,cw.toByteArray());
}
}
saveAsJarAndClasses(out,nodes,jar.getAbsolutePath().replace(“.jar”,”)+“_Reverse”+“.jar”);
}
私有静态ArrayList反向(MethodNode方法,ClassWriter cw){
ArrayList i=新的ArrayList();
int e=0;
for(AbstractInNode ain:method.instructions.toArray()){
e++;
if(ain.getOpcode()==opcode.LDC){
if(LDCINSNODE的ain实例){
LdcInsnNode ldc=(LdcInsnNode)ain;
如果(ldc.cst instanceof String){
i、 加(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(新字符串[method.exceptions.size()]);
如果(mv!=null){
//mv.visitLineNumber(e,新标签());
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.visitmax(0,0);
mv.visitEnd();
//System.out.println(method.name+“”+
//方法:desc);
}
}
}
}
}
返回i;
}
(使用ASM 5.0.4)
我的错误在哪里/我对mv.visitMethodInsn()做了什么错误
编辑:我注意到,它正在使用-noverify(但所有字符串都是反向的)。如果没有它,我能做些什么才能使它正常工作?如果没有关于您遇到的错误或问题的任何信息,很难准确地说出错误。但是,我注意到一个错误:
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);
在此代码中,您忘记实际创建正在使用的StringBuilder。您需要插入new
和invokespecial
指令来创建新的StringBuilder
另一方面,追加调用是不必要的。您可以直接将字符串传递给StringBuilder的ctor。您遇到了哪些问题?如果没有错误消息,很难判断出问题所在。它会给我一个字节码错误。如果您反编译它,您会看到错误。您是否手动执行了此操作并比较了字节码?在你这样做之后,需要改变的是非常明显的。你正在遍历树API的节点,然后突然在中间开始使用访问者API。此外,在生成目标类之后,你正在操纵源类结构。谢天谢地,你用一个全新的类U覆盖每个生成的类。当遇到循环中的下一个方法时,唱一首新的ClassWriter
。换句话说,你有太多的逻辑错误,它们开始相互抵消…编辑后,仍然不起作用。和以前一样的错误。@GraxCode错误是什么?你甚至没有提供错误消息,更不用说类文件的副本了。另外,请发布更新的代码。将true
作为最后一个参数参数传递,声称所有者类型(java/lang/StringBuilder
)是接口
也没有帮助…