使用jclasslib简单修改class类

1、自行下载jclasslib,64位电脑需要下载x64的版本,并安装。

2、先用反编译工具jd-gui或能反编译的IDEA查看,推荐使用Intellij IDEA直接查看。

 

 

 3、用jclasslib打开这个class文件,并根据已知的方法在【method】进行查找

 

 

 点击【Code】打开所有的信息,并找到自己需要修改常量的地方

 

 

 4、从jclasslib的安装文件中找到 《jclasslib-library.jar》和 《kotlin-stdlib-xxx.jar》这两个jar包放入到项目中,并建一个类写main方法执行

package com.fh;

import java.io.*;

import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.Constant;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class EditClass {
    public static void main(String[] args) throws Exception {

        String filePath = "C:\\Users\\123\\Desktop\\com\\xxxx\\xxxx\\xxxx\\xxxx\\xxxx.class";
        FileInputStream fis = new FileInputStream(filePath);

        DataInput di = new DataInputStream(fis);
        ClassFile cf = new ClassFile();
        cf.read(di);
        Constant[] infoArr = cf.getConstantPool();

        int count = infoArr.length;
        for (int i = 0; i < count; i++) {
            if (infoArr[i] != null) {
                System.out.print(i);
                System.out.print(" = ");
                System.out.print(infoArr[i].getVerbose());
                System.out.print(" = ");
//                System.out.println(infoArr[i]);
                System.out.println("");

                if(i == 144){
                    System.out.println("=========此处修改==================");
                    System.out.print(i);
                    System.out.print(" = ");
                    System.out.print(infoArr[i].getVerbose());
                    System.out.print(" = ");
//                System.out.println(infoArr[i]);
                    System.out.println("");

                    ConstantUtf8Info uInfo = (ConstantUtf8Info)infoArr[i];//根据对应的类型转换
                    uInfo.setString("xxx");
                    infoArr[i] = uInfo;
                    System.out.println("=========此处修改==================");
                }
            }
        }
        cf.setConstantPool(infoArr);
        fis.close();
        File f = new File(filePath);
        ClassFileWriter.writeToFile(f, cf);
    }
}

(因最后发现本次要修改的不在常量中,最后测试走完,换了其他的常量修改,亲测有效)

 

posted @ 2023-01-25 16:29  灰灰小菜鸟  阅读(1772)  评论(0编辑  收藏  举报