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

    文章

    2953

    浏览量

    104504
  • 代码
    +关注

    关注

    30

    文章

    4732

    浏览量

    68273
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14298
  • 编译
    +关注

    关注

    0

    文章

    650

    浏览量

    32784
  • SpringBoot
    +关注

    关注

    0

    文章

    173

    浏览量

    164

原文标题: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 665次阅读

    java反编译能拿到源码吗

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

    java反编译代码可以修改么

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

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

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

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

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

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

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

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

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

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

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

    JavaScript压缩、混淆和加密技术原理解析

    前端代码都是公开的,为了提高代码的破解成本、保证JS代码里的些重要逻辑不被居心叵测的人利用,需要使用些加密和
    的头像 发表于 12-26 09:41 2833次阅读
    JavaScript压缩、<b class='flag-5'>混淆</b>和加密技术原理解析

    Android编译优化之混淆配置

    为了使用java8及后续java新版本的特性,Google增加了编译过程—脱糖(desugaring),但这步会导致更长的编译时间,这也是为什么Google会推出D8和R8
    的头像 发表于 12-21 09:21 1977次阅读
    Android<b class='flag-5'>编译</b>优化之<b class='flag-5'>混淆</b>配置

    SpringBoot项目Jar包加密防止反编译方案

    最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译
    的头像 发表于 12-12 14:04 1228次阅读
    <b class='flag-5'>SpringBoot</b>项目Jar包加密<b class='flag-5'>防止</b><b class='flag-5'>反编译</b>方案

    python如何换行而不运行代码

    和可读性。 在Python中,可以使用两个主要的方法进行换行:使用反斜杠()和使用圆括号(())。 第种方式是使用反斜杠()来表示换行。在Python中,反斜杠是个转义字符,它可以用于将
    的头像 发表于 11-24 09:50 3059次阅读

    python怎样运行代码

    讨论Python代码的运行方式,包括解释器、交互式环境和命令行。 Python代码可以通过两种主要的方式运行:解释执行和编译执行。解释执行是指将源代码逐行解释为机器
    的头像 发表于 11-22 10:31 1134次阅读

    devc怎么注释掉代码

    在DevC中,要注释掉代码,你可以使用注释符号来标记这段代码。注释符号的作用是告诉编译器不要编译这些
    的头像 发表于 11-22 10:23 2341次阅读