Java应用的混淆、加密以及加壳

2023-10-15 09:04
文章标签 java 应用 加密 混淆 加壳

本文主要是介绍Java应用的混淆、加密以及加壳,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 前言
    • 问题
      • 代码混淆存在的问题
      • Java类文件加密存在的问题
      • 虚拟化保护存在的问题
      • AOT编译存在的问题
    • Java应用的打包
    • 混淆器
    • 类加密与类加载
      • protector4j
    • 加壳
    • 采用Golang打包Java程序
      • xjar
    • 参考链接

前言

自从Java诞生以来,其字节码容易被反编译的问题就为程序员所诟病。由此也诞生了不少Java混淆工具和加壳软件。

问题

代码混淆存在的问题

由于JVM字节码的高语义性,使得期极为容易被分析与阅读,使用动态调试的方式可以很容易分析出其运行逻辑,而动态调试工具的编写并不是一件十分复杂的事情,因此混淆并不是一种可靠的保护方案。

Java类文件加密存在的问题

由于JVM附加机制的存在,所有未脱离普通JVM运行的所谓加密代码,都可以使用附加工具轻松读取,因此这是一种最无效的保护方案。
普通的JVM都带有附着自制,用户可以使用jhsdb这类工具,附着到JVM进程,对其内存数据进行查看和分析,并且这些内存数据还是按照源文件中的数据结构被妥善组织好的,这也可以理解为JVM自带的一种后门机制。下面这篇文章介绍了如何使用JVM附着机制读取并保存内存中的类文件信息。https://protector4j.com/articles/cracking-encrypted-java-applications-jhsdb/

除了可以使用JDK自带的jhsdb工具之外,还可以使用阿里巴巴的Arthas对运行中的Java进程进行分析。

虚拟化保护存在的问题

虚拟化保护是强度最高的一种代码保护方式,但是由于期对性能的严重影响,因此无法应用到程序中的全部代码,而只能保护关键代码,其他代码仍然有暴露的风险,而以其他部分代码来切入口,就可以获取到虚拟化部分代码的功能信息。

AOT编译存在的问题

AOT编译配置难度大,编译难度大,编译失败概率高,即使编译成功,代码逻辑也仅是由原来的字节码表示转换为机器代码表示,其本身的运行逻辑仍然存在,并没有进行特别的保护,如果能够了解其本身的编译与运行机制,仍然能够逆向还原出可读性的代码。

Java应用的打包

  • exe4j
  • launch4j
  • JSmooth: 已经过时了
  • jpackage:JDK自带的打包工具
  • Installer工具:Inno Setup、NSIS(https://sourceforge.net/projects/nsis/)

混淆器

代码混淆是最早应用于Java代码保护的方案,也是一个最直接的方案。代码混淆通常有下面四种方法:

  • 包名、类名、变量名转换
  • 控制结构改变,如控制流平坦化、添加不可变谓词等
  • 字符串混淆或加密
  • 添加无用代码

代码混淆可以大幅降低反编译代码的可读性,提升静态分析的难度,但是无论如何进行代码混淆,程序的运行逻辑是不会改变的。
JVM字节码上是一种语义很清晰明确,且极为阅读的中间代码,对于被混淆的class文件,即使无法还原成可读的Java源代码,仍然可以在字节码层面进行分析,由于Java字节码的高语义性,这个过程其实还是比较容易的。

下面是一些常见的开源的和商业的混淆工具:

  • ProGuard is a popular open-source GPL-licenced bytecode optimizer and file shrinker for Java and Kotlin. It claims to make these applications up to 90% smaller and 20% faster. It also provides some minimal obfuscation by renaming classes, fields and methods. Android Studio uses ProGuard automatically. ProGuard,一款shrinker(压缩:检测和删除没有使用的类,字段,方法和属性), optimizer(优化:对字节码进行优化,并且移除无用指令), obfuscator(混淆:使用a,b,c等无意义的名称,对类,字段和方法进行重命名), and preverifier(审核:在Java平台上对处理后的代码进行预检)工具。缩短进程检测并删去未运用的类、字段、办法和特点。优化器 进程优化字节码并删去未运用的指令。混杂进程运用简短无意义的称号重命名剩余的类、字段和办法。最后的预验证进程将预验证信息增加到类中,这是 Java Micro Edition 和 Java 6 及更高版别所必需的。
  • yGuard is another commonly used open-source obfuscator.
  • ZKM(Zelix KlassMaster) is a full featured commercial Java obfuscator. It shrinks and obfuscates both code and string constants.
  • Allatori is a commercial second generation Java obfuscator. 第二代Java混淆器。所谓第二代混淆器,不仅仅能进行字段混淆,还能实现流混淆。
  • DashO Java and Android Obfuscator is a commercial second generation Java obfuscator. DashO-Pro是第三代的Java混淆器(obfuscator)、压缩机(compactor)、优化工具和水印工具(watermarker)。它能有效保护和防止Java程序被反编译和篡改,是Java代码保护的理想选择。DashO-Pro除了为Java代码提供领先的代码保护外,它还将应用程序的大小缩减到原文件的70%。如果您正在找寻为您的Java程序提供反编译保护、提高运行速度和减少程序体积的办法,那么我们推荐您使用DashO。DashO是一个Java和Android的混用程序,它提供企业级应用的加固和屏蔽,大大降低了知识产权盗窃、数据盗窃、盗版和篡改的风险。分层混淆,加密,水印,自动失效,反调试,反篡改,反仿真器,反挂钩,反根设备解决方案,为世界各地的应用程序提供保护。
  • Stringer Java Obfuscation Toolkit is a commercial Java obfuscator supporting up to Java 13.

There is an easy-to-read introductory article with extra links on bytecode obfuscation on the OWASP Foundation’s website. Another good introductory article on obfuscation techniques is on the DashO website.

名称License地址
yGuardLGPLhttp://www.yworks.com/products/yguard
ProGuardGPLv2https://www.guardsquare.com/en/proguard
Facebook ProGuard分支GPLv2https://github.com/facebook/proguard
DashOCommercialhttps://www.preemptive.com/products/dasho
AllatoriCommercialhttp://www.allatori.com
StringerCommercialhttps://jfxstore.com
Java AntidecompilerCommercialhttp://www.bisguard.com/help/java/
Zelix KlassMasterCommercialhttp://www.zelix.com

类加密与类加载

protector4j

Protector4J可以通过加密类来保护您的java源代码,它通过修改JVM创建了一个自定义的本地ClassLoader。Java类由AES加密,并在本地ClassLoader中解密。并且它还引入了一些机制来提高破解的难度。

加密您的代码可以保护您的知识产权,并大大提高您的应用程序的安全性。它使得IP盗窃、代码篡改和安全漏洞的发现涉及到昂贵的逆向工程努力,而实际上任何人都可以下载并运行一个免费的Java反编译器。

Protector4J也可以帮助您为Windows,Linux,macOS创建您的Java App的可执行包装器。

VLINX Protector4J is a tool to prevent Java applications from decompilation. Protector4J provides a custom native ClassLoader by modifying the JVM. The Java classes are encrypted by AES and decrypted in the native ClassLoader.

几个特点:

  • 私有压缩文档格式: JARX
  • 自定义JRE仅支持加载JARX文件
  • 禁用JVM的远程附加机制
  • 二进制代码级别的保护

JARX文件是protector4j专有存档文件格式,它使用与Zip相同的Deflate压缩算法,并使用AES加密算法来加密数据。
JARX文件的结构与所有存档文件类型相似,由条目组成,这些条目以我们的专有方式组织,条目的名称和内容使用AES算法进行加密。
由于JARX文件格式并未公开,且条目的内容和名称已加密,且没有工具可以直接解压和JARX文件,因此使用JARX文件不仅可以保护您的类文件的内容,还可以保护整个JAR文件的结构,即外界甚至无法获取您的类的名称,这将使其更难以破解。

加壳

https://gitee.com/chejiangyi/jar-protect

在这里插入图片描述

在这里插入图片描述

采用Golang打包Java程序

Golang
binary-go就是其中一个合适的选择

go get -u github.com/samuelngs/binary-go

安装完之后,我们执行

binary -dir ./[静态文件位置] -out binary

就会产生出许多的go文件,默认它是以20M为一个进行分拆的。

package mainimport (_ "embed""fmt""os""os/exec"
)//go:embed binary
var f []bytefunc main() {_ = os.WriteFile("foobar", f, 0755)out, _ := exec.Command("./foobar").Output()fmt.Printf("Output: %s\n", out)
}
cmd := exec.Command("java", "-jar", "Astro.jar", "1924 12 12 23 23 23 74.34 34.67")
fmt.Println(cmd.Start())

xjar

xjar的原理是将jar包加密,然后执行的时候再加密,而密钥存放在外部的go可执行文件中。加密和解密都是由java程序完成。

参考链接

  • https://github.com/segator/jbinary
  • go-jdk:Run JVM-based code in Go efficiently
  • https://github.com/core-lib/xjar
  • https://github.com/lqs1848/AllatoriCrack.git
  • https://yworks.github.io/yGuard/
  • https://protector4j.com/

这篇关于Java应用的混淆、加密以及加壳的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/216719

相关文章

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Springboot的自动配置是什么及注意事项

《Springboot的自动配置是什么及注意事项》SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean... 目录核心概念:自动配置的关键特点:自动配置工作原理:示例:需要注意的点1.默认配置可能不适合所有场景

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行