java, 代码混淆, 编译, 反编译

本文是向大家介绍java后端小知识,它能够实现编译后的class代码加密,能够避免使用反编译工具获取源码。


本文介绍java代码编译成class后,怎么避免用反编译工具获取源码。

编译

简单先看一下java源码

反编译

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

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

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

怎么做?

混淆

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

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

先看一张效果示例图 :

开搞

正文

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

一共就两步

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

proguard.cfg

#指定Java的版本

-target 1.8

#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等

-dontshrink

#是否关闭字节码级别的优化,如果不开启则设置如下配置

-dontoptimize

#混淆时不生成大小写混合的类名,默认是可以大小写混合

-dontusemixedcaseclassnames

# 对于类成员的命名的混淆采取唯一策略

-useuniqueclassmembernames

#混淆时不生成大小写混合的类名,默认是可以大小写混合

-dontusemixedcaseclassnames

#混淆类名之后,对使用Class.forName('className')之类的地方进行相应替代

-adaptclassstrings

#对异常、注解信息予以保留

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

# 此选项将保存接口中的所有原始名称(不混淆)-->

-keepnames interface ** { *; }

# 此选项将保存所有软件包中的所有原始接口文件(不进行混淆)

#-keep interface * extends * { *; }

#保留参数名,因为控制器,或者Mybatis等接口的参数如果混淆会导致无法接受参数,xml文件找不到参数

-keepparameternames

# 保留枚举成员及方法

-keepclassmembers enum * { *; }

# 不混淆所有类,保存原始定义的注释-

-keepclassmembers class * {

@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

-keep public class com.gaoyang.proguard.demo.myproguard.MyproguardApplication {

public static void main(java.lang.String[]);

}

注意点:

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

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

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

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.8.1</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

<encoding>UTF-8</encoding>

</configuration>

</plugin>

<plugin>

<groupId>com.github.wvengen</groupId>

<artifactId>proguard-maven-plugin</artifactId>

<version>2.6.0</version>

<executions>

<!-- 以下配置说明执行mvn的package命令时候,会执行proguard-->

<execution>

<phase>package</phase>

<goals>

<goal>proguard</goal>

</goals>

</execution>

</executions>

<configuration>

<!-- 就是输入Jar的名称,我们要知道,代码混淆其实是将一个原始的jar,生成一个混淆后的jar,那么就会有输入输出。 -->

<injar>${project.build.finalName}.jar</injar>

<!-- 输出jar名称,输入输出jar同名的时候就是覆盖,也是比较常用的配置。 -->

<outjar>${project.build.finalName}.jar</outjar>

<!-- 是否混淆 默认是true -->

<obfuscate>true</obfuscate>

<!-- 配置一个文件,通常叫做proguard.cfg,该文件主要是配置options选项,也就是说使用proguard.cfg那么options下的所有内容都可以移到proguard.cfg中 -->

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

<!-- 额外的jar包,通常是项目编译所需要的jar -->

<libs>

<lib>${java.home}/lib/rt.jar</lib>

<lib>${java.home}/lib/jce.jar</lib>

<lib>${java.home}/lib/jsse.jar</lib>

</libs>

<!-- 对输入jar进行过滤比如,如下配置就是对META-INFO文件不处理。 -->

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

<!-- 这是输出路径配置,但是要注意这个路径必须要包括injar标签填写的jar -->

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

<!--这里特别重要,此处主要是配置混淆的一些细节选项,比如哪些类不需要混淆,哪些需要混淆-->

<options>

<!-- 可以在此处写option标签配置,不过我上面使用了proguardInclude,故而我更喜欢在proguard.cfg中配置 -->

</options>

</configuration>

</plugin>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

<executions>

<execution>

<goals>

<goal>repackage</goal>

</goals>

<configuration>

<mainClass>com.example.myproguarddemo.MyproguarddemoApplication</mainClass>

</configuration>

</execution>

</executions>

</plugin>

</plugins>

</build>

注意点:

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

然后可以看到jar的生成:

看看效果:

小伙伴们,如果感觉这篇文章还有点用处,多多点赞哦,爱你呦,比心!

Java后端知识之代码混淆-避免反编译工具获取原码相关推荐

  1. 给大家推荐一个.Net的混淆防反编译工具ConfuserEx

    给大家推荐一个.Net的混淆防反编译工具ConfuserEx. 由于项目中要用到.Net的混淆防反编译工具. 在网上找了很多.Net混淆或混淆防反编译工具,如.NET Reactor.Dotfusca ...

  2. springboot项目代码混淆和反编译教程·附软件连接

    对springboot项目进行代码混淆,可以防止别人通过反编译项目查看代码,即使反编译了查看的也是混淆后的看不懂的代码. 一定程度保证了项目源码安全性. 下面分享代码混淆步骤和反编译操作 Allato ...

  3. 免费的.NET混淆和反编译工具

    免费的.NET代码混淆工具: Eazfuscator.NET  http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.as ...

  4. Android代码混淆及反编译

    概述: 如果你目前还是一名学生或是没有在应用商店中上传过应用,恐怕对此的感受不深.而在企业中对Java代码的混淆却是一步很重要的步骤,从安全的角度来说,代码混淆,防止居心不良的人对代码进行恶意篡改非常 ...

  5. Android代码混淆及反编译apk

    序言: 经常听开发提起代码混淆引起的BUG,混淆后在测试一下有没有问题,那问题来了什么是代码混淆,怎么确认代码混淆成功了,带着问题读下文吧~~ 一.代码混淆的原理 代码混淆是将程序中的代码,等价转换为 ...

  6. 微信小程序源代码丢失怎么办?通过反编译工具获取微信小程序源码

    1. 安装nodejs环境 https://nodejs.org/zh-cn/ 2. 下载编译脚本 链接: https://pan.baidu.com/s/1xskmRTV4Ou80c8ZTCNowi ...

  7. Android反编译工具与反编译步骤及常见问题

    Android代码混淆很大程度上就是为了别人反编译我们的代码,用反编译工具也可以测试我们的代码是否混淆成功. "工欲善其事,必先利其器",先介绍一下反编译的工具: apktool. ...

  8. 反编译工具jad简单用法

    反编译工具jad简单用法 下载地址: [url]http://58.251.57.206/down1?cid=B99584EFA6154A13E5C0B273C3876BD4CC8CE672& ...

  9. Apktool|ShakaApktool 简体中文汉化版|APK反编译工具(更新)

    Apktool|ShakaApktool 简体中文汉化版|APK反编译工具 ShakaApktool源码:https://github.com/rover12421/ShakaApktool 作者:r ...

最新文章

  1. JavaScript初学者编程题(20)
  2. python-自定义@修饰符
  3. ViewState机制的解析(转自csdn)
  4. Jquery中如何获取元素的文本,值,属性和内容
  5. 动态规划应用--双11购物凑单
  6. 基础才是重中之重~通过人类的生活来学习Delegate
  7. python中的tuple_Python中的tuple元组详细介绍
  8. 顺序表中有效元素的长度_图解线性表,启动数据结构的大门,深刻理解链式存储和顺序存储!...
  9. SQL2005学习(三十二),Group by
  10. ld: warning: cannot find entry symbol _start; defaulting to 00000000080481d8
  11. nginx配置ssl证书的方法
  12. malformed utf-8 characters, possibly incorrectly encoded
  13. 【css】各个字号大小对照表
  14. 2022年茶艺师(中级)证考试及茶艺师(中级)模拟考试题库
  15. Stata | 缺失值处理标签
  16. 清远市高中计算机考试时间,2017年清远市中考体育考试安排
  17. 计算机伦理学理论分析三大思想,医学伦理学的基本理论
  18. 为cocos2d-x 添加启动数字输入法的功能
  19. C51 基本函数、中断函数和库函数的详解
  20. Kafka KSQL安装

热门文章

  1. Python爬虫实战之王者荣耀全套皮肤采集~
  2. 灵石县“灵石酸枣仁”品牌正式发布,促进产业发展 助力乡村振兴
  3. 苹果12开发者设置_苹果12怎么省电?iPhone12系列省电设置十大技巧介绍
  4. 【214情人节】低调奢华有内涵的python程序猿撒狗粮的正确姿势(附源码)
  5. 如何理解控制反转和依赖注入
  6. 去年,今年,明年...
  7. 3.1、3.0U盘或者2.0U盘,插入电脑没有显示的解决办法。
  8. 计算机配置选项在哪,台式电脑的设置在哪里打开
  9. 如何PHP给人生日祝福,简短12字 最打动人的生日祝福语
  10. js初始化时间的方法