我的情况如下:
只有服务器一个class文件,里面限制了一些文件上传大小,我还想改几个字符串常量值,这个class文件里面依赖太多的外部类,没办法反编译处理,需要补的东西太多,客户关系找过来的(白嫖不给钱),没时间成本去补,只能想到直接修改class文件。
我的需求如下(为什么看到源代码了?这个是直接把.class文件拖进idea就可以看到的,如果你不用idea就下载个Bytecode-Viewer-2.9.22.jar,我下面给的下载地址也有这个jar,双击即可运行):
第一步下载需要的jar包(有资源自行别处下载,没资源我给个链接):
jclasslib-browser.jar、jclasslib-library.jar、kotlin-stdlib-1.3.70.jar、kotlin-stdlib-common-1.3.70.jar、kotlinx.dom-0.0.10.jar
下载链接:点击下载
第二步装个IDEA开发工具,创建一个java工程项目,将上述jar全部导入并做项目的依赖库,然后新建一个ChangeClassUtils.java,里面创建main方法,如下:
public static void main(String[] args) throws Exception {
//【修改点】FileUtils.class是我要修改的文件,C:\Users\Administrator\Desktop\新建文件夹是这个文件所在位置
String filePath = "C:\\Users\\Administrator\\Desktop\\新建文件夹\\FileUtils.class";
FileInputStream fis = new FileInputStream(filePath);
DataInput di = new DataInputStream(fis);
ClassFile cf = new ClassFile();
cf.read(di);
Constant[] infos = cf.getConstantPool();
int count = infos.length;
System.out.println(count);
for (int i = 0; i < count; i++) {
if (infos[i] != null) {
System.out.print(i);
System.out.print(" = ");
System.out.print(infos[i].getVerbose());
System.out.print(" = ");
System.out.println(infos[i].toString());
/* //【修改点】这里是要修改的位置点号码和字符串内容
if(i == 454){
ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];
uInfo.setString("all");
infos[i]=uInfo;
}
//【修改点】这里是要修改的位置点号码和Long值
if(i == 502){
ConstantLongInfo uInfo = (ConstantLongInfo)infos[i];
uInfo.setLong(10240000);
infos[i]=uInfo;
}*/
}
}
cf.setConstantPool(infos);
fis.close();
File f = new File(filePath);
ClassFileWriter.writeToFile(f, cf);
}
第三步运行main方法,在控制台中会看到我们要修改的所有字符列表,按ctrl+f搜索我要改的字符串,找到红框中ConstantUtf8Info类型的信息,最前面的454就是位置点,同理搜索10240找到位置点是502:
第四步就是设置修改内容,放开文章第二步代码段中唯一注释的地方并根据自己的需求修改红框处的信息:
第五步运行main方法即可修改成功: