当前位置:   article > 正文

Jar包加密,防止反编译

Jar包加密,防止反编译

XJar加密工具

XJar功能特性

  • 基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露以及反编译。
  • 支持Maven插件
  • 加密过程需要Go环境;加密后生成Go启动器,保护密码不泄露
  • GitHub: https://github.com/core-lib/xjar

使用方法(手动执行方式)

  1. 添加Maven依赖
<!-- 添加jitpack.io仓库 -->
<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

<!-- 添加XJar依赖 -->
<dependencies>
	<dependency>
        <groupId>com.github.core-lib</groupId>
        <artifactId>xjar</artifactId>
        <version>4.0.0</version>
    </dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  1. 对jar包进行加密的代码
XCryptos.encryption()
        .from("D:/jars/original.jar")
        .use("1@3$qWeR")
        .include("/io/xjar/**/*.class")
        .include("/mapper/**/*Mapper.xml")
        .exclude("/static/**/*")
        .exclude("/conf/*")
        .to("D:/files/encrypted.jar");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 方法说明
方法参数说明
from(String jar)指定待加密jar包路径
from(File jar)指定待加密jar包路径
use(String password)设置加密密码
use(String algorithm, int keysize, int ivsize, String password)设置加密算法及加密密码
include(String ant)指定要加密的资源相对于classpath的ANT路径表达式
include(Pattern regex)指定要加密的资源相对于classpath的正则路径表达式
exclude(String ant)指定不加密的资源相对于classpath的ANT路径表达式
exclude(Pattern regex)指定不加密的资源相对于classpath的正则路径表达式
to(String xJar)指定加密后jar包输出路径,并执行加密
to(File xJar)指定加密后jar包输出路径,并执行加密
  • algorithm: JDK内置加密算法,如:AES/CBC/PKCS5Padding(缺省值)和DES/CBC/PKCS5Padding
  • keysize: 密钥长度,如:56、128(缺省值)、256
  • ivsize: 密钥向量长度,如:128(缺省值)
  1. 用Go进行编译,生成Go启动器
go build xjar.go
  • 1
  • 第2步执行成功之后,在指定目录下会输出加密的jar包以及一个xjar.go文件
  • 将 xjar.go 在不同的平台进行编译即可得到不同平台的启动器可执行文件,其中Windows下文件名为 xjar.exe 而Linux下为 xjar
  • 用于编译的机器需要安装 Go 环境,用于运行的机器则可不必安装 Go 环境
  • 由于启动器自带JAR包防篡改校验,故启动器无法通用,即便密码相同也不行
  1. 启动运行
xjar java -jar /path/to/encrypted.jar
  • 1
  • 在 Java 启动命令前加上编译好的Go启动器可执行文件名(xjar)即可启动运行加密后的JAR包
  • 仅支持通过 -jar 方式启动,不支持-cp或-classpath的方式

使用方法(Maven插件方式)

Maven项目可通过集成 xjar-maven-plugin 以免去每次加密都要执行一次上述的代码,随着Maven构建自动生成加密后的JAR和Go启动器源码文件。

  1. 添加 xjar-maven-plugin
<project>
    <!-- 设置 jitpack.io 插件仓库 -->
    <pluginRepositories>
        <pluginRepository>
            <id>jitpack.io</id>
            <url>https://jitpack.io</url>
        </pluginRepository>
    </pluginRepositories>
    <!-- 添加 XJar Maven 插件 -->
    <build>
        <plugins>
            <plugin>
                <groupId>com.github.core-lib</groupId>
                <artifactId>xjar-maven-plugin</artifactId>
                <version>4.0.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <phase>package</phase>
                        <!-- 或使用
                        <phase>install</phase>
                        -->
                        <configuration>
                        	<!-- 建议password不要在pom文件中指定 -->
                            <password>io.xjar</password>
                            <!-- optional
                            <algorithm/>
                            <keySize/>
                            <ivSize/>
                            <includes>
                                <include/>
                            </includes>
                            <excludes>
                                <exclude/>
                            </excludes>
                            <sourceDir/>
                            <sourceJar/>
                            <targetDir/>
                            <targetJar/>
                            -->
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

对于Spring Boot 项目或模块, 该插件要后于 spring-boot-maven-plugin 插件执行, 有两种方式

  • 将插件放置于 spring-boot-maven-plugin 的后面, 因为其插件的默认 phase 也是 package
  • 将插件的 phase 设置为 install(默认值为:package), 打包命令采用 mvn clean install

也可以通过Maven命令执行

mvn xjar:build -Dxjar.password=io.xjar
mvn xjar:build -Dxjar.password=io.xjar -Dxjar.targetDir=outputDir/encrypted.jar
  • 1
  • 2

但通常情况下是让XJar插件绑定到指定的phase中自动执行,这样就能在项目构建的时候自动构建出加密的包

mvn clean package -Dxjar.password=io.xjar
mvn clean install -Dxjar.password=io.xjar -Dxjar.targetDir=/directory/to/save/target.xjar
  • 1
  • 2

强烈建议
不要在 pom.xml 的 xjar-maven-plugin 配置中写上密码,这样会导致打包出来的 xjar 包中的 pom.xml 文件保留着密码,极其容易暴露密码!强烈推荐通过 mvn 命令来指定加密密钥!

exe4j加密工具

使用方法

  1. 下载exe4j工具并安装
    官网下载地址:https://exe4j.apponic.com/

  2. 安装完成后打开软件,填写Name, Company 和 Licence key. Name 和 Company 随便填,Licence key 网上搜一个即可,如 A-XVK258563F-1p4lv7mg7sav
    注册

  3. 点击 Next, 选择 “JAR in EXE” mode
    在这里插入图片描述

  4. 点击 Next, 填写输出exe文件的名称和输出路径
    在这里插入图片描述

  5. 点击 Next, 进行exe程序配置;如需要兼容64位操作系统,需点击 “Advanced Options”, 选择 “32-bit or 64-bit”, 进入设置页面,勾选 “Generate 64-bit executable” 选项
    在这里插入图片描述

  6. 点击 Next, 进入 “Java invocation” 页面;点击右侧 “+” 图标,添加项目jar包以及所有依赖jar包;添加后点击下方 “…” 图标选择程序启动的 Main class;并输入启动参数(如需要)
    在这里插入图片描述

  7. 点击 Next, 填写JRE版本;点击 “Advanced Options”, 选择 “Search sequence”, 点击右侧 “+” 图标,添加本地java安装路径下的jre路径;添加后把jre路径移到第一项(或者把默认的三项删掉)
    在这里插入图片描述
    在这里插入图片描述

  8. 一直点击 Next, 直到进入 “Finished” 页面;点击上方按钮可测试exe程序运行
    在这里插入图片描述

  9. 保存 & 完成

jvmti加密工具

采用jvmti方式对Class文件进行加密,使用C++生成加密和解密库,先用加密库对Jar包进行加密,将加密后的Jar包及解密库文件发布出去,执行时候需要JVM引入解密库文件,解密后执行

使用方法

  1. 下载加密程序压缩包:JarEncrypt2
    解压后目录及文件如下:
./JarEncrypt2/encrypt   ## 加密库
—– encrypt.cpp
—– Makefile

./JarEncrypt2/decrypt    ## 解密库
—–decrypt.cpp
—– Makefile

./JarEncrypt2/Encrypt.java   ## Java加密执行文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 修改 encrypt 和 decrypt 下的Makefile文件,修改其中的 "INCLUDEDIR"为实际jdk路径
INCLUDEDIR = -I /home/jdk1.8/include -I /home/jdk1.8/include/linux
  • 1
  1. 根据需要加密的代码,修改 Encrypt.java 和 decrypt.cpp 文件
// Encrypt.java
// 只对特定类型和package下的文件加密
if (name.endsWith(".class") && name.startsWith("com/du/")) {
  • 1
  • 2
  • 3
// decrypt.cpp
// 设置需要解密的package
if (name && strncmp(name, "com/du/", 7) == 0) { 
  • 1
  • 2
  • 3
  1. 分别进入 encrypt 和 decrypt 目录,执行 make,生成 libencrypt.so 和 liblinux.so 库文件
  2. 编译并运行Encrypt.java;生成 test_encrypt.jar 文件
javac Encrypt.java
  • 1
java -Djava.library.path=./encrypt/ -cp . Encrypt -src test.jar
  • 1
  1. 生成的加密jar包无法直接运行和反编译,直接运行会出现ClassFormatError,用jd-gui工具反编译会显示 // INTERNAL ERROR //
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 3455696313 in class file
  • 1
  • 2
  1. 使用解密库文件 liblinux.so 解密运行
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/home/JarEncrypt2/decrypt
java -agentlib:linux -jar test_encrypt.jar
  • 1
  • 2
  1. 完成;发布的时候需要把 test_encrypt.jar 和 liblinux.so 一起发布,启动时按上一步操作

参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/616989
推荐阅读
相关标签
  

闽ICP备14008679号