java通过JByteMod-1.8.2修改jar包中的源码并重新保存jar

      刚接手了一个新项目,项目中的很多功能是通过引入第三方jar包来实现功能的,由于业务需要,要修改jar包中的源码才能实现所期望的功能,我先说一下我采用过的方法:

      1.第一种是将jar包中需要修改的类文件反编译,修改后再编译成class文件重新打包。这种方式对我不可用,原因是我要修改的类文件大量引用了其他jar包中的类,这样一来为了修改一个类,你得把所有涉及到的其他类都得拿过来一起编译,太复杂不可行。最关键的一点是:我所需要修改的源码是混淆过的,变量和方法都是a、b、c这样的字母,很难还原。

      2.第二种是使用jclasslib结合Bytecode Viewer来修改class文件;Bytecode Viewer是二进制查看器,可以打开class文件观看jvm字节码信息,jclasslib是一个开源的字节码查看、修改工具,除此之外还有asm工具等,通过Bytecode Viewer中显示的方法中的索引号从而定位到对应的常量池存放处,但是网上都是对某个变量进行替换这种简单的操作,我要修改的逻辑比较复杂,比如删除某个方法中的大部分逻辑,只留一个return 返回值。门槛较高,所以放弃此种方式

     3.第三种是使用Android中的dex2jar工具,c将jar转成dex文件,再将dex文件转成smail文件,修改完再依次反向转回jar包,我试了没成功,可能我没找对方法,放弃此种方式

     4.第四种是使用jbe,全称是Java Bytecode Editor,Java二进制编译器,它可以在直接查看class文件的字节码信息并修改保存。不过要注意jbe很久没人维护了,只支持jdk1.5及以下版本运行环境,高于1.5会报错。我特地安装了jdk1.5发现还是报错,原因是代码经过混淆,而且jbe需要再编译一次,且不说修改的类中大量引用到了其他jar,只说混淆的变量无法识别就已经编译不过去了,放弃此种方式

     5.第五种是根据类加载器原理,在自己的代码结构中新建一个与所要修改的类包名路径一模一样、类名一模一样的类,然后将所要修改的类中的代码全部复制过来,修改具体某个代码块,这样编译器就会走这个类的逻辑,而不会走jar包中的那个了;我的情况是由于代码经过混淆,变量无法还原,粘贴过来全是冒红找不到变量的定义,放弃此种方式

     6.最后找到了一个神器:JByteMod,目前最新版本JByteMod-1.8.2。支持jdk1.8。打开长这样:

       把要修改的类文件所在的jar直接拖到左边的框中,找到自己要修改的方法如下:

 

      右边editor栏目中的字节码信息就是该方法的业务逻辑,因为我只需要让他保留一个return返回值,所以ireturn前面的全删掉,全选中右边的所有行,右键移除全部, 然后左上角“文件”选择“保存”就改好了,注意运行这个工具的时候,jre运行环境一定要与项目的运行环境一致,我的项目用的是jdk1.7,我运行这个工具时用的是jdk1.8,结果修改完保存后,放到项目里启动报这个错:java.lang.ClassFormatError: Invalid pc in LineNumberTable in class file ...;所以jdk和jre自始至终一定要保持一致,否则不兼容,因为高版本的字节码信息再低版本上不认识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值