jclasslib修改字节码并重打jar包

2021年9月15日 0 条评论 666 次阅读 0 人点赞

背景

北京IDC托管价格越来越贵,公司决定将机房迁移到环京地区。最近在参与公司机房迁移工作,主要负责实时计算和用户画像两个方面。用户画像任务还是很多的,在收尾阶段发现一个隐藏很深的任务,git上已经找不到源代码了,正常运行的任务只有一个jar包。尝试将jar包直接提交到新集群上,任务运行十分钟后抛出Exception,有可能代码里把HDFS的Nameservice直接写死了,需要反编译进行确认。

Java class文件反编译

支持“.class”文件反编译的工具有很多,比如IDEA、JD-GUI、Recaf等。在解决上述问题时本人首选IDEA,具体步骤如下:

  • 打开任意一个工程(建议新建),在src同级目录下建立“lib”文件夹并移动jar包到该目录

  • 右键点击lib文件夹并在弹出的选项中选择“Add as Library”

添加完成后可以看到jar已经可以支持浏览了,找到异常中提示的DumpMongoJob(Scala)并反编译成java代码:

从反编译后的文件中可以看到,HDFS的Nameservice已经写死为固定值Pink:

jclasslib修改字节码

定为具体原因后就需要对jar包中对应的.class文件进行编辑并二次打包,将jar包进行解压并将DumpMongoJob$.class加载到jclasslib bytecode viewer中:

通过查找可以定位到包含“pink”常量的字节码位置,点击编辑将“pink”改为目标集群名称最后保存即可。

编辑后替换原来的.class文件并再次打包,此时提交到集群上后发现运行正常,可以正常将数据落到HDFS上。

此外ingokegel还提供IDEA 插件版本的jclasslib bytecode viewer,插件版本的好处是不需要解压jar包和二次打包,编辑完成后直接点击保存图标即可。具体使用步骤:

  • 选中需要编辑的“.class”文件;
  • 菜单栏中选中“View”选项卡;
  • 选择“Show Bytecode With jclasslib”;

编辑完成后记得保存再退出。

参考资料

https://github.com/ingokegel/jclasslib

https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer

勇敢,和生活的艰难无关。

文章评论(0)