java加密,支持window和linux (防止反编译)

# 情境
项目需要,所以我来做技术调研,对我们也很有利,在公司项目中引入自己封装的jar
加密后别人看不到自己的源码,只能调用,才能显示出来自己的价值


# 过程
之前参考了网上四种方案,连接奉上,不过先把我这篇文章看完再说,以下测试结论以实际为准

主要参考本篇文章,window和linux加解密都可以实现,但是可以通过idea反编译,且项目会启动两次
https://blog.csdn.net/weixin_39747279/article/details/90214044

加密成功,window和linux都解不了
https://blog.csdn.net/ddjc123/article/details/108118775

同上,可以对自定义main方法进行加解密,但是不能启动项目(linux环境测试)
http://lxw1234.com/archives/2017/05/851.htm

这个没有测试
https://github.com/core-lib/xjar

# 我的实验环境
windows:
springboot2.3.4.RELEASE jdk1.8.0_251 visualstudio2010
linux:
ubuntu安装vscode jdk1.8.0_161

# 我的github项目地址
https://github.com/ainusers/encryption-java-source-code.git

# 进入正题
1. 创建一个demo项目,如果是springboot项目,要用自定义maven打包,不然会找不到加密的类
   demo项目会放在最后github项目,如果需要自行打包,maven配置如下所示

注意:生成jar包之后,需要把lib和config两个包,和jar文件放在一起,因为自定义maven打包,是将配置和依赖分离了


    
        demo
        
            
                
                ${project.build.directory}/classes
                src/main/resources
                true
                
                    mapping/*.xml
                
            

            
                
                ${project.build.directory}/config
                src/main/resources
                true
                
                    **.xml
                    **.properties
                
            
        
        
            
            
                org.apache.maven.plugins
                maven-dependency-plugin
                
                    
                        copy-dependencies
                        package
                        
                            copy-dependencies
                        
                        
                            jar
                            jar
                            
                                ${project.build.directory}/lib
                            
                        
                    
                
            

            
                maven-compiler-plugin
                
                    1.8
                    1.8
                    UTF-8
                
            

            
                org.apache.maven.plugins
                maven-jar-plugin
                
                    target/classes/
                    
                        
                        false
                        
                            com.data.demo.DemoApplication
                            
                            false
                            true
                            lib/
                        
                        
                            
                            config/ .
                        
                    
                
            
        
    
2. 生成dll文件
通过下载的visual studio 2010工具,打开我的github项目中的.cpp和.h
如果报错缺少.h文件:
第一种方案是把github项目提供的.h文件复制到F:\vs2010\VC\include (实际路径自行修改)
第二种方案是把自己环境下的.h拷贝到vs下的include路径,jdk的路径为:
C:\Program Files\Java\jdk1.8.0_251\include
C:\Program Files\Java\jdk1.8.0_251\include\win32

拷贝完成后,注意要配置一下生成64位的dll文件,需要额外的配置一下,如下图所示

java加密,支持window和linux (防止反编译)_第1张图片

java加密,支持window和linux (防止反编译)_第2张图片

3. 通过idea,git clone我上面提供的项目地址,先运行ByteCodeEncryptorTest
   再运行JarEncryptorTest,之后会在demo.jar的同级目录生成一个demo_encrypted.jar

注意项目里面有三处路径,需要修改,一个dll文件路径,一个demo.jar路径,一个加密的类路径
注意,此处加密和解密的路径,需要一致,不然会出现魔数异常,解密不成功

Caused by: java.lang.ClassFormatError: Incompatible magic value 3456286402 in class file com/data/demo/controller/Demo

java加密,支持window和linux (防止反编译)_第3张图片

4. 查看加密

java加密,支持window和linux (防止反编译)_第4张图片

5. 解密,运行项目

java加密,支持window和linux (防止反编译)_第5张图片

上面是window环境下测试的加密和解密,下面简要的说下linux环境的,整体思想就是将window环境的dll文件

打包成linux环境的so文件

1. ubuntu系统安装vscode
下载链接:https://www.lanzoux.com/ipc1ygv69na
通过dpkg -i xxx进行安装

2. 安装好之后,启动要用如下命令启动,不然创建文件或者安装东西,会报没有权限
sudo code --user-data-dir="~/.vscode-root"

3. 安装c/c++插件

-- 如下三个文件,需要额外的注意,配置文件,如下所示
4. launch.json文件

5. tasks.json

6. tasks.out
launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/tasks.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": true,
            "MIMode": "gdb",
            "preLaunchTask": "build",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
tasks.json

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build",
            "type": "shell",
            "command": "g++",
            "args": ["-g", "${file}","-std=c++11","tasks.out"]
        }
     ]
}
7. 使用ubuntu中的vscode生成so文件,如下图所示
注意;linux系统认可的so文件,需要加lib前缀,如果你要的是demo.so
那么你生成命名的时候,需要些libdemo.so

java加密,支持window和linux (防止反编译)_第6张图片

8. linux环境测试
在这里java在linux有默认的依赖读取路径,当然在window也有,如果想看的话,可以使用如下输出
System.out.println(System.getProperty("java.class.path"));

所以,我将libdemo.so放在了/usr/lib目录下当然其他目录也可以

java加密,支持window和linux (防止反编译)_第7张图片

linux环境运行命令:
1. 这个环境变量的路径可以自定义
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/lib
2. 运行
java -agentlib:demo -jar demo_encrypted.jar

如果大家遇到了任何问题,文章下面留言,我会及时回复,即时更新文章

你可能感兴趣的:(其他技术,防止反编译,java加密混淆,jvmti,xjar,dll和so文件)