对于java破解,直接反编译出java代码,然后改代码逻辑,再重新打包,这套流程固然清晰直接,但常常会遇到缺少依赖库、编译环境复杂等问题。还有两个思路可以处理这个问题,1.class文件爆破;2.javaagent
使用jd-gui、IDEA 等工具可以反编译jar包或者class文件。

jar包本身就是个zip文件,这里直接用7zip解压。
同样的,直接用7zip打包成zip即可完成打包,只要注意目录结构即可。


使用JavaByte.exe工具爆破class文件
添加class文件

选中Methods里的check方法

双击iconst_0,将其改为iconst_1,并保存class文件。

测试效果,You win!

使用jd-gui验证爆破效果


把0008到0016的代码直接nop掉。
(注意:使用JavaByte.exe进行nop的时候可能会使字节码变短,比如3个字节的“B8001E”变成一个字节的“00”,这里没有自动填充剩余的nop指令,有点不方便。可以通过“Add Instruction”补足剩余的nop,也可以直接通过WinHex等二进制编辑工具进行修改。)

测试效果,You win!

使用jd-gui验证爆破效果

jar包就是个zip文件,爆破class文件之后,直接使用7zip压缩成zip文件,只要保证目录结构正确即可。是否把后缀名.zip改成.jar也不会影响jar包的执行,为了保持习惯上的一致性,可以改一下。

测试打包效果

如果修改后字节码长度变短,会导致报错,所以要保证修改后的字节码长度不变,以使其余的原始字节码不发生偏移,避免报错。

(这是补充的内容,感谢guduzhe指点)
以“改if判断”举例
软件用的recaf-2.21.7-J8-jar-with-dependencies.jar,把hello.jar包拖拽进去即可反编译。
在反编译窗口选中要修改的函数main-> 右键选择"Edit with assembler"

删除if判断

Ctrl+S保存修改(保存成功后,反编译窗口的内容也会跟着修改)

导出jar包,File-> Export program

测试效果,You win!

https://bbs.pediy.com/thread-217703.htm
839K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6A6L8X3N6G2K9$3g2Y4k6h3I4Q4x3V1k6B7j5$3I4S2M7%4y4D9K9h3t1`.
c81K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2L8%4u0S2j5$3I4W2i4K6u0W2j5$3!0E0i4K6u0r3K9X3q4$3j5i4y4W2i4K6u0r3M7%4m8W2j5%4y4Q4x3V1k6B7N6X3#2K6i4K6u0r3M7$3f1I4x3g2)9J5c8X3S2@1L8h3I4Q4x3V1k6B7N6X3#2K6i4K6u0V1y4W2)9J5k6h3S2@1L8h3H3`.
422K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6o6L8$3I4Q4x3X3c8q4i4K6u0r3f1X3g2U0j5h3j5`.
d0fK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4#2N6s2m8Q4x3X3g2U0L8W2)9J5c8X3q4J5j5$3S2A6N6X3g2K6i4K6u0r3K9X3q4$3j5g2!0q4y4g2!0m8c8q4)9&6y4#2!0q4z5q4)9^5b7g2)9^5x3W2!0q4y4#2!0m8x3q4)9^5x3g2!0q4y4#2!0n7b7#2)9&6y4W2!0q4z5q4!0n7c8g2)9&6x3g2!0q4y4g2)9&6z5g2!0m8z5q4!0q4y4W2)9&6y4W2)9^5y4#2!0q4y4W2!0m8x3g2!0m8x3#2!0q4z5q4!0m8c8W2!0n7y4q4!0q4y4W2)9&6z5q4)9^5c8b7`.`.
利用javaagent动态修改方法Main.check,直接返回true
vim MANIFEST.MF
Manifest-Version: 1.0
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Premain-Class: PreMainAgent
需要注意的就一个MANIFEST.MF,然后仿照一个jar包结构用7zip压缩即可(可以直接通过拖拽的方式替换zip包里的内容)。或者直接使用maven、gradle对工程进行管理。
测试效果,You win!

6e5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2T1K9h3I4A6j5X3W2D9K9g2)9J5k6h3y4G2L8g2)9J5c8Y4k6A6k6r3g2G2i4K6u0r3b7W2j5I4e0V1x3@1P5e0q4S2y4#2l9J5i4K6y4r3M7q4)9K6c8o6t1`.
ea7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3M7X3W2U0K9$3W2&6j5h3&6Y4i4K6u0r3M7q4)9J5c8U0p5I4x3K6j5^5z5e0x3J5i4K6u0W2K9s2c8E0L8l9`.`.
17dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4N6W2K9i4S2A6L8W2)9#2k6U0b7#2y4o6V1J5x3o6l9%4i4K6u0r3j5i4u0@1K9h3y4D9k6g2)9J5c8X3c8W2N6r3q4A6L8s2y4Q4x3V1j5I4x3e0R3H3y4e0t1&6y4K6V1`.
cbcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2B7j5i4k6S2M7%4y4A6M7%4c8Q4x3X3g2G2M7X3N6Q4x3V1k6@1N6i4c8G2M7X3W2S2L8q4)9J5c8Y4c8#2N6r3!0J5K9h3q4D9i4K6u0W2K9s2c8E0L8l9`.`.
0ecK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8X3u0D9L8$3N6K6i4K6u0W2j5$3!0E0i4K6u0r3c8$3q4F1k6s2W2Q4x3V1k6H3i4K6u0r3y4K6t1&6x3o6l9$3z5g2)9J5k6h3S2@1L8h3H3`.
cd src_PreMainAgent
javac -cp .;javassist.jar PreMainAgent.java
cd src_PreMainAgent
javac -cp .;javassist.jar PreMainAgent.java
...
if(!"Main".equals(className)){
return null;
}
try{
CtClass ctClass = pool.get("Main");
CtMethod check = ctClass.getDeclaredMethod("check");
check.setBody("{return true;}");
return ctClass.toBytecode();
} catch(Exception e) {
e.printStackTrace();
}
...
...
[培训]传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-12-30 11:30
被Jtian编辑
,原因: