Skip to main content

Java运行时被杀软查杀的问题

问题描述#

java程序使用java bce或vme方式保护后,程序运行时会在临时目录释放我们的loader dll,在运⾏时调用该库去解密java⽅法中的字节码进而去执行程序功能。

当电脑上安装有杀毒软件时,由于杀毒软件检测不到loader dll的特征等信息,故将dll判断为病毒软件后被查杀,进而影响程序运行。

一般这种情况是在windows系统上容易出现。

方案描述#

方案一:

  1. 若是windows系统上,将dll库进行签名,尽可能的防止被查杀;
  2. 若是国产化系统,对so库进行签名。

方案二:

  1. 提交库文件提交到杀毒软件或者添加白名单;

注:以上方案只是一种策略,并不能确保不被杀毒软件查杀,根据实际情况而定。

获取dll方式#

Java bce方式#

1.将sjt_agent.jar包直接解压;

2.在sjt_agent\libs目录下找到sjt_windows_x64.dll和sjt_windows_x86.dll文件;

Java vme方式#

1.对jar包保护后将protected/test.jar直接解压,假如解压目录为test;

2.在test目录下找到loader_windows_x64.dll和loader_windows_x86.dll文件;

dll签名流程#

由于数字证书的目的是表明软件的签发日期和来源,防止软件被篡改,所以对dll进行数字签名,一般可防止dll被当病毒查杀。

若有受信任的机构颁发的正式证书,可使用正式证书对dll进行签名,若没有可自行创建测试证书进行签名。

以下流程介绍使用测试证书对loader dll进行签名的流程。

生成证书#

1.使用管理员权限打开VS开发人员命令行

2.使用Makecert.exe工具创建测试证书和私钥文件;

命令:Makecert -sv abc.pvk -r -n “CN=XXX公司” abc.cer注释:abc.pvk:创建一个密钥文件,来保存私钥,创建时需要输入一个密码;CN=XXX:指签名者的名称;abc.cer:指定保存生成的证书的文件名;

3.使用Cert2spc.exe工具创建发行者证书;

命令:Cert2spc abc.cer abc.spc注释:abc.spc:指生成的软件发布证书文件的文件名。

4.使用pvk2pfx.exe工具生成pfx证书文件;

命令:pvk2pfx -pvk abc.pvk -pi mypassword -spc abc.spc -pfx abc.pfx -f注释:mypassword:指创建pvk时输入的密码;abc.pfx:指生成的 PFX 格式证书文件的文件名。

使用signtool.exe工具对程序进行签名

命令:signtool sign /f abc.pfx /p <pwd> /t "http://timestamp.digicert.com" /fd SHA256 <文件名>注释:<pwd>:指创建pvk时输入的密码;<文件名>:指待签名的文件;

其他签名方式参考:https://learn.microsoft.com/en-us/windows/win32/seccrypto/using-signtool-to-sign-a-file

bce方式dll签名#

1.使用测试证书或正式证书对获取到的sjt_windows_x64.dll和sjt_windows_x86.dll文件进行签名;

命令参考:1. signtool sign /f abc.pfx /p 123456 /t "http://timestamp.digicert.com" /fd SHA256 sjt_windows_x64.dll2. signtool sign /f abc.pfx /p 123456 /t "http://timestamp.digicert.com" /fd SHA256 sjt_windows_x86.dll

签名成功后,查看dll的属性中的数字签名;

4.签名成功后,进入到解压目录下,将该目录下的所有文件在打包成jar包。

命令:jar -cfM0 sjt_agent.jar ./*

5.将原来的test_jar_protected/sjt_agent.jar替换成重新打包后的sjt_agent.jar

6.再次运行程序即可;

运行命令:java -javaagent:sjt_agent.jar -jar test.jar

vme方式dll签名#

1.使用测试证书或正式证书对loader_windows_x64.dll和loader_windows_x86.dll文件进行签名;

命令参考:1. signtool sign /f abc.pfx /p 123456 /t "http://timestamp.digicert.com" /fd SHA256 loader_windows_x64.dll2. signtool sign /f abc.pfx /p 123456 /t "http://timestamp.digicert.com" /fd SHA256 loader_windows_x86.dll

4.签名成功后,进入到解压test目录下,将该目录下的所有文件在打包成jar包。

命令:jar -cfM0 test-new.jar ./*

5.直接运行重新打包后的jar包即可;

java -jar test-new.jar

提交白名单#

1.jar包使用vme或bce方式保护后,获取dll文件

2.然后将获取到的dll提交到杀毒软件或者添加白名单方式,点击查看操作流程

问题#

1.对dll签名后一定能防止杀毒软件么?

答:对dll文件进行签名只是一种策略,并不能完全防止被杀毒软件查杀;

若签名后还是被杀毒软件查杀,则需要手动将dll加入白名单或者提交申诉。

2.java bce方式每次保护后生成的sjt_agent.jar都是变化的,所以每次加壳都需要重新签名,如何避免不重新签名?

答:将sjt_agent.jar解压后获取sjt_windows_x64.dll和sjt_windows_x86.dll文件,对该文件进行签名后,可直接指定签名后的文件来运行

运行命令:1)若是64位操作系统java -agentpath:sjt_windows_x64.dll -jar test.jar2)若是32位操作系统java -agentpath:sjt_windows_x86.dll -jar test.jar