目录

  1. 1. 前言
  2. 2. 冷补丁修改 jar 包(一)
    1. 2.1. 修改默认key
    2. 2.2. 重新打包
  3. 3. 冷补丁修改 jar 包(二)
  4. 4. war包

LOADING

第一次加载文章图片可能会花费较长时间

要不挂个梯子试试?(x

加载过慢请开启缓存 浏览器默认开启

Java修改jar包&DocToolkit fix复现

2024/6/18 AWD Java
  |     |   总文章阅读量:

前言

给长城杯半决赛线下的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就行了)

image-20240618012204750

解压 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

image-20240619003010977

后面我们需要对 src 中的 class 文件修改,再移回 example 中

先本地起一下java环境

java -jar DocToolkit-0.0.1-SNAPSHOT.jar

然后访问localhost:8080,注意这里的localhost实际的ip地址取决于起环境的终端是哪个(wsl的话需要自己看一下ip addr

然后取出我们jar包的shirokey

image-20240619002249974

测试一下

image-20240619002315399

修改默认key

先利用这个工具随机生成一个key:Iyxx0SgsspVZvsJ2E5ke3g==

image-20240619002550752

然后修改源码中的硬编码 key 值(别忘了前面要用cfr反编译):

src\main\java\com\example\doctoolkit\shiro\ShiroConfig.java

image-20240619003157137

接下来生成新的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

image-20240619003524692

此时就修改成功了

重新打包

先替换原有的 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

image-20240619004100091

image-20240619004144902

过程有点小久

然后再重新打包 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包

image-20240619005712018

重新测试密钥:Iyxx0SgsspVZvsJ2E5ke3g==

image-20240619005950967

新的key检测了出来,说明修改成功


冷补丁修改 jar 包(二)


war包

java -cvf xxx.war ./*