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

本文讲述了如何处理一个软件的bug,通过反编译jar包,定位到需要修改的函数返回值。由于反编译后的代码依赖关系复杂,无法直接修改,于是采用直接修改class文件字节码的方法。通过查找并修改方法内的bipush指令,将返回值从17改为18。在修改过程中遇到了class文件结构的问题和MANIFEST.MF的签名问题,最终成功修复bug并使jar包正常运行。
摘要由CSDN通过智能技术生成

今天被瑶瑶要求帮忙了

他现在用的软件里有一个bug,因为是外国的开发者,所以要求修改是很麻烦的事。要改的东西很简单,就是将一个函数里错误的返回值修改。

拿到手的有软件直接能运行的jar包。

一开始的想法比较简单,就想直接反编译代码,然后修改后重新打包,使用的是一直比较钟爱的jd-gui。

不过之后发现没有那么简单,由于这个软件功能比较多,代码比较繁琐,反编译之后代码依赖关系大量的报错,想要将所有报错都修改好再重新打包几乎是不可能的,只能放弃。

然后瑶瑶告诉我,他之前已经定位到了有bug的方法,只要修改一下某个方法的返回值就可以了。

按照他说的位置我找到了那个方法,的确只是一个返回值要修改。

于是开始在网上寻找修改class文件的方法,在很多文章中找到了使用jclasslib查看变量在class内位置然后修改字节码的方法。

打开要修改的文件,定位到那个方法:

aefe7a1efa68203d138bdcfaf24a33f5.png

要将bipush的返回值从17修改成18 。

不过麻烦来了,文章中都是修改变量的,比如1行的#131这种,而这个位置是方法内直接返回int数值,需要直接修改方法的定义

在查看org.gjt.jclasslib的API无果后(很可能是我自己没有找到),开始找class文件结构,想定位到相应method定义的位置。

最后通过搜索返回值“17”的16进制值和bipush操作码的对应id找到了对应的位置。将【11】修改为【12】。

0c52e46977aba6a0203e3b3f4f548283.png

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改好了,完成!

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值