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

    文章

    2942

    浏览量

    104064
  • 代码
    +关注

    关注

    30

    文章

    4665

    浏览量

    67740
  • spring
    +关注

    关注

    0

    文章

    335

    浏览量

    14254
  • 编译
    +关注

    关注

    0

    文章

    645

    浏览量

    32659
  • SpringBoot
    +关注

    关注

    0

    文章

    172

    浏览量

    145

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

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

收藏 人收藏

    评论

    相关推荐

    java反编译能拿到源码吗

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

    java反编译代码可以修改么

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

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

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

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

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

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

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

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

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

    python怎样运行代码

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

    devc怎么注释掉代码

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

    WIN10系统网络游戏挂机频繁掉线

    WIN10系统网络游戏时正常几个小时都没事,但是只要看电视让游戏挂机就频繁掉线(几分钟到十几分钟间隔),电脑空闲休眠已关系,电源空闲已关闭。
    发表于 11-11 21:49

    SpringBoot 接口签名算法代码设计

    开放接口是指不需要登录凭证就允许被第三方系统调用的接口。为了防止开放接口被恶意调用,开放接口般都需要验签才能被调用。提供开放接口的系统下面统简称为"原系统"。
    的头像 发表于 11-07 15:11 566次阅读
    <b class='flag-5'>SpringBoot</b> 接口签名算法<b class='flag-5'>代码</b>设计

    如何用小安派小霸王游戏

    “啊哈!小霸王!其乐无穷啊!”,还记得小时候的小霸王游戏机吗?这次小安派的用户来带大家回忆起童年啦,来看看安信可社区大佬如何用小安派小霸王游戏。
    的头像 发表于 11-05 10:08 538次阅读
    如何用小安派<b class='flag-5'>玩</b>小霸王游戏

    代码中包含最新的编译时间信息

    般的来讲,代码到了测试后期,master分支就不会频繁的提交了,并且提交也会更加谨慎。
    的头像 发表于 10-25 09:58 477次阅读
    让<b class='flag-5'>代码</b>中包含最新的<b class='flag-5'>编译</b>时间信息

    如何使用valgrind对代码进行内存泄露检测

    代码可能存在 内存泄露 怎么办? 使用 valgrind 可以对代码进行内存泄露检测。 valgrind下载安装 安装: 1 、tar –jxvf valgrind- 3 . 21 .
    的头像 发表于 10-04 14:56 686次阅读
    如何使用valgrind对<b class='flag-5'>代码</b>进行内存<b class='flag-5'>泄露</b>检测

    SpringBoot 如何实现热部署

    SpringBoot 如何实现热部署? 1、热部署的优点 开发周期通常包括编写代码编译、部署和测试几个步骤。在个快速发展的项目中,这个周期需要尽可能地缩短。热部署能让开发者在
    的头像 发表于 09-30 10:16 724次阅读
    <b class='flag-5'>SpringBoot</b> 如何实现热部署

    java中的代码混淆技术

    今天和大家起学习下java中的代码混淆技术,后面你也可以让你的代码不再裸露在外了,让人轻易窥视 代码
    的头像 发表于 09-25 11:48 1334次阅读
    java中的<b class='flag-5'>代码</b><b class='flag-5'>混淆</b>技术