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编译⽣成机器指令执⾏。
#
支持范围#
特点优点
字节码级别保护:Java bce方式是对class中的所有⽅法的字节码加密,可以防止jadx、jd-gui等反编译工具反编译出源码。
实时加解密:java class中的方法即时编译过程中每次仅解密一个方法在内存,方法使用完后将会在内存中清理,无法整体 Dump。
高兼容性:保护后的jar包和war包可以在jdk1.6以上的环境运行。
跨平台部署:保护时可选择所需运行平台,保护后的程序可多个平台运行。
Jar或War包防盗用:保护时设置密码(默认随机),可防止Jar或War包被盗用。
保护嵌套jar包:保护时可同时选择jar包内嵌套的jar包,操作简单便捷。
性能影响:运行过程中的性能损耗很小。
缺点
保护后的jar包无法被其他项目调用,只能运行;
运行时环境需要配置Java Agent才能运行保护后的Java文件。
#
运行环境操作系统 | X86 | X64 | ARM32 | ARM64 | loongarch |
---|---|---|---|---|---|
Windows | ✔️ | ✔️ | N/A | 不支持 | N/A |
Linux | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
macOS | N/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⽅式保护。