本文主要是介绍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 | 地址 |
---|---|---|
yGuard | LGPL | http://www.yworks.com/products/yguard |
ProGuard | GPLv2 | https://www.guardsquare.com/en/proguard |
Facebook ProGuard分支 | GPLv2 | https://github.com/facebook/proguard |
DashO | Commercial | https://www.preemptive.com/products/dasho |
Allatori | Commercial | http://www.allatori.com |
Stringer | Commercial | https://jfxstore.com |
Java Antidecompiler | Commercial | http://www.bisguard.com/help/java/ |
Zelix KlassMaster | Commercial | http://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应用的混淆、加密以及加壳的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!