这俩天遇到了这样的问题,反编译JAR包之后,出现了没法再javac的问题(修改java文件再编译回去的想法泡汤),原因大概是因为JAR的发行商对其作了很多的加密混淆处理,和签名处理。
刚开始想直接将需要的class文件进行修改,发现这样一个问题,使用工具类将需要的位置字节码参数修改完之后,将修改后的文件压缩回原来的JAR,JAR不能用了。原因是当前JAR做了签名处理,其对应的
META-INF目录下有三个文件:
这三个文件都是JAR的制作者防止反编译和修改做得处理,对于其中的数字签名处理:包含SHA1加密,RSA加密算法,想破解签名是非常难的,我的想法就是怎么去破解这个JAR呢?找了很久发现网上是有方法的,去签名处理,具体怎么去下面会说。
说了这么多无非想记录一下将加密的JAR包修改对应的参数和数据,并且可以正常使用的过程。下面开始—>
《JD-GUI》是一款反编译软件,JD分为JD-GUI、JD-Eclipse两种运行方式,JD-GUI是以单独的程序的方式运行,JD-Eclipse则是以一个Eclipse插件的方式运行。百度可以下载到,如果有需要的话这些工具可以联系我发给你。
jclasslib bytecode viewer 是一个可以可视化已编译Java类文件和所包含的字节码的工具。 另外,它还提供一个库,可以让开发人员读写Java类文件和字节码。github 地址:https://github.com/ingokegel/jclasslib
这个插件是用来查看class字节码文件域的,只有找到对应的常量池、方法域、接口等的具体索引位置,才能使用强制的读写进制流的方式去修改class文件。
官网下载地址:http://dirty-joe.com/ 功能和上面你的插件一样,这个功能更强大一点,如果想修改更细节的东西,推荐使用。
使用工具类修改class文件的的某个参数,或者某个字符串。这里有一点其实在java文件中定义的各种参数,编译成字节码文件的时候,都变成了字符串,只是逻辑位置不同,处于不同的域中。在IDEA中使用jclasslib Bytecode viewer打开class文件(如图):
比如我们想修改class文件中的一串字符串,得先用jd-jui查看该字符串在那个地方,是常量还是在方法中。然后就可以在IDEA中找到对应的域,如上图中,如果在方法中就点击Methods,从上到下分别是JAVA文件由上到下的定义顺序,找到对应的方法,就能看到下图中字节码详情:
如上图找到我们需要修改的字符串,是上图右边的横线,这里需要注意了,位置找到了我们怎么修改了,这里还需要找到这个字符串的字节码位置,看绿色框框中左边有个:ldc #36,在虚拟机中,它的意思是将#36位置的常量压入到栈中,压入栈之后,位置在哪里呢,这里我们点击这里的#36,然后出现下图:
我们看到了从#36跳转到了#1049 这里我们可以清晰的看到String类型的字符串处于1049索引位置,我们再点击红色框处:
能看到字符串的长度这里我们记住这个数值1049,如果我们想将它修改为:China No.1,我们怎么办?字节码文件不能编辑,总不能修改16进制文件吧,那么答案只有一个,硬写进去,工具类如下:
大功告成,具体效果显而易见,自己可以在任何地方新建这样的java类,不过需要注意的是,这里有个工具jar包, jclasslib.jar联系我发给你,网上也有可以找找。
修改好了Class文件,就可以打包到原jar包了,正常方式的jar包,直接将class文件拖拽进去替换进好了,但是一般由公司产出的jar包肯定都做了签名,修改任何一个jar包内的文件,这个jar包都不能用了,每一个文件都对应固定的hash值计算出对应的密钥,所以只能采取暴力破解方法。
当你看到jar包的META-INF目录下有文章开始提的三个文件时,恭喜你下面可以开始去签名破解了,请看工具类:
在任何一个java类中写上以上代码,然后就可以编译了,用工具也好,用javac也好,反正编译好后再对应目录下能看到class文件。
// 使用JDK编译代码
javac XX.java
将需要去签名的jar包放到编译好的class文件的目录,或者记住jar包目录,打开DOS窗口:
// 执行XX,如果是同一个文件夹
java -cp . XX <JAR名称> <去签名之后的JAR包名称>
java -cp . XX <JAR完整路径和名称> <去签名之后的JAR包名称(默认是在当前文件夹下生成JAR)>
大功告成,这个时候就可以正常使用JAR了,下篇文章来说说java如何手动设置签名和证书。