网站广告销售怎么做,网站续费续的是什么钱,seo优化广告,旅游网站怎样做宣传文章目录 前言问题代码混淆存在的问题Java类文件加密存在的问题虚拟化保护存在的问题AOT编译存在的问题 Java应用的打包混淆器类加载与类加密Bootstrap Class LoaderExtension Class LoaderSystem Class Loader自定义ClassLoaderprotector4j 加壳采用Golang打包Java程序xjar 参… 文章目录 前言问题代码混淆存在的问题Java类文件加密存在的问题虚拟化保护存在的问题AOT编译存在的问题 Java应用的打包混淆器类加载与类加密Bootstrap Class LoaderExtension Class LoaderSystem Class Loader自定义ClassLoaderprotector4j 加壳采用Golang打包Java程序xjar 参考链接 前言
自从Java诞生以来其字节码容易被反编译的问题就为程序员所诟病。由此也诞生了不少Java混淆工具和加壳软件。
最关键的一个问题采用import语句的类能否被URLClassLoader加载机制替换掉也就是一个jar包中如果我将一部分class移走这部分class采用自定制的ClassLoader加载是否可行如果可行那我将这部分class通过golang写的server输出就差不多解决了一半的被破解问题。
问题
代码混淆存在的问题
由于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应用的打包
exe4jlaunch4jJSmooth: 已经过时了jpackageJDK自带的打包工具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/yguardProGuardGPLv2https://www.guardsquare.com/en/proguardFacebook ProGuard分支GPLv2https://github.com/facebook/proguardDashOCommercialhttps://www.preemptive.com/products/dashoAllatoriCommercialhttp://www.allatori.comStringerCommercialhttps://jfxstore.comJava AntidecompilerCommercialhttp://www.bisguard.com/help/java/Zelix KlassMasterCommercialhttp://www.zelix.com
类加载与类加密
先来了解一下Java类加载器的基本常识。三种调用会导致JVM加载一个类: new一个对象、Class.forName()、classLoader.loadClass()而在文件头import语句只是声明不会导致类加载。
Bootstrap Class Loader
Bootstrap class loader serves as the parent of all the other ClassLoader instances. This bootstrap class loader is part of the core JVM and is written in native code. 不同平台有不同的实现。
It’s mainly responsible for loading JDK internal classes, typically rt.jar and other core libraries located in the $JAVA_HOME/jre/lib directory.
Extension Class Loader
The extension class loader is a child of the bootstrap class loader, and takes care of loading the extensions of the standard core Java classes so that they’re available to all applications running on the platform.
The extension class loader loads from the JDK extensions directory, usually the $JAVA_HOME/lib/ext directory, or any other directory mentioned in the java.ext.dirs system property.
System Class Loader
The system or application class loader, on the other hand, takes care of loading all the application level classes into the JVM. It loads files found in the classpath environment variable, -classpath, or -cp command line option. It’s also a child of the extensions class loader.
自定义ClassLoader
java -Djava.system.class.loader com.test.YourCustomClassLoader com.test.YourMainClass
protector4j
Protector4J可以通过加密类来保护您的java源代码它通过修改JVM创建了一个自定义的本地ClassLoader。Java类由AES加密并在本地ClassLoader中解密。并且它还引入了一些机制来提高破解的难度。
加密您的代码可以保护您的知识产权并大大提高您的应用程序的安全性。它使得IP盗窃、代码篡改和安全漏洞的发现涉及到昂贵的逆向工程努力而实际上任何人都可以下载并运行一个免费的Java反编译器。
Protector4J也可以帮助您为WindowsLinuxmacOS创建您的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 (_ embedfmtosos/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/jbinarygo-jdkRun JVM-based code in Go efficientlyhttps://github.com/core-lib/xjarhttps://github.com/lqs1848/AllatoriCrack.githttps://yworks.github.io/yGuard/https://protector4j.com/https://blog.csdn.net/weixin_35569158/article/details/114567793