前情概要

有一个 springboot 的 jar 包,在没有源码的前提下,如何对其中的代码进行修改呢?比如说该 jar 包中有一些校验加密等的逻辑,需要去掉这段代码。

思路分析

  1. 将 jar 包解压,找到相应的代码 class 文件
  2. 将 class 文件反编译后,对源码进行修改
  3. 将修改后的源码重新编译为 class 文件
  4. 将解压包中的 class 文件替换
  5. 将解压包重新打为 springboot jar 包

详细步骤

解压 jar 包

jar -xf xxx.jar
输入如上命令以后,即可解压 jar 包,解压后的目录如下:
vzb3ffc1.nue.png

  • BOOF-INF:存放项目本身的 class 文件和 lib 外部 jar 包依赖
  • META-INF: JAR 文件的标准目录,用于存放元数据信息。例如启动的主清单信息,maven 信息等。核心文件为 MANIFEST. MF
  • org:springboot 专属的启动 loader。对于 springboot 项目很重要。

反编译 class 文件

利用 idea,jadx 等反编译工具,将 class 文件反编译。然后将代码拷贝出来,进行对应的修改。这步根据实际需求修改。

重新编译源码

将上述改完的 java 文件,例如 Test.java 重新编译为 class 文件。这步需要注意,如果该文件有依赖外部的一些包,需要在编译时指定外部依赖。这里可以指定整个原项目的 lib 目录为依赖,命令如下:
javac -cp "./BOOT-INF/lib/*:." Test.java
生成 class 文件 Test.class

替换原 class

这步没啥好说的,直接将新生成的 class 文件复制粘贴覆盖原来即可

重新打包为 jar

这一步需要将解压后的所有文件重新打包成可执行的 jar 包。
注意事项如下:
默认的 jar cvfm 命令会压缩 jar 包,而Spring Boot要求所有嵌套JAR文件都必须以存储模式(而不是压缩模式)存储。需要确保在重新打包时,所有嵌套JAR文件都没有被压缩。
命令如下:
jar -cfm0 xxx.jar META-INF/MANIFEST.MF .

总结

按上述步骤,就可以替换 jar 包中的指定 class 文件了。