请加qq索取源码(* ̄︶ ̄): 1139162887
一、背景介绍
使用Java语言开发的软件产品(2B产品,客户环境本地安装),进行市场推广时,需要对客户的安装环境进行License授权:
- 绑定服务器MAC地址,防止软件被复制滥用
- 限制用户数量,保护商业版本
- 规定软件使用期限,实现商业可持续
- 重申软件知识归属权
- 禁止反编译、篡改或逆向工程等侵犯版权的行为
- 等等
因此编证书注入工具,下面简称本工具。
本工具的功能特性:
- 支持生成授权证书的功能
- 支持零侵入式注入【证书校验】逻辑功能
- 支持lib目录下依赖的子模块jar包内的class,合并到SpringBoot far jar主包中
- 支持proguard代码混淆功能(可关闭),保护核心代码逻辑和证书校验逻辑
- 支持xjar字节码加密功能(可关闭),实现防反编译、逆向工程等侵权行为
说明:零侵入式注入【证书校验】逻辑注入功能,无需改源码、无需改配置、无需使用maven插件等,只需要提供jar包即可,可以是SpringBoot fat jar,也可以是普通工具jar。
二、本工具使用步骤
1、安装JDK,并配置环境变量
本工具开发时,使用的版本:JDK 17
注:配置环境变量后,可能需要重启IDE
2、安装proguard,并配置环境变量
本工具开发时,使用的版本:proguard 7.4.2
注:配置环境变量后,可能需要重启IDE
3、安装Golang并配置环境变量
本工具开发时,使用的版本:go1.21.6
注:配置环境变量后,可能需要重启IDE
4、编译构建打包license-core
必须构建,后续使用license-tool对目标产品jar包进行字节码注入时,会将本模块的class、依赖lib,自动拷贝到目标产品的jar包中。
cd license-inject/license-core/ mvn clean package -DskipTests=true
5、编译打包springboot2-demo
用于演示license-tool模块中的测试用例,如果不需要可以不构建
cd license-inject/springboot2-demo/ mvn clean package -DskipTests=true
6、对springboot2.jar注入字节码、代码混淆、生成xjar
参考license-tool模块中的测试用例,结合产品的自身情况进行修改:
- 修改要进行字节码注入的类、方法信息
- 修改lib目录下依赖包要合并到主包的信息(proguard只能混淆主包中的class,lib目录下的子模块jar包暂无法修改)
- 修改proguard.cfg配置文件的地址
- 修改xjar字节码的加密密码
- 等等
执行测试用例后,生成的内容说明:
./springboot2.jar 原软件产品jar ./inject/springboot2.jar 字节码注入、proguard代码混淆后的jar ./inject/xjar/springboot2.jar 字节码注入、proguard代码混淆、xjar字节码加密后的jar ./inject/xjar/xjar.go Go启动器源码文件 ./inject/xjar/xjar_agentable.go Go启动器源码文件
编译生成的xjar启动器, linux(x86/arm) 、windows请分别编译:
go build xjar.go
7、生成许可证密钥
使用JDK自带的 keytool生成密钥对
# 进入JDK的bin目录 cd ${JAVA_HOME}\bin #1 、生成密钥对,包含私钥和公钥。 keytool -genkey -keysize 1024 -keyalg DSA -validity 3650 -alias "myPrivateAlias" -keystore "myPrivateKeys.keystore" -storepass "abc123" -keypass "prv123" -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" # 查看 keytool -list -v -keystore myPrivateKeys.keystore -storepass "abc123" # 导出公钥证书 keytool -exportcert -alias "myPrivateAlias" -keystore "myPrivateKeys.keystore" -storepass "abc123" -file "myCertfile.cer" # 导入公钥(这一个命令在客户端执行) keytool -import -alias "myPublicAlias" -file "myCertfile.cer" -keystore "myPublicCerts.keystore" -storepass "abc123" # 查看公钥 keytool -list -v -keystore myPublicCerts.keystore -storepass "abc123" # 删除私钥 keytool -delete -alias myPrivateAlias -k