处于种种原因,很多提供的jar包中的class都是混效过的,有些时候,可能处于参考,或者其他某些可告人,不可告人的目的,需要查看某些class的运行逻辑或者制作补丁等等什么的,就需要将class进行反编译了,在某些情况下,一些内容可能是动态的,或者想看修改之后出的效果,由于一个jar中往往有很多个class,但通过反编译,修改的可能仅仅只有一到两个文件,这样就需要将修改后的文件重新编译,添加到原始的jar中,来运行了。
我前两天刚好碰到了这个问题,在网上找java的反编译器,看到了一本关于java反编译与修复的书籍(竟然出书了),具体名字没记住,后来简单的思考一下,也不是什么太大的问题,于是制订了下计划,试试看自己的思路是否是正确的:
1、解压缩jar,获得class文件
2、反编译感兴趣的class文件
3、修改反编译后的class文件的源代码,使之没有语法问题
4、按需要修改上一步骤的源代码
5、编译单个java文件到class
7、将编译后的class重新放到jar中
jar使用的是zip的压缩算法,所以,不管是解压缩还是压缩都没有问题。
java有编译器jad,这一步也没有问题。
修改java代码,任何一款编辑器都没有问题。
修改后的代码能否进行编译?考虑到java代码都是单个单个的编译成class,这一步也没有问题。
编译后的class能否和原来的class配合很好的运行?从C/C++编译的角度来说,函数,变量等地址的整合在link的部分进行,而java没有这一部分,仅仅将class压缩成一个压缩包,从这个角度上来说,没有问题。如果class代码中地址已经固定死了?从理论上来说,这是可能的,但我觉得,这种可能性比较小,这次的测试也没有体现到这一点。改天再测试。
继续阅读一步一步:java文件的反编译与修补