Java打补丁修改Jar包
Java打补丁修改Jar包
Natro92前言
当时打长城杯复赛的时候不会修Jar包,解压开了后面就不会弄了,导致虽然知道怎么改代码,但是后面让人一直被打扣分,正巧这几天看到了一个相关的教程,就学习一下。这里从长城杯复赛的jar文件测试(DocToolKit)。
冷补丁修改jar包-方法一
准备反编译所需要的jar文件:
- cfr-0.152.jar 用来将class文件反编译为java文件
- 百度网盘 DocToolkit 密码:PASS 需要操作编译的jar文件
然后使用decompile.sh
脚本,批量转换class文件:
1 | !/bin/bash |
先将jar文件解压到example目录中:
1 | unzip DocToolkit-0.0.1-SNAPSHOT.jar -d example |
再将class文件放入相关目录中:
1 | mkdir -p src/main/java |
后面我们需要对src中的class文件修改,再移回example中。
我们根据硬编码进代码中的key测试一下。
正常其中的硬编码key是可以用的。
因此我们先需要修改它的key。
修改默认Key
先使用工具随便生成一个key:RGVq/DPil3pzwOkSngTz4g==
然后修改源码中的硬编码key值:src\main\java\com\example\doctoolkit\shiro\ShiroConfig.java
修改之后进行打包:
1 | CLASS_LIB=$(find example/BOOT-INF/lib/ -name "*.jar" | tr '\n' ':'); |
报错是需要对其他java文件一起编译:
1 | 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文件了。(注意时间)
重新打包
首先先替换原有的class文件:
1 | cp src/main/java/com/example/doctoolkit/shiro/ShiroConfig.class example/BOOT-INF/classes/com/example/doctoolkit/shiro/ShiroConfig.class |
然后打包,对lib中的每一个JAR文件都解压到目录中:
1 | cd example/BOOT-INF/lib |
然后再重新打包lib中Jar文件
1 | cd ../lib_unpacked |
再打包主jar文件
1 | cd .. |
运行测试新jar文件:
再测试新的key:RGVq/DPil3pzwOkSngTz4g==
新的key成功被检测出来。
冷补丁修改jar包-方法二
前面那个流程浪费了很长时间在解压和压缩jar包上。
这里用一点点简单的方法来缩短时间。
按照要求,先配置使用配置:config.py
java的绝对路径、jar包的位置。
1 | javaPath = r"D:\Workstation\Env\Java\jdk-17.0.1\bin\java.exe" #请填写java绝对路径 |
然后记得运行这个jar包Java8是不行的,我这里用Java17能运行。而且要在工作目录下创建一个target
文件夹,否则会报错。下面这样就是正常运行的结果:
然后运行main.py
即可。运行之后就生成了一个project文件夹,下面就是工作文件夹。
然后在idea中打开即可,但是这样并没有完全结束,需要进行手动配置:
- 先是配置SDK和class导出位置(项目结构-项目):SDK选择你需要的SDK,然后将输出结果设置在out文件夹下。(这个我的打开idea会自动操作)
- 设置项目代码(项目结构-模块):将
src/main/java
标记为源代码,如果没有当前模块,新建导入即可,然后按照图示将标记:
- 设置依赖库(项目结构-库):如果已经存在也不要管直接再按照下面导入就行,然后选择目标目录下的
lib
文件夹。
- 设置Jar包(项目结构-工件):添加jar包
主类选择时如果前面正常导入了的话,这里应该正常显示启动类,然后下面选择META-INF
文件目录。然后就会自动提取出jar文件:
记得应用保存,然后修改对应java文件。
还是修改shiro的key:
然后Ctrl + F9
构建项目。就发现根目录下设定好的out
文件夹。
然后将编译好的class文件:ShiroConfig.class
文件覆盖进jar包对应位置中。
修改时间变了就是已经覆盖成功。
然后运行测试一下:
key已经被成功修改。
热补丁修改jar包
这个据说用java-agent,但是现在还不会,没找到我能看懂的教程,后面再研究研究。