Java修改jar包class文件小记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java修改jar包class文件小记相关的知识,希望对你有一定的参考价值。
今天被瑶瑶要求帮忙了
他现在用的软件里有一个bug,因为是外国的开发者,所以要求修改是很麻烦的事。要改的东西很简单,就是将一个函数里错误的返回值修改。
拿到手的有软件直接能运行的jar包。
一开始的想法比较简单,就想直接反编译代码,然后修改后重新打包,使用的是一直比较钟爱的jd-gui。
不过之后发现没有那么简单,由于这个软件功能比较多,代码比较繁琐,反编译之后代码依赖关系大量的报错,想要将所有报错都修改好再重新打包几乎是不可能的,只能放弃。
然后瑶瑶告诉我,他之前已经定位到了有bug的方法,只要修改一下某个方法的返回值就可以了。
按照他说的位置我找到了那个方法,的确只是一个返回值要修改。
于是开始在网上寻找修改class文件的方法,在很多文章中找到了使用jclasslib查看变量在class内位置然后修改字节码的方法。
打开要修改的文件,定位到那个方法:
要将bipush的返回值从17修改成18 。
不过麻烦来了,文章中都是修改变量的,比如1行的#131这种,而这个位置是方法内直接返回int数值,需要直接修改方法的定义
在查看org.gjt.jclasslib的API无果后(很可能是我自己没有找到),开始找class文件结构,想定位到相应method定义的位置。
最后通过搜索返回值“17”的16进制值和bipush操作码的对应id找到了对应的位置。将【11】修改为【12】。
bipush的对应数值是0x10,ireturn的对应数值是0xAC,再继续对比前后的位置码都能对应上,于是将10后的11修改为12后,保存。
(截图是修改后的文件)
保存后将class覆盖回jar包,发现双击无法运行。
在命令行运行java -jar xxx.jar,发现报错"java.lang.securityexception",继续到网上搜索解决办法,需要删除META-INF中,除了MANIFEST.MF和SERVER.RSA的内容。
打开MANIFEST.MF发现里面是所有类的SHA-256加密后的串,因为那个类文件被我修改导致串对不上才会报错。
将MANIFEST.MF内Main-Class: xxx.xxx.xxx.Main下面的内容删除(需要留一个空行,否则会提示“没有主清单属性!”)。
再次运行jar包,成功!
把jar包发给瑶瑶,得到的反馈是可以运行,bug改好了,完成!
以上是关于Java修改jar包class文件小记的主要内容,如果未能解决你的问题,请参考以下文章