反编译查看.class
可以使用IDEA,也可以使用jadx、jd-gui
利用jclasslib修改变量
下载地址 jclasslib/releases
写文章时用的是5.8版本,参考的文章地址是class文件直接修改_反编译修改class文件变量
不过我用的这个版本已经没有org.gjt.jclasslib.structures.CPInfo
这个包,并且看源码像是用kotlin
写的
使用步骤
- 在build.gradle中添加
plugins { id 'java' id "org.jetbrains.kotlin.jvm" version "1.4.20" }
- 代码
package test; import java.io.DataInput; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.gjt.jclasslib.io.ClassFileWriter; import org.gjt.jclasslib.structures.ClassFile; import org.gjt.jclasslib.structures.Constant; import org.gjt.jclasslib.structures.InvalidByteCodeException; import org.gjt.jclasslib.structures.constants.ConstantUtf8Info; /** * @author tsvico */ public class Client { public static void main(String[] args){ String filePath = "C:\\Users\\gwjwi\\Downloads\\xxx.class"; FileInputStream fis = null; try { fis = new FileInputStream(filePath); } catch (FileNotFoundException e) { e.printStackTrace(); } assert fis != null; DataInput di = new DataInputStream(fis); ClassFile cf = new ClassFile(); cf.read(di); Constant[] infos = cf.getConstantPool(); int count = infos.length; for (int i = 0; i < count; i++) { if (infos[i] != null) { if(i == 553){ ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i]; // uInfo.setBytes("Admin123".getBytes()); uInfo.setString("2099-12-17"); infos[i]=uInfo; } } } cf.setConstantPool(infos); try { fis.close(); } catch (IOException e) { e.printStackTrace(); } File f = new File(filePath); try { ClassFileWriter.writeToFile(f, cf); } catch (InvalidByteCodeException | IOException e) { e.printStackTrace(); } } }
重新打开字节码文件,发现修改成功。
网上看到使用jbe
可以直接修改,未能成功
利用javassist
最新地址 javassist/releases
网上有很多相关介绍和教程
这里只提供解决思路,没有具体教程,因为我要修改的是内部静态变量,所以没用这个方法。
其他
利用jd-gui.exe或者jadx打开一个jar包,另存为项目,可以看到所有的java源代码,这种方法仅供参考不建议使用,因为可能会遇到无法重新打包的问题
相关文章
修改jar包中的源码,将jar包反编译重新生成一个jar包