使用开源工具ProGuard实现Java代码混淆

这篇具有很好参考价值的文章主要介绍了使用开源工具ProGuard实现Java代码混淆。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文档:

  1. ProGuard官网
  2. ProGuardMaven插件文档
  3. ProGuard官方配置文档
  4. ProGuard配置中文文档
  5. CSDN-ProGuard使用演示
  6. 知乎-ProGuard使用演示

一、概述

代码混淆是将计算机程序的代码转换成一种功能上等价,但是难以阅读和理解的形式。

二、常见的混淆思路

  • 符号混淆

    将函数的符号,如函数名、变量名去除或混淆。

  • 控制流混淆

    混淆程序正常的控制流,使其在功能保持不变的情况下,使其不能清晰地反映原程序的正常逻辑。

  • 计算混淆

    混淆程序的计算流程,或计算流程中使用的数据,使分析者难以分辨某一段代码所执行的具体计算。

  • 虚拟机混淆

    将一组指令集合(如一组x86指令)转化为一组攻击者未知的自定义指令集,并用与程序绑定的解释器解释执行。

三、ProGuard工具

ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于Android/Java开发用于混淆最终的项目,增加项目被反编译的难度。

​ 处理流程:

  • proguard 开源,Java技术之路,java,开发语言

​ 1)压缩(shrink):检测并删除未使用的类,字段,方法和属性

​ 2)优化(Optimize):分析并优化方法的字节码

​ 3)混淆(obfuscate):使用简短无意义的名称如a,b等重命名类、方法和属性。

​ 4)预检(preverify):Java平台上对处理后的代码进行预检

四、引入项目

​ ProGuard官方默认提供Gradle插件,不提供Maven插件。但是官方推荐了两个Maven插件wvengen/proguard与dingxin/proguard,我们使用第一个插件。

项目使用的框架及语言版本:

- 版本
Spring 2.7.* (2.0+版本都可以,1.5和3.0+未测试)
Java 8
proguard 2.6.0

1. 配置xml

<build>
  <plugins>
    <!--  代码混淆proguard maven插件  -->
    <plugin>
      <groupId>com.github.wvengen</groupId>
      <artifactId>proguard-maven-plugin</artifactId>
      <version>2.6.0</version>
      <executions>
        <!--   package时执行proguard   -->
        <execution>
          <phase>package</phase>
          <goals>
            <goal>proguard</goal>
          </goals>
        </execution>
      </executions>
      <configuration>
        <!--  输入的jar包  -->
        <injar>${project.build.finalName}.jar</injar>
        <!--  输出的jar包  -->
        <outjar>${project.build.finalName}.jar</outjar>
        <!--  是否进行混淆,默认为true  -->
        <obfuscate>true</obfuscate>
        <!--  配置文件,通常为proguard.cfg,主要对options选项进行配置,所有的options选项都可以进行配置  -->
        <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/**</inLibsFilter>
        <!--  输出路径配置,必须包含injar标签中填写的jar  -->
        <outputDirectory>${project.build.directory}</outputDirectory>
        <!--  上面使用了conf配置文件,options无需配置  -->
        <!--<options></options>-->
      </configuration>
    </plugin>
  </plugins>
</build>

2. proguard.cfg文件配置

​ 该文件主要是对项目代码混淆时的参数配置,这里放在项目根目录与pom文件同级

# 指定 java 版本
-target 1.8
# 关闭对代码进行优化压缩,开启会删除从未使用的类或者类成员变量等
-dontshrink
# 列出未使用的代码,可打印到标准输出或写入指定文件
#-printusage
# 关闭字节码级别的优化,如果不开启则设置如下配置,默认开启。
-dontoptimize
# 关闭预检,预检主要针对JavaME,Java6以后都不用预检
-dontpreverify
# 不生成大小写混写的类名
-dontusemixedcaseclassnames
# 对类成员的命名混淆采取唯一策略
-useuniqueclassmembernames
# 混淆类名之后,对使用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 class com.example.proguard.ProguardDemoApplication{<methods>;}

keep可以帮助我们保留我们不需要进行混淆的类、方法或属性,关于上述配置文件中的keep关系整理:

保留内容 防止删除或重命名 防止重命名
类和类成员 -keep -keepnames
仅类成员 -keepclassmembers -keepclassmembernames
如果类成员存在,保留类和类成员 -keepclasswithmembers -keepclasswithmembernames

更多属性配置,请参照:ProGuard配置中文文档

3. 项目结构

├── pom.xml
├── proguard.cfg
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── proguard
    │   │               ├── ProguardDemoApplication.java
    │   │               └── controller
    │   │                   └── IndexController.java
    │   └── resources
    │       └── application.yml
    └── test

4. 注意事项

  • 不混淆反射代码。(class.forName(“类名”))
  • 不混淆需要bean注入的类。(因为我们没有给bean指定id,那么此时的bean的唯一标识的就是name。)
  • 不混淆aop切面的类或方法。(原因与上述大致)
  • 混淆之后可能会有很多奇怪的问题导致项目启动失败,需要根据实际情况进行放行(不混淆)。
  • 对于混淆成功了的项目也需要多进行测试,保证其功能与接口完成与未混淆的源码功能一致。

五、成功演示

1. 未混淆代码反编译演示

将项目正常打包后通过反编译工具(JD)进行查看:

proguard 开源,Java技术之路,java,开发语言

2. 混淆后代码反编译演示

将项目代码混淆后通过反编译工具查看

proguard 开源,Java技术之路,java,开发语言

3. 使用命令启动混淆后的jar包

java -jar proguard-1.0.0-SNAPSHOT.jar

请求接口进行测试

proguard 开源,Java技术之路,java,开发语言

六、源码

Gitee码云,免费下载及参考。文章来源地址https://www.toymoban.com/news/detail-725751.html

到了这里,关于使用开源工具ProGuard实现Java代码混淆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 组件打包常用工具-proguard-maven-plugin等

     1.proguard-maven-plugin 2. maven-shade-plugin 3.maven-Assembly-plugin 4.onejar-maven-plugin    5.mvaen-jar-plugin和 maven-dependency-plugin  

    2024年02月12日
    浏览(28)
  • 【Dotnet 工具箱】JIEJIE.NET - 强大的 .NET 代码混淆工具

    你好,这里是 Dotnet 工具箱,定期分享 Dotnet 有趣,实用的工具和组件,希望对您有用! JIEJIE.NET 是一个使用 C# 开发的开源 .NET 代码加密工具。 很多 .NET 开发人员担心他们的软件被破解,版权受到侵犯,所以他们使用一些工具来混淆 IL 代码。比如 PreEmptive dotfuscator, 但有些场

    2024年02月01日
    浏览(26)
  • php代码还原工具,解决goto语句混淆,php goto解密还原

    在编写php代码时,使用goto语句是一种常见的加密技巧。为了解决goto解码无法阅读这个问题,今天我要向大家介绍一款强大的php goto解密工具。 这款工具的主要功能之一就是php代码的还原。通过对代码进行解析和分析,它能够轻松还原被混淆的goto语句,使得代码更加易读和易

    2024年02月12日
    浏览(40)
  • 八十行代码实现开源的 Midjourney、Stable Diffusion “咒语”作图工具

    本篇文章聊聊如何通过 Docker 和八十行左右的 Python 代码,实现一款类似 Midjourney 官方图片解析功能 Describe 的 Prompt 工具。 让你在玩 Midjourney、Stable Diffusion 这类模型时,不再为生成 Prompt 描述挠头。 本文将提供两个版本的工具,分别支持 CPU 和 GPU 推理使用,如果你有一张大于

    2023年04月14日
    浏览(44)
  • Java开源工具库使用之httpclient

    HttpClient 成立于2001年,是 Apache Jakarta Commons 项目下的子项目,2004 年离开 Commons ,提升成为一个单独的 Jakarta 项目。2005 年,Jakarta 创建了 HttpComponents 项目,目标是开发 HttpClient 3.x 的继任者。2007 年, Commons 项目,也就是 HttpClient 项目的发源地,离开了 Jakarta , 成为了1个新的

    2024年02月06日
    浏览(35)
  • 开源|用 Java 实现一个生成 Markdown 文本的工具

    公司的 IM 每天有许多机器人推送的消息,我也在使用,这个功能是好的,但是当我们想去发送一些格式优美的消息时,却要费许多功夫,主要来源于字符串拼接,如果要拼接出 Markdown 格式的那就更费力了,另外由拼接带来的是混乱的代码,为了解决这个痛点,我写了一个

    2023年04月15日
    浏览(28)
  • 基于misra-c-2012规则在vscode下集成cppcheck开源工具实现代码静态检查

    依赖工具: 1、cppcheck工具 2、vscode下安装C/C++ Advanced Lint扩展 3、python工具 双击后软件自行安装在:C:Program FilesCppcheck 添加系统路径步骤 2.1、在vscode软件中点击设置按钮,选择“设置”选项 2.2、搜索“@ext:jbenden.c-cpp-flylint”然后“settings.json”中编辑 2.3、在settings.json中添加这

    2024年02月09日
    浏览(31)
  • 从零开发基于ASM字节码的Java代码混淆插件XHood

    因在公司负责基础框架的开发设计,所以针对框架源代码的保护工作比较重视,之前也加入了一系列保护措施 例如自定义classloader加密保护,授权license保护等,但都是防君子不防小人,安全等级还比较低 经过调研各类加密混淆措施后,决定自研混淆插件,自主可控,能够贴

    2024年02月06日
    浏览(24)
  • 开源一套文本处理工具:Java+Bat脚本实现自动批量处理对账单工具

    原创/朱季谦 这款工具是笔者在2018年初开发完成的,时隔两载,偶然想起这款小工具,于是,决定将其开源,若有人需要做类似Java批处理实现整理文档的工具,可参考该工具逻辑思路来实现。 该工具是运行在windos系统上的,基于bat脚本与jar包形式协同运行。 当时开发该工具

    2024年02月03日
    浏览(30)
  • 完全从零Java自学系列【工具篇】(GITHUB开源社区&GIT管理工具入门使用)

      本文适用于新手理解GITHUB社区与GIT的理解与入门使用。   GITHUB社区是一个代码开源交流社区。 对于普通的开发者而言: 可以在上面找到各种开源好用的工具用于借鉴学习或者下载使用。 可以提问,搜索相应的问题处理办法。比如bug。 对于高级开发者而言: 可以参与

    2024年02月20日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包