Skip to main content

Java BCE方式保护最佳实践

Java程序介绍#

Java 是一种广泛使用的面向对象编程语言,因其语法简单、跨平台、拥有丰富又成熟的框架,开发效率高,所以大量的企业级系统都使用 Java 编写。

Java 程序可以构建为 jar 包、war 包或 class 文件,随着反编译工具的成熟,如果Java文件不保护时,反编译工具可以轻易的获取class 文件包含了类、方法、成员等信息,进而造成代码的泄露,因此对Java程序的保护变得尤为重要。

Java BCE方式介绍#

Java bce方式是对class中的所有⽅法的字节码加密,使用 Java Agent 技术以及重写 Java 类加载器,在运⾏时通过java agent机制在native层解密java⽅法中的字节码,再传递给jvm编译⽣成机器指令执⾏。

支持范围#

特点#

优点

  1. 字节码级别保护:Java bce方式是对class中的所有⽅法的字节码加密,可以防止jadx、jd-gui等反编译工具反编译出源码。

  2. 实时加解密:java class中的方法即时编译过程中每次仅解密一个方法在内存,方法使用完后将会在内存中清理,无法整体 Dump。

  3. 高兼容性:保护后的jar包和war包可以在jdk1.6以上的环境运行。

  4. 跨平台部署:保护时可选择所需运行平台,保护后的程序可多个平台运行。

  5. Jar或War包防盗用:保护时设置密码(默认随机),可防止Jar或War包被盗用。

  6. 保护嵌套jar包:保护时可同时选择jar包内嵌套的jar包,操作简单便捷。

  7. 性能影响:运行过程中的性能损耗很小。

缺点

  1. 保护后的jar包无法被其他项目调用,只能运行;

  2. 运行时环境需要配置Java Agent才能运行保护后的Java文件。

运行环境#

操作系统X86X64ARM32ARM64loongarch
Windows✔️✔️N/A不支持N/A
Linux✔️✔️✔️✔️✔️
macOSN/A✔️N/A✔️N/A

功能介绍#

保护文件设置#

由于一个项目里可能存在多个jar包或jar包中含有嵌套jar包时,界面上可根据需求选择java文件,然后点击确定将选中的文件添加到Java文件列表里,如图所示:

运行平台#

由于Java可跨平台使用,将Java项目入到Virbox Protector工具界面,会自动显示支持的平台。

windows和Linux系统上,如图所示:

macOS系统上,如图所示:

以上分别表示windows(x86和x64架构)、Linux(x86和x64架构)、Arm Linux(arm32和arm64架构)、macOS(x64架构和arm64架构),可根据自己需要的平台进行勾选.

注意

1.若一个运行平台都不勾选,则会保护不成功,提示"至少选择一个运行平台";

2.若要在macOS arm64平台上运行,建议在macOS系统上进行保护,需要启用签名默认对arm库进行签名;

3.若只能在windows或Linux系统上保护,但运行环境是在macOS arm64系统上,需要手动对sjt_agent.jar包里的库进行签名,查看如何手动对sjt_agent.jar包里的库进行签名文档。

保护指引#

Virbox Protector Java BCE版可使用界面或命令行方式保护Java文件,以下介绍界面操作和命令行操作保护java文件的流程,二者选其一即可。

界面操作#

待保护文件#

将待加密的jar包放到一个文件夹中。

添加目录#

1.将包含jar包的目录拖入工具中,加密选项可以设置输出目录;

2.运行平台可以根据自己需求选择。

Java文件设置#

切换到java文件设置界面,点击选择文件,选择待加密的jar、war包或嵌套jar包;

Java 密码:默认随机密码;建议设置一个密码,并牢记,重新加密时填写此密码,只需更换保护后的jar包,无需再更换配置sjt_agent.jar。

点击保护#

1.点击保护选中项目;

2.保护成功后会重新生成一个目录java程序_protected和项目配置文件;

3.打开目录java程序_protected,可看到加密后的jar包及sjt_agent.jar文件。

保护后效果#

使用反编译工具对保护后的jar包或war包进行反编译,查看效果,如图所示:

保护前:

保护后:

注意:Java BCE方式只保护代码逻辑,类名、方法名、注解、接口、静态属性等不保护。

命令行操作#

命令行工具#

Virbox Protector 支持命令行选项,可以指定基础保护选项和函数选项,方便自动化集成。

命令行工具 virboxprotector_con 的默认路径位于:

Windows:C:\Program Files\senseshield\Virbox Protector 3\binLinux:/usr/share/virboxprotector/binmacOS:/Applications/Virbox Protector 3.app/Contents/MacOS/bin

命令行选项#

使用命令行工具virboxprotector_con --help=java-bce可以查看java bce保护时的参数,如图所示:

参数介绍

选项命令行默认选项
Java 密码--java-pass=<password>随机
内嵌jar包--include-embedded=<value>0
运行平台--platforms=<platform_list>所有平台
输出路径-o <output_path>0

其中指定运行平台可以用 --platforms= 选项,举例如下:

指定Windows平台:

--platforms="windows-x86"

指定Windows和Linux双平台:

--platforms="windows-x86;linux-x86;linux-arm"

命令行保护示例#

只对java项目里文件保护

virboxprotector_con -java <java_dir> -o <java_dir_protected>

对java项目里jar包及jar包里嵌套的jar包进行保护,默认保护所有嵌套的jar包

virboxprotector_con -java <java_dir> --include-embedded=1 -o <java_dir_protected>

若只对jar包里某些嵌套jar包进行保护,需要使用Virbox Protector工具在界面上先选择好文件,然后保存选中配置后会在被保护的程序所在目录会生成.ssp配置文件,然后调用virboxprotector_con进行保护

virboxprotector_con -java <java_dir> -o <java_dir_protected>注:.ssp和java_dir在同一目录下时,保护时默认查找.ssp里的配置文件。

运行部署#

Jar包运行#

1.Jar包直接运行

在运行jar包时指定sjt_agent.jar文件目录。

1)若 sjt_agent.jar 和 jar 包在同一目录,进入到jar包的当前目录下直接执行,命令参考如下:

运行jar:java -javaagent:sjt_agent.jar -jar ***.jar运⾏class⽂件:java -javaagent:sjt_agent.jar ****

2)若 sjt_agent.jar 和 jar包 不在同一目录,需要指定文件的全目录,命令参考如下:

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

2.国产化部署

当需要在国产化系统上部署jar包,使用了东方通、金蝶、flink等中间件时,则保护后的jar包如何进行配置,点击参考sjt_agent.jar的配置场景文档。

War包运行#

保护后的war运行时需要根据当前启动war包的环境进行配置,且不同系统上配置sjt_agent.jar包的方式不一样,以下介绍在windows、Linux和macOS系统上的使用tomcat去运行war包时sjt_agent.jar的配置方式。

Windows系统#

在windows系统上分三种情况,根据tomcat的启动方式不一样,则sjt_agent.jar的配置方式也不一样,您可以根据实际运行情况选择其中一种运行方式进行参考。

第一种:通过startup.bat启动tomcat

1.在tomcat\bin目录下新建setenv.bat,文件中设置参数命令set CATALINA_OPTS=%CATALINA_OPTS% -javaagent:sjt_agent.jar的全路径,如图所示:

2.将保护后的war包放入到 .\apache-tomcat\webapps文件夹中;

3.执行startup.bat启动tomcat,则网页可正常运行。

第二种:在服务中启动启动tomcat

1.首选需要将tomcat服务给卸载,控制台命令service.bat uninstall;

2.在service.bat里的JvmOptions参数里加上 sjt_agent.jar,如图所示:

3.然后在控制台命令行里service.bat install

4.然后服务里启动tomcat ;

5.将保护后的war包放入到 .\apache-tomcat\webapps 文件夹中;

5.在服务(本地)中启动tomcat服务,则网页可正常运行。

第三种:直接使用tomcat9.exe启动服务

1.首先启动tomcat9w.exe;

2.在Java Options操作列表添加sjt库,如图所示:

3.然后运行tomcat9.exe启动tomcat服务,将保护后的war包放入到 .\apache-tomcat\webapps 文件夹中;

4.双击tomcat9w.exe直接启动tomcat服务,则网页可正常运行。

Linux系统#

1.在tomcat\bin目录下新建setenv.sh,文件中设置环境变量比如export CATALINA_OPTS="$CATALINA_OPTS -javaagent:sjt_agent.jar的全路径"的全路径,如图所示:

2.启动tomcat服务,可以查看到设置的CATALINA_OPTS参数;

3.将保护后的war包放入到 .\apache-tomcat\webapps 文件夹中,tomcat服务正常解析war包;

4.执行startup.sh启动tomcat,则网页可正常运行。

macOS系统#

1.在tomcat/bin目录下新建setenv.sh,文件中设置环境变量比如 CATALINA_OPTS="$CATALINA_OPTS -javaagent:/Users/sense/sjt/sjt_agent.jar"

2.启动tomcat服务,可以查看到设置的CATALINA_OPTS参数;

3.将保护后的war包放入到 .\apache-tomcat\webapps 文件夹中;

4.执行startup.sh启动tomcat,则网页可正常运行。

问题#

如何判断macOS系统上java是什么架构#

判断电脑上java环境是x64架构还是arm64架构,如果两个都存在的话⼀般 执⾏是java默认为x64架构,命令参考如下:

查看java位置命令:which java查看java⽂件类型:file /usr/bin/java

如何手动对sjt_agent.jar包里的库进行签名#

适用场景#

保护环境:只能在windows或Linux系统上保护

运行java架构:macOS arm架构java

运行系统:macOS arm64架构系统

问题现象#

1.若电脑上的java只为arm64架构,如图所示:

2.若sjt_agent.jar不签名时,则直接运⾏jar包;

3.出现以下错误,如图所⽰:

1)由于mach-O arm64架构的程序涉及到签名问题,故程序⽆法运⾏,提⽰"not valid  for use in process using Library Validation: Trying to load an  unsigned library"的错误;2)所以在程序进⾏修改后需要重新对其签名。

解决方案#

需要对 sjt_agent.jar目录下的sjt_darwin_a64.dylib进行签名。

1.解压 sjt_agent.jar 到指定⽬录( 假设解压⽬录名为sjt_files),找到sjt_darwin_a64.dylib库的位置,查看该库是否签名;

1)可直接解压sjt_agent.jar或使⽤命令"unzip sjt_agent.jar -d ./sjt_files" 2)进⼊./sjt_files/libs⽬录下,找到sjt_darwin_a64.dylib 3)验证sjt_darwin_a64.dylib是否签名:codesign -v sjt_darwin_a64.dylib

2.若⽂件未签名,将提⽰code object is not signed at all In architecture: arm64,如图所示:

3.对sjt_darwin_a64.dylib进行签名,操作步骤参考如下:

1)查看证书信息:security find-identity -v -p codesigning2)签名:codesign -fs <证书ID> sjt_darwin_a64.dylib3)再使⽤codesign -v sjt_darwin_a64.dylib验证签名是否成功,若成功则打印信息会显⽰为空。

4.将签名成功后sjt_darwin_a64.dylib重新打包到sjt_agent.jar包里

1)进⼊到解压的sjt_files⽬录下2)执⾏命令:jar -cfM0 <包名称> ./*  例如:jar -cfM0 sjt_agent_new.jar ./*3)将重新命名的sjt_agent_new.jar拷⻉到sjt_agent.jar⽬录下4)未签名的sjt_agent.jar包可删除,签名后的sjt_agent_new.jar保留(可将名字修改为sjt_agent.jar),进⾏替换。

5.再次执⾏jar包,则程序可运⾏成功。

VME⽅式和BCE⽅式如何共⽤#

答:必须先进⾏VME⽅式保护,在使⽤BCE⽅式保护。