简单实用的反编译技巧

来源:互联网 发布:spss数据转换正态分布 编辑:程序博客网 时间:2024/06/01 09:47

前言:本文结合实际项目案例,介绍修改jar包源码的方式。(其中运用了一些小技巧~)
正文:
场景:
在项目中用了第三方的jar包,但是jar包某个类的成员变量是private的,想将其改为public属性,以便为其赋值(源码中没有其提供简单的set方法)
问题:如下图中,源码虽然可以阅读,但是根本无法进行修改。
这里写图片描述
基本思路:
编写修改好的java文件–>编译该java文件为class文件–>解压jar包–>找打待修改文件的class文件并将其替换–>压缩源码文件,并改为jar后缀格式。
那么这一整个流程下来,理论上就可以修改源码了。
实际操作:
第一次尝试(结果失败):将待修改的文件代码拷贝出来,放入到txt文档中,然后修改txt后缀为java。接着打开cmd使用javac 命令对该java文件进行编译。然后就会发现代码中引用的包找不到的错误。第一次尝试到此结束。
这里写图片描述
第二次尝试(结果成功):
上面方法肯定是不行的,因为该文件中引用了外部文件,只编译一个java文件肯定是不行。但是也不可能将其引用的文件都拷贝出来,毕竟其他文件也引用了别的文件,否则就会将整个jar包中的文件都复制出来了。
那有没有别的方法能够获得到修改后的java代码编译后的class文件呢?其实是有的!这里有个小技巧,就可以超简单的做的!
在本工程中新建一个java,与待修改的源文件同名。并且将源码中的代码拷贝在该新的java文件中,在新的文件中修改你想修改的类容(因为新文件时自己创建的,所以可以为所欲为的进行修改),然后你会发现在新的java代码中只会用一行代码错误,就是包名路径错误。
这里写图片描述
这是当然的,因为在jar包中该文件所在包中的位置和我们新建的文件在包中所在的位置是不一样的。当然我们不能将新文件的包名路径改掉,否则就算将该文件编译成功,放在jar中也是没用的。
那么既然如此,我们为何不新建一个包,使其满足该文件所需的包名路径呢?
例如上图中,源码文件中导的包名路径是com.android.pc.ioc.app。我们就在项目中新建这些包,然后将该新的java文件放置其中即可。
这里写图片描述
我们可以看到这时候,新的java文件就没有导包上的错误了。
这里写图片描述
接下来的工作就简单了,利用编译器将整个工程编译。自然就可以获得到新java文件的class文件!
这里写图片描述
然后我们就可以回到刚才的主线上了:
编写修改好的java文件–>编译该java文件为class文件–>解压jar包–>找打待修改文件的class文件并将其替换–>压缩源码文件,并改为jar后缀格式。
随后解压该jar包,替换目标class文件,再次压缩回为jar文件即可!大功告成!
(Tips,在最后一步,压缩为jar文件时要选中两项文件后右键压缩,否则导入到工程后会出现包名找不到的错误,也不能在图中文件夹外部文件夹进行压缩,至于压缩jar包的文件名就没什么要求,可以随意取)
这里写图片描述

总结:本文中的描述方法的关键就是在编译器下通过新建包名对目标文件进行编译。

原创粉丝点击