码迷,mamicode.com
首页 > 编程语言 > 详细

【Java】修改jar包class文件小记

时间:2017-07-19 19:35:29      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:修改   没有   解决   编译   今天   使用   完成   manifest   加密   

今天被瑶瑶要求帮忙了

他现在用的软件里有一个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文件小记

标签:修改   没有   解决   编译   今天   使用   完成   manifest   加密   

原文地址:http://www.cnblogs.com/otakumadoka/p/7207347.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!