Java代码混淆技术选型

  • 代码混淆简介
  • 常见的Java代码混淆技术简介
    • java混淆器
    • java加密保护
    • 提前编译技术(AOT)
    • 使用JNI方式保护
    • 用加密锁硬件保护
    • 总结
  • ProGuard使用说明
    • Proguard简介
    • Proguard-maven-plugin配置
      • 项目的pom文件中增加如下配置
      • 项目根路径下创建proguard.cfg配置文件,内容如下
      • 运行

代码混淆简介

Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译。相信绝大部分Java开发人员,都曾经用过诸如Jad之类的反编译器,对Java的class 文件进行反编译,从而观察程序的结构与实现细节。如此一来,对于那些需要严格进行知识产权保护的Java应用,如何有效的保护客户的商业投资,是开发人员经常需要面对的问题。有鉴于此,对于商业软件来说,必须选择一种代码混淆工具保护我们的产品。

常见的Java代码混淆技术简介

java混淆器

使用一种或多种处理方式将class文件、java源代码进行混淆处理后生成新的class,使混淆后的代码不易被反编译,被反编译后其代码也是难以阅读和理解。
这类混淆器工具很多,而且也很有成效。最常用的Java混淆工具ProGuard就是基于此原理。
缺点:虽然混淆的代码反编译后不易读懂,但对于有经验的人,还是能找到或计算出你代码中隐藏的敏感内容,而且在很多应用中不是全部代码都能混淆的,往往一些关键的库、类名、方法名、变量名等因使用要求的限制反而还不能混淆。

java加密保护

自定义ClassLoader,将class文件和相关文件加密,运行时由此ClassLoader解密相关文件并装载类,要起到保护作用必须自定义本地代码执行器将自定义ClassLoader和加密解密的相关类和配套文件也保护起来。此种方式能很有效地保护java代码。
缺点:
(1)可以通过替换JRE包中与类装载相关的java类或虚拟机动态库截获java字节码;
(2)相关工具基本都是收费的,若自己开发需要开发自己代码执行器,有一定的开发难度和工作量;
(3)由于自定义了代码执行器,安装包中需要携带自己的JRE环境,Class在加载时必须先解密,对产品性能有影响;
(4)对于由web容器启动的web服务来说,其class文件是由对应web容器的classload加载的,使用成本较高。

提前编译技术(AOT)

将java代码静态编译成本地机器码,脱离通用JRE。此种方式能够非常有效地保护java代码,且程序启动比通用JVM快一些。具有代表性的是GNU的GCJ(GNU Compiler for the Java Programing Language),可以做到对java代码完全提前编译,但GCJ存在诸多局限性,如:对JRE 5不能完整支持、不支持JRE 6及以后的版本。
由于java平台的复杂性,做到能及时支持最新java版本和JRE的完全提前编译是非常困难的,所以这类工具往往采取灵活方式,该用即时编译的地方还是要用,成为提前编译和即时编译的混合体。
缺点:使用成本高,不适用跑在容器中的web服务,java版本不支持。

使用JNI方式保护

将敏感的方法和数据通过JNI(Java Native Interface,JAVA调用C/C++函数的接口)方式处理。此种方式可以看作把需要保护的代码和数据“隔离”到动态库中。
缺点:
1)只可能将少数关键函数和数据做成动态链接库;
2)没有自动化工具,只能自己开发,使用成本高;
3)JNI在使用过程处理不当容易造成内存泄漏。

用加密锁硬件保护

使用与硬件相关的专用程序将java虚拟机启动程序加壳,将虚拟机配套文件和java程序加密,启动的是加壳程序,由加壳程序建立一个与硬件相关的受保护的运行环境,为了加强安全性可以和加密锁内植入的程序互动。
此种方式使用了专用硬件设备,安全度最高,主流的Java安全保护的商业软件都是采用该策略。
缺点:只有收费软件,自己开发基本不可能。

总结

对于普通Java项目,推荐采用Java混淆器方法。Java混淆器中最常用的开源工具是ProGuard,有以下几个以优点:
1)开源免费;
2)安卓项目官方推荐的混淆工具,被集成进了Android SDK,技术比较成熟,网上资料也比较丰富;
3)有对应的maven插件proguard-maven-plugin,可以方便的集成到现有的自动化构建流程中。
缺点:
1)如之前所说提供的保护是有限的
2)由于ProGuard会改变包、类、方法、变量的命名,所以在某些使用了反射、与外部系统通信的Bean(controller中的bean)、某些框架中的回调函数(如springboot)、native方法等,如果被混淆运行时将会报错,需要在配置混淆规则时排除这个class文件。

ProGuard使用说明

Proguard简介

ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,ProGuard包括以下4个功能:
1)压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
2)优化(Optimize):对字节码进行优化,移除无用的指令。
3)混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
4)预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向了。
便于集成到自动化构建中,推荐以maven插件的形式使用,这里以web工程为例。

Proguard-maven-plugin配置

项目的pom文件中增加如下配置

<dependency><groupId>net.sf.proguard</groupId><artifactId>proguard-base</artifactId><version>6.0.1</version><scope>runtime</scope>
</dependency>
<!-- ProGuard混淆插件-->
<plugin><groupId>com.github.wvengen</groupId><!--<version>2.1.1</version>--><artifactId>proguard-maven-plugin</artifactId><executions><execution><!-- 混淆时刻,这里是打包的时候混淆--><phase>package</phase><goals><!-- 使用插件的什么功能 --><goal>proguard</goal></goals></execution></executions><configuration><proguardVersion>6.0.1</proguardVersion><!-- 加载文件的过滤器 --><inFilter>com/**</inFilter><!-- 对什么东西进行加载--><injar>classes</injar><!-- 输出--><outjar>${project.build.finalName}-pg.jar</outjar><outputDirectory>${project.build.directory}</outputDirectory><obfuscate>true</obfuscate><proguardInclude>${project.basedir}/proguard.cfg</proguardInclude><libs><lib>${java.home}/lib/rt.jar</lib><lib>${project.basedir}/src/main/webapp/WEB-INF/lib</lib></libs></configuration>
</plugin>

项目根路径下创建proguard.cfg配置文件,内容如下

# JDK目标版本1.8
-target 8
# 不做收缩(删除注释、未被引用代码)
-dontshrink
# 不做优化(变更代码实现逻辑)
-dontoptimize
# 确定统一的混淆类的成员名称来增加混淆
-useuniqueclassmembernames
-adaptclassstrings
-dontusemixedcaseclassnames
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
# 不混淆main函数
-keepclasseswithmembers public class * { public static void main(java.lang.String[]);}
# 不混淆action包下的所有类名和方法,混淆后struts2框架江找不到对应的方法
-keep class com.action.** {*;}
# 不混淆所有的set/get方法,很多第三方框架(例如Shiro)会用到大量的set/get映射
-keepclassmembers public class * {void set*(***);*** get*();}
-keep class com.zxc.action.job.** { <methods>; }
# 忽略告警
-ignorewarnings

运行

执行mvn clean package 命令,执行完即可在项目根路径下找到混淆过的jar:${project.build.finalName}-pg.jar

Java代码混淆技术选型相关推荐

  1. 被黑客们使用的代码混淆技术

    长久以来,代码混淆技术一直都被认为是不能登大雅之堂的奇巧淫技,没有哪个学者会拿正眼瞧它一眼.国际C语言混乱代码大赛(International Obfuscated C Code Contest,IO ...

  2. Android代码混淆技术

    代码混淆技术的目的简而言之,由于Java程序比较容易被反编译,为了防止别人反编译源代码,窃取应用程序中的核心技术,或者说是为了增加反编译的难度,可以通过代码混淆技术增加对源代码的保护. 一.ProGu ...

  3. Java培训分享5个常用Java代码混淆器

    对于Java程序员来说,如果辛辛苦苦写的代码被人摽窃走,将是一件非常恼火的事情.如何保护自己的代码呢,可以通过逆向工程反编译得到Java程序的源代码,这种反编译工具之一就是JAD,尽可能给反编译人员制 ...

  4. 安卓逆向_18 --- APK保护策略【Java代码混淆、资源混淆、签名校验】

    Java 代码混淆介绍:https://www.bilibili.com/video/BV1UE411A7rW?p=60 Android 反编译利器 jadx:GitHub上直接下载:https:// ...

  5. Java代码混淆工具ProGuard

    目录 Java代码混淆工具ProGuard 简介 描述 作用的环境 功能 工作原理 下载 使用时注意事项 版本问题 JDK位数问题 Java的字节码验证问题 关于使用类似于Hibernate的对象关系 ...

  6. JAVA代码混淆器大全

      JAVA代码混淆器大全 Author/Company Program Shrink. Optim. Obfusc. Preverif. License Eric Lafortune ProGuar ...

  7. Java代码混淆和加密--Jocky

    原文地址为: Java代码混淆和加密--Jocky 1.1 什么是Jocky? 我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在 ...

  8. java代码混淆器proguard使用大法3种

    ProGuard注意事项 1.反射调用类或者方法,可能失败 2.对外接口的类和方法,不要混淆 3.嵌套类 4.native方法 5.枚举类 https://www.guardsquare.com/en ...

  9. Python代码混淆技术

    Python代码混淆技术 1. .py代码混淆技术 我们一般对反汇编代码进行还原时,默认CALL就是对一个函数的调用,碰到RET就是函数返回,条件分支两侧的代码都有可能被执行.而代码混淆就是打破了这种 ...

  10. 5个常用Java代码混淆器 助你保护你的代码

    [IT168 技术文档] 从事Java编程的人都知道,可以通过逆向工程反编译得到Java程序的源代码,这种反编译工具之一就是JAD.因此,为保护我们的劳动成果,尽可能给反编译人员制造障碍,我们可以使用 ...

最新文章

  1. 只需3行代码自动生成高性能模型,支持4项任务,亚马逊发布开源库AutoGluon
  2. 分享 - Social.framework
  3. 卷积神经网络(高级篇) Inception Moudel
  4. 数学不好,能学好机器学习吗?
  5. 再现暴力裁员!患病员工被关小黑屋,摄像头监控,工作量超其他人!
  6. JEECG支付服务窗专题 - 支付窗激活开发者模式
  7. 44 SD配置-销售凭证设置-定义状态参数文件
  8. 一个java 验证码的实现提供多种的实现
  9. 成长笔记--解决Eclipse 变量名的自动补全问题
  10. Container类型元素累加
  11. ubuntu linux 1604 编译安装tesseract-ocr 4.0
  12. caffe--交通标志识别
  13. 简述python2.x和python3.x的区别_python面试题Python2.x和Python3.x的区别
  14. matlab进化树的下载,mega7.0进化树软件下载-mega 7.0 win 64位下载【附详细使用教程】 - 百当下载站...
  15. 妈妈吼你屋子乱的像猪窝的无聊探究
  16. MATLAB | 全网唯一,使用MATLAB绘制好看的韦恩图(venn)
  17. 华为emui10.0系统是鸿蒙吗,暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角...
  18. PHPstudy 数据库基本操作
  19. 解决h5一键复制的问题
  20. Java可以应用到哪些领域?

热门文章

  1. 智能车改舵机中值步骤_智能车制作全过程(飞思卡尔---舵机篇)
  2. IDEA主题分享与代码颜色设置
  3. android打开ofd文件
  4. 华为手机计算机快捷设置密码,华为手机首次重启绘制图案密码后让输入解锁密码。我没有设置呀?怎么办...
  5. 非极大值抑制(Non-Maximum-Suppression)
  6. 【JavaWeb】Http get请求乱码、post请求乱码,html页面乱码、jsp页面乱码,控制台tomcat日志乱码原因分析和解决方案
  7. 一键把动态IP自动设置为静态IP
  8. MAVEN本地仓库安装及配置
  9. python snownlp_snownlp · PyPI
  10. [裴礼文数学分析中的典型问题与方法习题参考解答]5.1.8