修改.class文件,并重新打包
使用javassist修改.class文件,并重新打包
Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果。熟练使用这套工具,可以让Java编程更接近与动态语言编程。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。Javassist下载地址 查看
1.准备jar包
用spring boot 创建了一个项目seed
用到的主要的类
package com.example.seed.common; public class Solution { public int xyz(int[] nums) { int i=0; for(int n :nums){ i+=n; } return i; } public int xyz(int[] nums, int val) { int i=0; for(int n:nums){ if(val!=n){ i+=n; } } return i; } }
mvn打包
2.修改编译后的class
导入下载的Javassist里的javassist.jar
import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; public class Main { public static void main(String[] args) { try { ClassPool pool = ClassPool.getDefault(); pool.insertClassPath("E:/java/project/mycrack/data/seed-1.0/BOOT-INF/classes") ; CtClass c2 = pool.get("com.example.seed.common.Solution"); CtMethod[] ms = c2.getDeclaredMethods(); for (CtMethod c : ms) { System.out.println(c.getName()); CtClass[] ps = c.getParameterTypes(); for (CtClass cx : ps) { System.out.println("\t" + cx.getName()); } if (c.getName().equals("xyz") && ps.length == 2 && ps[0].getName().equals("int[]") && ps[1].getName().equals("int")) { System.out.println("find it"); //c.insertBefore("{return 0;}"); c.setBody("{return 0;}"); } } c2.writeFile(); } catch (Exception e) { e.printStackTrace(); } } }
运行后会在项目根目录下生成修改后的class文件
说明:
由于Spring boot有自己的加载方式,因此现将jar包改为zip,再解压,直接设置com所在目录
将刚生成的class替换原来的class文件,压缩为zip,修改后缀为.jar
完成

更多精彩