前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >修改混淆过的JAVA字节码文件

修改混淆过的JAVA字节码文件

作者头像
CodeWwang
发布2022-08-24 10:18:51
1.1K0
发布2022-08-24 10:18:51
举报
文章被收录于专栏:CodeWwang

 这俩天遇到了这样的问题,反编译JAR包之后,出现了没法再javac的问题(修改java文件再编译回去的想法泡汤),原因大概是因为JAR的发行商对其作了很多的加密混淆处理,和签名处理。

 刚开始想直接将需要的class文件进行修改,发现这样一个问题,使用工具类将需要的位置字节码参数修改完之后,将修改后的文件压缩回原来的JAR,JAR不能用了。原因是当前JAR做了签名处理,其对应的

META-INF目录下有三个文件:

  1. XX.SF
  2. XX.DSA或XX.RSA
  3. XX.MF

这三个文件都是JAR的制作者防止反编译和修改做得处理,对于其中的数字签名处理:包含SHA1加密,RSA加密算法,想破解签名是非常难的,我的想法就是怎么去破解这个JAR呢?找了很久发现网上是有方法的,去签名处理,具体怎么去下面会说。

说了这么多无非想记录一下将加密的JAR包修改对应的参数和数据,并且可以正常使用的过程。下面开始—>

工具

jd-jui

《JD-GUI》是一款反编译软件,JD分为JD-GUI、JD-Eclipse两种运行方式,JD-GUI是以单独的程序的方式运行,JD-Eclipse则是以一个Eclipse插件的方式运行。百度可以下载到,如果有需要的话这些工具可以联系我发给你。

IDEA插件:jclasslib Bytecode viewer

jclasslib bytecode viewer 是一个可以可视化已编译Java类文件和所包含的字节码的工具。 另外,它还提供一个库,可以让开发人员读写Java类文件和字节码。github 地址:https://github.com/ingokegel/jclasslib

  这个插件是用来查看class字节码文件域的,只有找到对应的常量池、方法域、接口等的具体索引位置,才能使用强制的读写进制流的方式去修改class文件。

dirtyjoe

官网下载地址:http://dirty-joe.com/ 功能和上面你的插件一样,这个功能更强大一点,如果想修改更细节的东西,推荐使用。

修改class文件

 使用工具类修改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文件。

代码语言:javascript
复制
// 使用JDK编译代码 
javac XX.java 

将需要去签名的jar包放到编译好的class文件的目录,或者记住jar包目录,打开DOS窗口:

代码语言:javascript
复制
// 执行XX,如果是同一个文件夹 
java -cp . XX <JAR名称> <去签名之后的JAR包名称> 
java -cp . XX <JAR完整路径和名称> <去签名之后的JAR包名称(默认是在当前文件夹下生成JAR)> 

大功告成,这个时候就可以正常使用JAR了,下篇文章来说说java如何手动设置签名和证书。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 工具
    • jd-jui
      • IDEA插件:jclasslib Bytecode viewer
        • dirtyjoe
        • 修改class文件
        • 打包
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档