-Virbox代码加密

Virbox 文档

一、SDK

1.1注册 Virbox开发者账号

注册地址:https://developer.lm.virbox.com/reg.html

1.2申请转正(成为开发者)

1.3下载开发者工具盒

在【概览】页面-【工具资料】模块,点击【开发者工具盒】即可下载Virbox开发者工具盒

安装工具盒并登录

点击【下载SDK】,检测后【立即更新】

二、许可发布流程

2.1创建产品

2.2创建授权码模板

带红色星号的都是必填

2.3生成授权码(发布许可)

2.3.1发布许可

2.3.2填写

2.3.3生成完毕

三、软件加密(jar包加密)

3.1打开加壳工具

jar包放入新建的一个文件夹中

3.2登录开发锁,填API密码

API密码在

下拉即可看到

3.3拖入jar包文件夹,填写许可选项

填写java密码:

  • 密码如果不设置,会随机默认密码。
  • 建议设置一个密码,并牢记,后续更新jar包时,重新加密时填写此密码,则无需更换配置sjt库。

3.4消息提示选项

当程序被加密后,程序就与我们之前创建的许可进行关联,当用户在使用我们的加密的程序时如果触发了一些限制时,会以该界面上的消息进行显示

3.5完成保护

配置好信息后,选中项目,点击“保护选中项目”,进行加密

生成一个文件夹和加密配置文件

文件夹中:加密后的jar包和sjt_agent.jar文件

四、使用加密后的程序

4.1安装用户工具

运行加密后的软件是需要先运行Virbox用户工具

Virbox用户工具下载链接:https://lm.virbox.com/tools.html

windows环境

直接双击安装

Linux环境

  • rpm安装:rpm -ivh senseshield-2.5.0.60698-1.x86_64.rpm
  • deb安装:dpkg -i senseshield-2.5.0.60698-i386.deb
  • 服务启动查看:service senseshield status 或者 systemctl status senseshield

4.2绑定授权码

windows环境

打开Virbox 用户工具,点击【云/软锁】—【本地软锁】—【授权码在线激活】,会打开授权码激活页面,将生成的授权码输入,点击激活即可。

粘贴授权码并点击激活

Linux环境

1.联网环境下打开终端
1
2
//例:ssclt --online_bind_license_key --license_key 26W7-4ZTP-38YP-JRX1
ssclt --online_bind_license_key --license_key [授权码]

激活成功会有success的字样

2.使用ssclt --slock查看已绑定的软锁许可

4.3运行jar包

windows系统

1.把slm_runtime_java.dll文件复制或移动到jdk17的bin目录下

2.运行方式:运行 jar 包时指定 sjt 文件目录

  • 若 sjt_agent.jar 和 jar 包在同一目录,进入到jar包的当前目录下,直接执行

    命令:java -javaagent:sjt_agent.jar -jar ***.jar

  • 若 sjt_agent.jar 和 jar包 不在同一目录,需要指定文件的全目录。

    命令:java -javaagent:C:\Users\test\Desktop\sjt\sjt_agent.jar -jar ***.jar

Linux 系统

1.下列文件需要上传到服务器新建的目录

目录lib下的文件是libslm_runtime_java.so

2.解压jdk-17_linux-x64_bin.tar.gz文件

使用解压命令

1
tar -zxvf jdk-17_linux-x64_bin.tar.gz

或直接执行jieya.sh文件解压jdk

1
./jieya.sh

3.执行start.sh文件
1
./sstart.sh

文件内容如下:

1
2
3
4
5
6
export JAVA_HOME=./jdk-17.0.9
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
java -javaagent:sjt_agent.jar -jar udyk-2.1.jar

方式二:

或是直接在终端运行jiance.sh,此脚本会自动检测当前系统是否安装了宝塔面板、检测用户工具是否已安装、检测运行项目所需要的服务是否已经启动、检测服务全部启动后帮助用户激活授权码以及检测jdk是否已解压,一些就绪后,将会执行start.sh脚本启动项目。

服务器shell脚本运行成功一切正常的情况下

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 检查是否已经安装了宝塔面板
#系统类型 默认0 Ubuntu:1 Deepin:2 Centos:3
system_type=0

if ps aux | grep bt | grep -v grep > /dev/null ; then
echo "宝塔面板已安装"
else
echo "宝塔面板未安装,马上执行安装!"
# 检测是什么系统,安装宝塔面板
if [[ $(uname -s) == "Linux" ]]; then
if [[ -f /etc/lsb-release && $(grep DISTRIB_ID= /etc/lsb-release | cut -d= -f2) == "Ubuntu" ]]; then
echo "是Ubuntu,安装Ubuntu的宝塔面板"
system_type=1
#wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
elif [[ -f /etc/os-release && $(grep '^ID=' /etc/os-release | cut -d= -f2 | sed 's/"//g') == "deepin" ]]; then
echo "是Deepin,安装Deepin的宝塔面板"
system_type=2
#wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
elif [[ -f /etc/redhat-release && $(cat /etc/redhat-release | awk '{print $1}') == "CentOS" ]]; then
echo "是centos,安装Centos的宝塔面板"
#yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh
system_type=3
fi
fi
fi

# 检测是否安装了virbox用户工具
if ps aux | grep senseshield | grep -v grep > /dev/null ; then
echo "用户工具已安装"
else
echo "用户工具未安装"
if [[ $(uname -s) == "Linux" ]]; then
if [[ -f /etc/lsb-release && $(grep DISTRIB_ID= /etc/lsb-release | cut -d= -f2) == "Ubuntu" ]]; then
system_type=1
elif [[ -f /etc/os-release && $(grep '^ID=' /etc/os-release | cut -d= -f2 | sed 's/"//g') == "deepin" ]]; then
system_type=2
elif [[ -f /etc/redhat-release && $(cat /etc/redhat-release | awk '{print $1}') == "CentOS" ]]; then
system_type=3
fi
fi
fi

# 安装virbox用户工具
if [[ $system_type == "1" || $system_type == "2" ]]; then
echo "安装virbox用户工具---Ubuntu/Deepin"
#dpkg -i senseshield-2.5.0.60698-i386.deb
elif [[ $system_type == "3" ]]; then
echo "安装virbox用户工具---Centos"
#rpm -ivh senseshield-2.5.0.60698-1.x86_64.rpm
fi

# 检查服务是否启动
services=("nginx" "mysql" "redis" "senseshield")
started_services=0 # 记录已启动的服务数量
for service in "${services[@]}"
do
if pgrep "$service" >/dev/null
then
echo "$service 服务已经启动"
started_services=$((started_services+1))
else
echo "$service 服务未启动"
fi
done

if [[ $started_services -eq ${#services[@]} ]]; then
echo "依赖服务全部已启动"
# 服务全部启动后,进行用户工具的激活授权码操作
while ! [[ $license_key =~ ^[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}$ ]]; do
echo "请输入授权码(格式:XXXX-XXXX-XXXX-XXXX):"
# 读取用户输入,并校验
read license_key
if ! [[ $license_key =~ ^[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}-[0-9A-Z]{4}$ ]]; then
echo "授权码格式不正确"
fi
done
echo "激活完毕,即将运行……"
echo "查看目录"
ls
if [ -d jdk-17.0.9 ]; then
echo "jdk-17.0.9 目录存在"
echo "运行jar包……"
./start.sh
else
echo "jdk-17.0.9 目录不存在"
echo "解压jdk……"
./jieya.sh
./start.sh
fi
fi

五、获取授权码中的数据区

5.1前提是在产品管理中创建产品的时候,填写上数据区的内容

5.2创建授权码模板时勾选上数据区的内容

5.3在代码中整理好示例

  • 此处的三个文件在

    【D:\Virbox\senseshield\sdk\API\Java\Sample\SlmRuntimeJava】目录下

  • 或者:此处也可以使用导入jar包的方式使用Sample示例

    jar包在【D:\Virbox\senseshield\sdk\API\Java\Sample\SlmRuntimeJava】目录下

    在pom.xml中定义

    1
    2
    3
    4
    5
    6
    7
    <dependency>
    <groupId>com.udeve</groupId>
    <artifactId>SlmRuntimeJava</artifactId>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/SlmRuntimeJava.jar</systemPath>
    <version>1</version>
    </dependency>

5.4更改API密码和许可ID

5.5注释掉用不到的代码,防止报错

5.6把DLL文件复制一份到jdk的bin中

D:\Virbox\senseshield\sdk\API\Java\dll\x64下的slm_runtime_java.dll文件,挪到D:\Java\jdk-17\bin

5.7测试、运行代码

1
2
3
4
5
6
7
8
public static void main(String[] args) {
Sample.Virbox(7764);
JSONObject object = Sample.DataObject;
JSONObject userData = object.getJSONObject("userData");
JSONObject pubData = object.getJSONObject("pubData");
System.out.println(userData);
System.out.println(pubData);
}

5.8输出

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
slm_get_developer_id success !
developerId = 0300000000000009
slm_init success!
slm_login success!
slm_keep_alive success!
slm_find_license success !
license_desc = [{"developer_id":"0300000000000009","lm":"pub","account_name":"SC1895000000003","user_guid":"71fbab6f28854962a52816bcb3a6e5b6","host_name":"DESKTOP-HO61AG6","ip":"","port":0,"type":"slock"}]
slm_check_module failure : 0x13000037! License module not exist.
slm_get_info failure : 0x00000010! Unsupported operation.
slm_user_data_getsize success! pmemSize = 103
slm_user_data_read success!
readBuff = CUSTOM_COPYRIGHT:no;HOUSE_MAX_COUNT:10;OPEN_API:no;POST_MAX_COUNT:1;TOUR_MAX_COUNT:1;USER_MAX_COUNT:100
slm_user_data_write before size = 0
slm_pub_data_getsize success!
pmem_size = 13
slm_pub_data_read success!
slm_pub_data_read readBuf = name:zhangsan
slm_logout success!
slm_cleanup success!
test over ......
{"OPEN_API":"no","CUSTOM_COPYRIGHT":"no","TOUR_MAX_COUNT":"1","HOUSE_MAX_COUNT":"10","USER_MAX_COUNT":"100","POST_MAX_COUNT":"1"}
{"name":"zhangsan"}

Process finished with exit code 0

下图分别是数据区的只读区公开区的数据内容