反编译SpringBoot项目

2 篇文章 0 订阅

项目缺失源码(外包项目没拿到源码 -_- ),但服务器上有项目的war包,然后需要通过war包反编译出项目源码进行项目的二次开发。

思路

项目采用SpringBoot2 + MybatisPlus框架开发,pom.xml、Mapper.xml等资源文件可以直接从war包中提取,主要就是要class字节码文件反编译回java源文件,war包结构如下:

├─META-INF          # 目录存放应用打包信息(Maven坐标、pom文件)和MANIFEST.MF文件
│  ├─MANIFEST.MF  
│  ├─maven          # 这里面可以获得项目的 pom.xml 文件
├─WEB-INF
│  ├─classes        # 目录存放应用编译后的class、application.yml、mapper.xml文件
│  ├─lib            # 目录存放应用依赖的第三方JAR包文件
├─org               # 目录存放SpringBoot相关class文件
  • 首先我们创建一个空的Maven项目
  • 从war包中获取pom.xml文件替换新建项目的pom.xml文件
  • 将wat包中 WEB-INF/classes 下的静态资源文件(排除class文件)复制到新项目的 src/main/resources 目录下
  • 将class文件反编译为java源文件后复制到新项目的 src/main/java 目录下(具体操作后面介绍)
  • 编译新项目,处理maven依赖问题以及反编译代码问题

如果项目pom.xml中存在共有Maven仓库不存在的依赖时,我们可以再 wat 包中 WEB-INF/lib 目录下找到对应的jar 文件,然后发布到我们的私有Maven仓库就可以解决了。

反编译工具的选择

fernflower

参考 fernflower idea内置的反编译工具 对class 文件进行反编译,

结果发现泛型丢失,如下图:
反编译出来的Java源文件
我直接用idea(2020.2)打开class文件可以看到是有泛型的:
正确的Java源文件
可能和fernflower版本有问题,参考使用idea自带的反编译工具 [FernFlower]Java 原文件时有泛型的。

java -cp 参数1 org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true 参数2 参数3

参数说明:

  • 参数1。IDEA安装目录下的反编译插件“java-decompiler.jar”所在路径,需要加上双引号。示例:“E:\IntelliJ IDEA 2020.2.2\plugins\java-decompiler\lib\java-decompiler.jar”
  • 参数2。需要反编译的文件所在目录,不加双引号。示例:E:\exercise\reflect
  • 参数3。反编译后的文件输出目录,该目录需自己提前创建好,需要加上双引号。示例:“E:\exercise\reflect\test”
    完整命令示例:java -cp D:\JetBrains\apps\IDEA-U\ch-0\202.7660.26\plugins\java-decompiler\lib\java-decompiler.jar org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true ApiVesrsionCondition.class .

但是源文件也会存在问题:

  • 项目有使用lombok,反编译处理的Java 文件 hashCode 第一行都多了一句 “int PRIME = true;”
    在这里插入图片描述

Java Decompiler(JD-GUI)

直接通过官网下载windows版本的执行程序,直接运行
fernflower idea内置的反编译工具
默认情况下到出的java 源码会后行号信息,可以再设置中关闭。
反编译处理的Java 文件是有泛型的,但 hashCode 第一行也都多了一句 “int PRIME = true;”

反编问题

首先就是大量的 JavaBean 的 hashCode 方法多了一句 “int PRIME = true;” 会导致编译报错,需要手动处理,应为项目使用了 lombok,可以通过idea的lombok插件处理,再有问题的JavaBean源文件中右键 Refactor -> Lombok -> Default @Data。
在这里插入图片描述
源代码中存在大量的强制类型转换:

User user = (User) this.userMapper.selectById(question.getTeacherUserId()); // 多余的强制类型转换
User user = this.userMapper.selectById(question.getTeacherUserId());

通过idea 的代码分析功能全局处理:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值