0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SpringBoot玩一玩代码混淆,防止反编译代码泄露

jf_ro2CN3Fa 来源:芋道源码 作者:芋道源码 2022-11-23 10:14 次阅读


编译

简单就是把代码跑一哈,然后我们的代码 .java文件 就被编译成了 .class 文件

a35b132a-6ad3-11ed-8abf-dac502259ad0.png

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

反编译

就是针对编译生成的 jar/war 包 里面的 .class 文件 逆向还原回来,可以看到你的代码写的啥。

比较常用的反编译工具 JD-GUI ,直接把编译好的jar丢进去,大部分都能反编译看到源码:

a39ec7dc-6ad3-11ed-8abf-dac502259ad0.png

那如果不想给别人反编译看自己写的代码呢?

怎么做?

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

混淆

该篇玩的代码混淆 ,是其中一种手段。

我给你看,但你反编译看到的不是真正的代码。

先看一张效果示例图 :

a3c97f68-6ad3-11ed-8abf-dac502259ad0.png

开搞

正文

先看一下我们混淆一个项目代码,要做啥?

a3ebd982-6ad3-11ed-8abf-dac502259ad0.png

一共就两步

第一步, 在项目路径下,新增一份文件 proguard.cfg :

proguard.cfg

#指定Java的版本
-target1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptimize
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#对于类成员的命名的混淆采取唯一策略
-useuniqueclassmembernames
#混淆时不生成大小写混合的类名,默认是可以大小写混合
-dontusemixedcaseclassnames
#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代
-adaptclassstrings

#对异常、注解信息予以保留
-keepattributesExceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
#此选项将保存接口中的所有原始名称(不混淆)-->
-keepnamesinterface**{*;}
#此选项将保存所有软件包中的所有原始接口文件(不进行混淆)
#-keepinterface*extends*{*;}
#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数
-keepparameternames
#保留枚举成员及方法
-keepclassmembersenum*{*;}
#不混淆所有类,保存原始定义的注释-
-keepclassmembersclass*{
@org.springframework.context.annotation.Bean*;
@org.springframework.beans.factory.annotation.Autowired*;
@org.springframework.beans.factory.annotation.Value*;
@org.springframework.stereotype.Service*;
@org.springframework.stereotype.Component*;
}

#忽略warn消息
-ignorewarnings
#忽略note消息
-dontnote
#打印配置信息
-printconfiguration
-keeppublicclasscom.example.myproguarddemo.MyproguarddemoApplication{
publicstaticvoidmain(java.lang.String[]);
}

注意点:

a4092028-6ad3-11ed-8abf-dac502259ad0.png

其余的看注释,可以配置哪些类不参与混淆,哪些枚举保留,哪些方法名不混淆等等。

第二步,在pom文件上 加入proguard 混淆插件 :

build标签里面改动加入一下配置

<build>
<plugins>
<plugin>
<groupId>com.github.wvengengroupId>
<artifactId>proguard-maven-pluginartifactId>
<version>2.6.0version>
<executions>

<execution>
<phase>packagephase>
<goals>
<goal>proguardgoal>
goals>
execution>
executions>
<configuration>

<injar>${project.build.finalName}.jarinjar>

<outjar>${project.build.finalName}.jaroutjar>

<obfuscate>trueobfuscate>

<proguardInclude>${project.basedir}/proguard.cfgproguardInclude>

<libs>
<lib>${java.home}/lib/rt.jarlib>
<lib>${java.home}/lib/jce.jarlib>
<lib>${java.home}/lib/jsse.jarlib>
libs>

<inLibsFilter>!META-INF/**,!META-INF/versions/9/**.classinLibsFilter>

<outputDirectory>${project.basedir}/targetoutputDirectory>

<options>

options>
configuration>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
<configuration>
<mainClass>com.example.myproguarddemo.MyproguarddemoApplicationmainClass>
configuration>
execution>
executions>
plugin>
plugins>
build>

注意点:

a426238a-6ad3-11ed-8abf-dac502259ad0.pnga443bbd4-6ad3-11ed-8abf-dac502259ad0.png

然后可以看到:

a45c2b24-6ad3-11ed-8abf-dac502259ad0.png

然后点击package,正常执行编译打包流程就可以 :

a473ce1e-6ad3-11ed-8abf-dac502259ad0.png

然后可以看到jar的生成:

a49a9878-6ad3-11ed-8abf-dac502259ad0.png

看看效果:

a4ba91b4-6ad3-11ed-8abf-dac502259ad0.png

好了,该篇就到这。



审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104741
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68589
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14341
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32869
  • SpringBoot
    +关注

    关注

    0

    文章

    173

    浏览量

    177

原文标题:SpringBoot 玩一玩代码混淆,防止反编译代码泄露

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开箱+环境搭建 终于会用HAL框架了,环境搭建成了!

    【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开箱+环境搭建终于会用HAL框架了,环境搭建成了! 粗心的我把RASC中设置成32脚芯片, 在KEIL中设置成了同名64脚芯片, 所以烧不进代码, 终于解决了问题,
    发表于 11-01 13:18

    苹果下代Mac mini代码泄露:五端口设计成焦点

    9月17日,国际媒体发布消息称,苹果公司在其软件中的代码更新中,不慎泄露了备受期待的下代Mac mini的关键细节。此次泄露由MacR
    的头像 发表于 09-18 16:21 732次阅读

    代码整洁之道-大师眼中的整洁代码是什么样

    几个月前写了篇文章“如何写出难以维护的代码”,从中能大概了解到不好维护的代码是什么样,有哪些坏味道,那肯定有人会反问,难以维护的代码见的太多了,也知道长什么样,但是对于好维护的
    的头像 发表于 09-09 16:30 340次阅读
    <b class='flag-5'>代码</b>整洁之道-大师眼中的整洁<b class='flag-5'>代码</b>是什么样

    java反编译能拿到源码吗

    Java反编译种将编译后的Java字节码(.class文件)转换回Java源代码的过程。虽然反编译可以帮助理解
    的头像 发表于 09-02 11:03 1001次阅读

    java反编译代码可以修改么

    Java反编译种将编译后的Java字节码(.class文件)转换回源代码的过程。反编译后的代码
    的头像 发表于 09-02 11:00 675次阅读

    ida反编译出来代码能直接用吗

    IDA反编译出来的代码通常 不能直接使用 ,这主要基于以下几个方面的原因: 代码的不完整性 IDA反编译生成的
    的头像 发表于 09-02 10:55 666次阅读

    hex文件如何查看原c语言代码

    直接将 .hex 文件转换回原始的 C 语言代码是不可能的,因为 .hex 文件是二进制文件,它包含了单片机程序编译后的机器码,这些机器码与原始的 C 语言代码在结构和表达上存在巨大的差异。机器码
    的头像 发表于 09-02 10:37 2257次阅读

    《黑神话:悟空》,除了“官配”硬件还需要注意这些......

    《黑神话:悟空》,除了“官配”硬件还需要注意这些......
    的头像 发表于 08-30 14:58 445次阅读
    畅<b class='flag-5'>玩</b>《黑神话:悟空》,除了“官配”硬件还需要注意这些......

    linux驱动程序的编译方法是什么

    Linux驱动程序的编译方法主要包括两种: 与内核编译编译成独立的内核模块 。以下是对这两种方法的介绍: 、与内核
    的头像 发表于 08-30 14:46 572次阅读

    LKT(LCS)代码移植芯片优势

    所谓代码移植就是客户可以把自定义的程序部分关键代码函数移植到加密芯片中运行。用户采用标准C语言编写代码,通过KEIL C编译器,
    的头像 发表于 08-22 10:03 770次阅读

    如何用代码在运行的时候设置程序防止被读出?

    如何用代码在运行的时候设置程序防止被读出
    发表于 06-03 07:24

    招掌握C语言代码如何变成bin文件?

    、关键步骤将单片机的源代码转换成二进制文件(bin文件)的过程涉及几个关键步骤,这些步骤是编译过程中的标准组成部分,主要包括以下步骤:预处理、编译、汇编、链接、二进制转换。01预处理
    的头像 发表于 04-13 08:10 3238次阅读
    <b class='flag-5'>一</b>招掌握C语言<b class='flag-5'>代码</b>如何变成bin文件?

    OpenHarmony 移植:build lite 编译构建过程

    配置完毕产品解决方案、芯片开发板解决方案,就可以执行 hb build 进行编译。但是产品解决方案代码是如何被调用编译的? 芯片开发板解决方案代码是如何被调用
    的头像 发表于 02-19 16:19 953次阅读

    g代码和m代码表示什么功能

    G代码和M代码是数控机床程序中常用的两种指令代码,用于控制数控机床的工作动作和运动方式。 G代码是指控制机床工作动作的指令代码,它是
    的头像 发表于 02-14 15:49 4325次阅读

    更快的tsv解析代码分享

    使用正则解析的正则表达式很简单, 这里直接给代码, 为了避免重复编译正则表达式和重新分配内存报错结果列表, 这里将她们作为参数传给解析函数.
    的头像 发表于 12-29 09:45 432次阅读
    更快的tsv解析<b class='flag-5'>代码</b>分享