前言
给长城杯半决赛线下的jar包创碎很久之后想起来要学这个了,这篇文章基本上可以算是全抄参考文章的了
参考:
https://natro92.fun/posts/82174079/
冷补丁修改 jar 包(一)
准备反编译jar包需要的工具:
cfr:这里选择0.152版本(注意这个好像不能挂代理访问)http://www.benf.org/other/cfr/
附件选择长城杯半决赛的DocToolkit
批量转换class文件:(by Natro92)
decompile.sh
#!/bin/bash
# WSL运行
# 设置CFR JAR文件的路径
CFR_JAR="cfr-0.152.jar"
# 设置class文件的根目录
CLASS_ROOT="src/main/java"
# 查找所有的class文件并反编译为java文件
find $CLASS_ROOT -name "*.class" | while read class_file; do
# 获取class文件的目录和文件名
class_dir=$(dirname "$class_file")
class_name=$(basename "$class_file" .class)
echo $class_name
# 反编译class文件并将输出重定向到.java文件
java -jar $CFR_JAR "$class_file" > "$class_dir/$class_name.java"
done
先把 jar 文件解压到 example 目录(因为是com.example
)中(PS:今天才知道 wsl 的/mnt/
目录下是我们Windows主机对应的文件,而且可以用任何linux命令,这谁还用传统windows终端啊,以后直接打开文件夹执行wsl就行了)
解压 jar 包到 example 文件夹中:
unzip DocToolkit-0.0.1-SNAPSHOT.jar -d example
再将 class 文件放入相关目录中:
mkdir -p src/main/java
cp -r example/BOOT-INF/classes/* src/main/java/
然后进行反编译
sh decompile.sh
后面我们需要对 src 中的 class 文件修改,再移回 example 中
先本地起一下java环境
java -jar DocToolkit-0.0.1-SNAPSHOT.jar
然后访问localhost:8080,注意这里的localhost实际的ip地址取决于起环境的终端是哪个(wsl的话需要自己看一下ip addr
)
然后取出我们jar包的shirokey
测试一下
修改默认key
先利用这个工具随机生成一个key:Iyxx0SgsspVZvsJ2E5ke3g==
然后修改源码中的硬编码 key 值(别忘了前面要用cfr反编译):
src\main\java\com\example\doctoolkit\shiro\ShiroConfig.java
接下来生成新的class文件
CLASS_LIB=$(find example/BOOT-INF/lib/ -name "*.jar" | tr '\n' ':');
javac -cp ".:${CLASS_LIB%:}" src/main/java/com/example/doctoolkit/shiro/ShiroConfig.java src/main/java/com/example/doctoolkit/shiro/UserRealm.java src/main/java/com/example/doctoolkit/controller/admin/AdminController.java
此时就修改成功了
重新打包
先替换原有的 class 文件
cp src/main/java/com/example/doctoolkit/shiro/ShiroConfig.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/ShiroConfig.class
cp src/main/java/com/example/doctoolkit/shiro/UserRealm.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/UserRealm.class
cp src/main/java/com/example/doctoolkit/controller/admin/AdminController.class example/BOOT-INF/classes/com/example/doctoolkit/controller/admin/AdminController.class
然后打包,把 lib 中的每一个 jar 文件都解压到目录中
cd example/BOOT-INF/lib
for jar in *.jar; do
mkdir -p "../lib_unpacked/$jar"
cd "../lib_unpacked/$jar"
jar -xvf "../../lib/$jar"
cd ../../lib
done
过程有点小久
然后再重新打包 lib 中 jar 文件,依旧需要花上一点时间
cd ../lib_unpacked
for dir in *; do
jar -cvfM0 "../lib/$dir.jar" -C "$dir" .
done
再打包主 jar 文件
cd ..
cd ..
jar -cvfM0 ../example_repacked.jar -C . .
打包完成后我们运行新的jar包
重新测试密钥:Iyxx0SgsspVZvsJ2E5ke3g==
新的key检测了出来,说明修改成功
冷补丁修改 jar 包(二)
war包
java -cvf xxx.war ./*