Virbox Protector LM使用手册
产品介绍
软件自动保护工具 Virbox Protector,是深思数盾科技股份有限公司经过多年技术深耕开发的一款高强度自动保护(加密)工具。Virbox Protector 与 Virbox 客户端、Virbox 云锁许可、Virbox 软锁许可或精锐5硬件加密锁配套使用,集自动代码移植、混淆、代码加密等于一身,无需编程就能达到极高的保护强度,是业界领先的软件保护工具。
支持列表
支持多种架构,并且支持多种语言编译的程序,如图所示:
| 文件类型 | 支持系统 | 架构 | 语言 |
|---|---|---|---|
| .NET | Windows | x86、x64 | VB、C#等 |
| .NET Core3 | Windows | x86、x64 | C#、VB.net |
| PE | Windows | x86、x64 | C/C++、Delphi、PB、BCB等 |
| Unity3D | Windows、Linux、macOS、Android | x86、x64、ARM32 | C#等 |
| ELF | Linux、Android | x86、x64、ARM32、ARM64 | C/C++等 |
| Mach-O | macOS | x64 | C/C++、Objective-C、Swift |
| java | Windows、Linux、macOS、armlinux | x86、x64、arm | java |
获取更多帮助
您可以通过如下方式获取更多的帮助信息
客服电话:010-56730936
公司地址:北京市海淀区西北旺东路 10 号院 5 号楼软件园二期互联网创新中心 C 区 510
快速入门
界面功能
Virbox Protector (LM)工具包括标准版模式和专业版模式,点击功能对比查看两种模式的区别。
安装工具
1. 在 Virbox 开发者中心(http://developer.lm.virbox.com/)注册成为 Virbox 开发者,并申请成为正式开发者。
2. 在 Virbox 开发者中心下载 Virbox 开发者工具盒,不同厂商 SDK 相互独立,不可互用。
3. 安装 Virbox 开发者工具盒(windows平台),并下载最新版本 SDK 。
4. 使用 开发者管理工具签发一条许可并升级到 精锐5 中,或者通过 Virbox 开发者中心签发一条云许可/软许可。加密后的软件是依赖许可才能运行的。
5. 使用 Virbox Protector 工具对产品进行保护,提升安全性。
6. 发布保护后的产品。
切换模式
1.首次打开Virbox Protector (LM)工具默认为标准版模式;
2.点击"切换专业版模式",即可开启高级功能(需要联系深盾销售人员获取授权。);

3.获取到授权后在授权信息处点击“登陆授权账号”按钮,登陆有授权的账号。

4.授权账号登陆成功。
授权详情,可以查看到该账号当前的授权信息。
注销,账号注销后,授权详情里的所有绑定信息均会解绑。

5.若有许可的状态下即可对程序进行加壳保护。
SDK标签
SDK标签静态载入到需要保护的函数当中,生成可执行程序,Virbox Protector 加壳工具解析该程序界面就能够分析出SDK标识的函数,这样就能帮助用户找到核心代码所在的位置。
目前.NET、macOS、Native(包括PE、ELF和macho格式)、Java类型程序支持SDK标签。
| 类型 | 标准版(支持) | 专业版(支持) |
|---|---|---|
| NET | 代码混淆 | 代码混淆、代码虚拟化、自定义名称混淆 |
| Native | 代码混淆 | 代码混淆、代码虚拟化、自定义名称混淆 |
| macho | 代码混淆 | 代码混淆、代码虚拟化 |
| Java | / | 代码虚拟化 |
具体使用方法参考同目录下的SDK标签使用文档。
工具界面使用
安装目录结构
如下所示:
├─bin
│ ├─virboxprotector.exe
│ ├─virboxprotector_con.exe
│ └─dsprotector_con.exe
├─example
│ ├─plugin
│ │ └─demo
│ │ └─src
│ └─sdk
├─help
├─plugin
│ └─ds
└─sdk
使用流程
- Virbox Protector LM 工具主界面,如图所示:

- 可对文件列表中的文件进行批量保存。

- 文件加密保护成功,可运行或发布保护过后的文件。

工具界面功能
工具栏
工具栏处显示打开文件、保存选中配置等快捷按钮,在工具栏处右键点击还可以隐藏工具栏。
- 保存选中配置:指保存选中文件的设置的函数选项、加密选项等配置信息。
- 保存所有配置:指保存文件列表中所有文件的设置的函数选项、加密选项等配置信息。
- 保护选中项目:指将选中文件进行加密保护。
- 保护所有项目:指将文件列表中所有文件进行加密保护。

状态栏
Virbox Protector 工具的状态栏从左到右分别显示了被保护程序的文件的全路径、程序的类型以及程序的硬件机器版本。
文件目录列表
展示被保护文件的信息列表。
- 将文件拖入到 Virbox Protector 工具界面,工具界面展示文件信息。
- 鼠标焦点的文件右侧会显示程序的基本信息、函数选项、加密选项等信息,手动进行填写所需信息。
- 选中单个或多个文件,点击鼠标右键,在弹框列表中可对选中的文件进行批量解析、保存配置和保护等功能。
- 打开文件所在目录:指打开鼠标焦点的文件所在目录。
- 设置保护后输出目录:指将选中文件保护后输出的路径更改到指定的目录。

SDK信息
SDK 信息界面显示开发者 ID、API 密码、本地开发锁或云账号的信息。

开发者ID
开发者 ID 是开发商的唯一标识,每一个软件开发商 ID 均不一样,根据开发商 ID 定制编译的 SDK 也相互隔离。
其中 Virbox Protector LM 体系的工具界面开发者 ID 显示是通过 senseshield/sdk/sdkinfo.xml 中获取。
API密码
API 密码是一串32个字符表示的序列号,每一个软件开发商的SDK和库文件都是由唯一 API 密码定制编译的,多方面保证软件调用安全和唯一性,通过Virbox 开发者中心进行获取。
第一步:登录 Virbox 开发者中心
第二步、通过查看开发者信息,查看API密码获得,如下图所示:

本地开发锁
控制锁是不同开发者的身份标识,用于加解密、签发许可和签发用户锁升级文件等功能。只能与相同开发者的用户锁配套使用,不同开发者控制锁签发升级文件不能混用。
控制锁3.1.20版本及后续版本的开发锁默认支持PIN功能,3.1.20之前版本的开发锁不支持PIN功能。
PIN功能
PIN功能提升开发锁使用安全性,使用前必须输入正确PIN码才能正常使用开发锁完成许可签发、软件加壳等操作。在加壳工具中加密锁存在以下几种PIN状态的显示。
已启用PIN
开发锁已启用PIN,启用状态下,每次使用开发锁前必须进行PIN验证,验证通过后才能正常使用。
未启用PIN
开发锁支持PIN但未启用,未启用状态下,使用开发锁不需要进行PIN验证即可使用。不启用PIN降低了开发锁的安全性,不建议主动禁用PIN验证功能。
已验证PIN
开发锁支持PIN,并通过PIN验证,只有此状态下的开发锁能进行许可签发、软件加壳操作。
未验证PIN
开发锁支持PIN,但未通过PIN验证,在未输入正确PIN码通过验证前,开发锁将不允许进行许可签发、软件加壳操作。
云账号
指云控制锁,在 Virbox Protector LM 工具中登录开发者账户后可进行加壳。
【注意】:此处的云控制锁,登录的是开发者账户,而非普通的用户
基本信息
主要显示文件(夹)位置、文件创建时间、文件修改时间、文件最后访问时间和文件类型信息。
许可选项
许可类型
许可形式,保护后的软件可以使用的许可所在的载体,在使用Virbox Protector LM工具的时候,以下许可形式至少选择其中一种。
硬件锁
- 本地许可,指本地加密锁中的许可,表示插在用户本机器上的硬件锁。
- 网络许可,插在局域网内其他机器上的硬件锁中的许可。
云锁
- 云许可,云端虚拟的加密锁中的许可。
软锁
- 单机许可,用纯软件实现的加密锁,不依赖任何硬件锁,跟PC机器硬件唯一指纹绑定。
- 集团许可,一台绑定授权码软锁,其他客户端可通过网络共用服务器的软锁许可,但受到访问数量限制。
许可设置
许可ID
开发者用于管理用户软件版权控制与发放凭证的一个序列号,开发者能够在 Virbox 开发者中心 分发给普通的云账户,同时开发者也可以通过开发者管理工具为用户锁分发许可。
锁芯片号
一串32个字符表示的,能够唯一确定加密锁的序号,如果软件保护使用了指定的锁序列号,那么保护后的程序只能使用指定序列号的用户锁才能打开,通过 Virbox 用户工具获取。

后台检测时间间隔(s)
后台检测时间间隔(s),表示每隔多少秒对运行程序进行检测是否存在对应许可,如果没有那么就会提示错误,或者退出。如果后台检测时间设为0s,那么后台就不会进行检测许可的操作。
检测用户锁拔出消息
检测用户锁拔出消息,表示程序运行过程中拔掉用户锁时,直接进行许可查找,若找不到对应许可,则弹框提示信息。
注:后台检测时间间隔(s)和检测用户锁拔出消息两个为互斥关系。
许可运行时库
可调试
勾选此选项后,将默认使用slm_runtime_dev库,可对保护后的程序进行调试;

注意:
1. 由于Linux和macOS系统上没有调试库,故没有这个功能;
2. 发布版本时请务必不要勾选"可调试"选项。
外置
勾选此选项后,默认将runtime库放置程序旁边,将不会嵌入到程序内,以便减少程序体积;
多用于一个程序内有多个文件保护的场景,只生成一个runtime库,进而减少程序体积。
许可登录失败时卸载动态库
针对Autocad、NX等软件加载插件dll的程序,勾选此选项后,无许可时加载dll可自动卸载dll,保证软件不会退出。
该功能只适用PE程序,.NET程序由于没有机制支持自动卸载故无此功能。
兼容Electron
electron框架的程序由于其内核是沙箱机制的原因,在运行时会创建多个子进程,程序保护运行时由于ss在创建子进程的权限太低会导致程序运行提示“连接失败”;
若是electron框架的程序,建议勾选此选项。
函数选项
需要保护的具有重要价值的函数块,用户能够选择混淆、虚拟化、碎片化和代码加密的保护方式。
查看函数的详细信息
鼠标点击函数保护列表中的函数,在右侧的工作区窗口中展示函数的详细信息,包括函数的保护方式、函数名、函数的地址和汇编代码的展示。

添加函数
点击函数选项右侧【添加函数】按钮,进入到添加保护函数界面。
此界面会罗列出解析出程序中的函数模块(托管代码程序和非托管代码程序有细微的差别),选择单个或多个函数更改保护类型。
1)托管代码程序:函数名称为“命名空间+类名称+函数名称”。
2)非托管代码程序:函数名称为函数的va的值。
3)点击确定按钮,选择的函数将在函数列表中展示,点击保护选中项目进行加密程序。如图所示:

- 若保护过程中失败,提示“部分被保护的函数设置了不支持的保护方式“,需要将其更改为其他的保护方式后再进行加壳。如图所示:

全局搜索函数
在搜索框中输入关键字,程序会列出所有名称中包含关键字的函数块,支持模糊查询。
性能分析
点击性能分析按钮,运行需要保护的程序,执行正常的业务操作,然后关闭程序后,程序中各个函数模块调用的次数即可显示在列表中,参见上图。如果当前分析的程序位为ll程序,需要选择启动模块。
信息展示
可保护函数列表信息展示,显示了函数的总个数、已添加函数个数、混淆函数个数、碎片代码函数个数。

加密选项
输出文件(夹)
输出文件,可以修改程序保护后生成文件的路径和名称。
消息选项
许可消息提示
1.提示语言:指设置弹出消息框文字的语言,包括简体中文、英文,繁体。
2.许可失效提示形式:主要是用于设置,加壳后的程序找不到指定的许可的时候,如何进行提示。目前支持三种方式:
1)程序不提示消息,直接闪退;
2)弹出许可消息框提醒;
3)远程桌面服务会话消息框(支持vista和server2008以上版本等三种不同的提示形式;
4)子进程弹窗(针对于服务进程动态加载dll或iis服务的场景,可使许可弹窗能正常弹出)。
3.许可失效时冻结程序:当许可会话已经失效时,会弹出提示框,此时程序界面和进程将会被冻结。
4.显示用户登录按钮:当使用云锁和软锁时,程序运行找不到许可时,许可消息弹框上不会显示"登录"按钮。
5.延迟退出(s):当许可会话已经失效时,会弹出提示框,如果此时选择了“取消”那么您的程序会在设定的延迟退出时间到达的时候退出,这样做的目的是给客户提供了存档的时间。
6.提示标题:设置弹出消息框的标题信息。
自定义信息
对主要的许可消息框状态信息进行显示,开发者可按照一定的格式自定义编辑提醒消息,使保护后的程序更加的人性化的向用户展示许可状态信息。

云锁登录设置
1.首先许可形式选择云锁或软锁。
2.许可失效提示形式选择了“弹出许可消息框提醒”。
3.程序运行时找不到许可的情况下,会弹出云账号登陆框,如果此时登录出错那么本程序会显示对应的错误消息。
错误信息
定义了对应的错误码显示的提示信息,错误信息的格式为【8 位 16 进制错误码-错误信息】,可以添加错误消息也可以删除错误消息,如果没有自定义错误消息,那么加壳后的程序出现错误的时候会弹出系统错误信息。【详细的错误码介绍请参见 SDK 中的 ss_error.h 文件】
本地可执行程序保护
本地可执行程序包括 PE、ELF、Mach-O 文件格式。
基础保护
导入表保护
隐藏原程序中的导入表,保护程序的函数外部调用,可以达到干扰逆向分析、防脱壳的作用。
支持范围
目前仅支持 PE 格式的程序。
原理
去除原程序的导入表,将导入地址表(IAT) 替换为修复函数,由壳代码接管导入函数的跳转。
资源加密
资源加密是针对 PE 格式程序的资源进行加密的保护功能,可以防止程序中的资源信息被提取,篡改。
原理
在加壳时将 PE 格式程序中的资源抽取并加密,仅保护一些外部需要的资源(如图标、版本信息等),在程序执行时,在壳代码中再解密。
附加数据扩展
什么是附加数据?
附加数据一般是由某些编译器或打包工具,将一些数据(如音视频、数据库等)与原始的可执行程序拼接,这些数据一般在运行时被原始的程序读取,附加数据在执行时并不会直接被映射到内存中。
功能
由于加壳会改变原始程序文件,如果将附加数据直接拼接到保护后的程序,可能会导致运行时异常。
附加数据扩展使用了 Hook 手段使程序能正常读取到附加数据,另外对附加数据做了加密处理,防止数据被轻易窃取。
压缩
Virbox Protector 的压缩功能,其核心目的不是“压缩”,并非专为缩小程序体积而设计的。它真正的作用是将代码与数据段做了加密,并将原先的导入表与重定位信息隐藏了起来,再”顺便“将原先的数据做了压缩。
原理
将原始的代码段与数据包打包并压缩,将原始程序入口(OEP)替换为壳代码,运行时由壳代码将代码段与数据段还原,并进行一些重定位等操作,使程序能正常运行。
功能
防止静态反编译,防止程序被打补丁。
优点
1、能起到一层整体保护效果,可以隐藏程序的代码、数据和文件结构信息。
2、运行效率高,仅在程序被加载时轻微的性能损失。
缺点
1、壳代码执行完毕后,代码段与数据段会还原,可以被 Dump。
内存校验
- 内存校验是 Virbox Protector 实现的一种检测程序自身完整性的技术,可以对抗文件补丁、内存补丁、软件断点等,内存校验表和校验逻辑本身经过了自保护,以保证其安全性。
- 内存校验运行时在程序入口,壳代码会对每个要校验的内存块进行校验,以验证其完整性,如果校验失败,则会清场退出。
- 如果使用了 SDK 标签,则每次调用标签 VBProtectVerifyImage 时都会进行校验。
使用方法
将PE或ELF程序拖入到Virbox Protector工具中,加密选项就会显示“内存校验”选项,勾选上此选项,对程序进行保护,则保护后的程序将拥有此功能的效果。
反调试
通过平台相关API、数据结构和寄存器,检测调试器,主要防止保护后的程序被反编译工具(如gdb,windbg等)进行动态调试。
虚拟机检测
通过检测运行环境的特征来进行判断是否为虚拟机,主要防止保护后的程序在Vmware 等虚拟机上运行。
函数级保护
反RunTrace
注:反Run Trace功能主要是针对ARM架构的程序,加壳会默认自带该功能。
Run Trace是调试器提供的功能,用于单步执行每一条指令,并记录每条指令执行时的寄存器状态,是调试追踪和反混淆常用的手段。
ARM架构的程序使用了Virbox Protector代码混淆功能后,函数的指令会添加一些暗桩用于检测单步断点,检测到非法调试会执行一些错误的指令,干扰调试分析,使得程序无法正常运行或者调试器崩溃,从而进一步增强混淆后代码的安全性。
代码混淆
原理
代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。
Virbox Protector 支持对 x86/arm/.net il 系列指令进行混淆。
功能
扰乱原始指令,防止静态分析。
优点
1、防反编译,代码分析难度大。
缺点
1、运行效率有损失。
代码虚拟化
原理
将原始指令转换为自定义的虚拟机指令,交由配套虚拟机系统模拟执行。
功能
隐藏原始指令,防止代码逻辑分析。
优点
1、保护强度高,几乎不能被分析出原始的代码逻辑。
缺点
1、运行效率低。
代码加密(Native)
原理
代码加密是使用 SMC(Self-Modifying Code)技术,将原始的函数加密,在函数被执行时才将函数解密并执行的保护方式。
功能
防脱壳,防止直接 Dump。
优点
1、运行效率高,几乎没有性能损失。
缺点
1、函数执行后会解密,解密之后容易被分析。
碎片代码
将代码从原程序中抽取出来,加密后转移到安全环境执行。对软件授权和代码逻辑双重保护。
自动化保护
加壳工具解析PE程序时函数是以地址的方式显示,若有map/pdb文件则加壳工具解析PE程序时函数是以函数名的方式进行显示。
目前支持pdb和map文件,若两种文件同时存在,默认识别pdb文件。
使用map/pdb文件
1.使用 BCB 生成 map 文件
BCB全称(Borland C++ Builder),使用C++ Builder工具生成map文件。
- 工程设置如下图:


2.使用VC生成map文件
- 工程设置如下图:


3.使用 VS 生成 map 文件
工程设置如下图:


4.使用 VB6.0 生成 map 文件
- 工程设置如下图:

5.使用 Delphi 生成 map 文件
工程设置如下图:


生成ssp配置文件
将文件拖入到 Virbox Protector 工具中,手动更改信息后,点击“保存选中配置”或“保存所有配置”选项后,在和文件同一层目录下会生成一个 .ssp 配置文件。

命令行保护
命令参数解析
| 命令 | 描述(本地锁) | 描述(云锁) | 备注 |
| filename | 指准备保护的原文件 | / | |
| -o output | 指保护后输出文件路径 | ||
| -c local|cloud | 指使用硬件锁 | 指使用云锁 | 仅 Virbox Protector LM 体系工具有此命令 |
| -u username | / | 指 Virbox 云账户的用户名 | |
| -p password | 指 PIN 码 | 指 Virbox 云账户的密码 | |
以Windows上使用命令为例
【必选】使用 Virbox Protector界面工具生成配置文件
打开终端窗口,进入到“virboxprotector_con.exe”所在的路径,直接输入“virboxprotector_con.exe”运行可查看帮助信息
- 使用硬件锁对程序进行保护
命令:VirboxProtector_con.exe <demo> -c local -p <控制锁PIN码> -o <demo_vbp>
如图所示:
- 使用云账号对程序进行保护
命令:VirboxProtector_con.exe <demo> -c cloud -u <开发者账号> -p <开发者账号密码> -o <demo_vbp>
如图所示:
.NET程序选项
基础保护
名称混淆(.NET)
将 .net 的方法名类名使用随机字符串重新命名,导出和外部的名称不会改变。
保护效果图
保护前,如图所示:

保护后,如图所示:

压缩
Virbox Protector 的压缩功能,其核心目的不是“压缩”,并非专为缩小程序体积而设计的。它真正的作用是将代码与数据段做了加密,并将原先的导入表与重定位信息隐藏了起来,再”顺便“将原先的数据做了压缩。
原理
将原始的代码段与数据包打包并压缩,将原始程序入口(OEP)替换为壳代码,运行时由壳代码将代码段与数据段还原,并进行一些重定位等操作,使程序能正常运行。
功能
防止静态反编译,防止程序被打补丁。
优点
- 能起到一层整体保护效果,可以隐藏程序的代码、数据和文件结构信息。
- 运行效率高,仅在程序被加载时轻微的性能损失。
缺点
- 壳代码执行完毕后,代码段与数据段会还原,可以被 Dump。
保护效果图
保护前,如图所示:

保护后,如图所示:

JIT加密
描述
1、.NET JIT 加密,是将 .NET 所有方法的 IL 指令经过加密,仅在 .NET 虚拟机进行 JIT 编译阶段才解密,可以防止静态反编译,也能防止 IL 代码在内存被 Dump。
2、JIT 加密默认对所有方法进行加密,更进一步提升保护后代码的安全性。
3、JIT加密支持了继承、事件、反射、递归调用等代码加密无法支持的写法。
使用方法
将.NET程序拖入到Virbox Protector工具中,加密选项就会显示“JIT加密”选项,勾选上此选项,对程序进行保护,则保护后的程序将拥有此功能的效果。
资源加密
描述:加密.NET资源,防止资源被提取。
使用方法
将.NET程序拖入到Virbox Protector工具中,加密选项就会显示“资源加密”选项,勾选上此选项,对程序进行保护,则保护后的程序将拥有此功能的效果。
去除强签名
- 强名称(StrongName)使.NET提供的一种验证机制, 主要包括标识版本和标识原作者。
- 强名称可以用来帮助用户验证自己得到的程序是否为原作者所写切没有被修改(例如添加恶意代码), 跟自校验有点类似。
- 因此添加了强名称的程序加壳时要去除强名称, 并在加壳后重新添加强名称。
字符串加密
描述:加密代码中的敏感字符串,防止反编译工具直接搜索到相关的函数。
使用方法
将.NET程序拖入到Virbox Protector工具中,加密选项就会显示“字符串加密”选项,勾选上此选项,对程序进行保护,则保护后的程序将拥有此功能的效果。
函数级保护
代码加密(.NET)
原理
代码加密是使用动态代码技术,将原始方法字节码加密,执行时才将方法解密并执行的保护方式。
功能
防脱壳,防止直接 Dump。
优点
1、运行效率高,几乎没有性能损失。
缺点
1、方法执行后会解密,解密之后容易被分析。
保护效果图
保护前,如图所示:

保护后,如图所示:

代码加密不支持类型
针对C#程序选择函数的保护方式为代码加密时,加壳时提示“部分被保护函数设置了其不支持的保护方式,请前往函数选择界面更改保护方式。[0xA000A000]”的情况,以下列出代码中不支持的写法:
值类型(及其继承类)的非静态方法 System.ValueType
泛型方法暂不支持
C++ .net不支持
递归调用不支持
可变参数不支持
默认参数不支持
代码虚拟化
原理
将 .NET 方法中的 IL 指令转换为自定义的虚拟机指令,运行时在自定义虚拟机中执行。
功能
防止代码被脱壳还原,防止逆向分析。
优点
- 安全性高。
缺点
- 有性能损失。
代码碎片化
将代码从原程序中抽取出来,加密后转移到安全环境执行。对软件授权和代码逻辑双重保护。
保护效果图
保护前,如图所示:

保护后,如图所示:

代码混淆
原理
代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。
Virbox Protector 支持对 x86/arm/.net il 系列指令进行混淆。
功能
扰乱原始指令,防止静态分析。
优点
1、防反编译。
缺点
1、运行效率略有损失,保护强度不高。
保护效果图
- 保护前,如图所示:

- 保护后,如图所示:

Unity3D程序保护
PC平台
界面使用流程
针对Windows、Linux和macOS系统上的Unity3D程序,将Unity3D目录直接拖入到加壳工具中;
加密选项设置:
mono格式:加密选项处默认会加载程序中的Assembly-CSharp.dll和Assembly-CSharp-firstpass.dll文件,也可以添加Managed目录下自主开发的C# 程序集;

il2cpp格式:加密选项处默认对元数据(global-metadata.dat)进行保护;

可以直接在资源加密选项处点开启用按钮,可以对Unity3D中的资源文件进行加密保护;【注】资源加密选项建议仅加密默认选择的资源。

加壳成功后会生成Unity3D目录名_protected,可以直接运行。
Android平台
界面使用流程
1.提供开发商ID,由深思单独编译arm sdk包,并进行runtime库配置;
runtime库配置:
1. Android unity apk或aab是ARMv7架构的,将SDK中sdk\C\lib\libslm_runtime.so改名为slm_runtime_android_a32.so,将文件拷贝到Virbox Protector工具的安装bin目录下;
2. Android unity apk或aab是ARMv8架构的,将SDK中sdk\C\lib64\libslm_runtime.so改名为slm_runtime_android_a64.so,将文件拷贝到Virbox Protector工具的安装bin目录下。
3. 由于不支持对Android Unity3d的x86架构的保护,所以需解压包比如7z打开apk查看一下,若存在lib\x86文件夹,需要将其给删除。

2.将改好的Android Unity3d apk/aab直接拖入到加壳工具中;
3.授权信息登录已经获取到授权的账号,点击授权详情,查看是否有该授权;
4.设置许可选项,勾选本地许可,并设置许可ID(Android不支持云锁和软锁加壳);
5.在加密选项处进行设置:
- 勾选内存校验,壳代码会对每个要校验的内存块进行校验,以验证其完整性,如果校验失败,则会清场退出。
- 勾选Metadata加密,是加密 il2cpp 的 global-meta-data 文件,并对内部结构进行混淆处理,防止运行时在内存中直接解析。
- 勾选Metadata名称混淆,是 il2cpp 的 global-meta-data 文件中的方法名进行混淆处理。
- 勾选反调试按钮,则使用调试工具调试时,程序会直接退出。
- 勾选签名校验按钮,且进行签名设置,输入自己的keystore文件和密码(密钥别名和密钥密码选填)。
- 勾选反注入,可以防止其它进程对 APK或AAB 进程附加调试或注入。
- 勾选模拟器检测,可以防止程序在“夜神”“雷电”等模拟器中运行。
- 勾选root检测,可以防止程序在root过后的手机上运行。
- 勾选多开检测,可以防止程序多开分身。
- 启用签名,配置签名文件和密钥,加固后的应用带签名。
6.可以直接在资源加密选项处点开启用按钮,可以对Unity3D中的资源文件进行加密保护;
7.保护所选项目按钮,等待完成即可。
命令行保护
Android端Unity程序
将apk/aab应用拖入到加壳工具界面,使用Virbox Protector界面工具生成配置文件;
打开获取到的SDK包;
1)若是ARMv7架构的,将SDK中sdk\C\lib\libslm_runtime.so改名为slm_runtime_android_a32.so;
2)若是ARMv8架构的,将SDK中sdk\C\lib64\libslm_runtime.so改名为slm_runtime_android_a64.so;
3)然后将文件拷贝到Virbox Protector工具的安装bin目录下。
打开终端窗口,进入到“virboxprotector_con.exe”所在的路径,直接输入“virboxprotector_con.exe”运行可查看帮助信息;
针对不同平台的程序,对其许可的限制不同,需要联系深思销售获取许可;
使用
virboxprotector_con命令对apk/aab应用进行保护;云账号:
VirboxProtector_con.exe <apk/aab> -c cloud -u <开发者账号> -p <开发者账号密码> -o <vbp-apk/aab>
控制锁:
VirboxProtector_con.exe <apk/aab> -c local -p <控制锁PIN码> -o <vbp-apk/aab>
PC端Unity程序
将Unity程序文件夹拖入到加壳工具界面,使用Virbox Protector界面工具生成配置文件;
打开终端窗口,进入到“virboxprotector_con.exe”所在的路径,直接输入“virboxprotector_con.exe”运行可查看帮助信息
使用
virboxprotector_con命令对unity文件夹进行保护;
云账号:
VirboxProtector_con.exe <unity> -c cloud -u <开发者账号> -p <开发者账号密码> -o <vbp-unity>
控制锁:
VirboxProtector_con.exe <unity> -c local -p <控制锁PIN码> -o <vbp-unity>
保护原理
- 解析 Assembly-CSharp.dll 脚本文件,将 function 转换成 IL 代码。
- 将 IL 代码进行加密,其中密钥为每次随机生成,保持到脚本文件中。
- 如果使用 LM 版本的壳,加解密使用锁内密钥。
- 链接重新生成 Assembly-CSharp.dll 脚本文件,此时所有代码已经被加密。
- 对 Unity3D 的 .NET 运行时库 mono 进行处理,定位到解析 .NET 方法的函数并进行 hook。
- 插入 hook 代码对 Assembly-CSharp.dll 的方法解密,重新编译生成新的 mono 并替换原始动态库。
保护效果图
- 下图为 Assembly-CSharp*.dll 脚本文件的保护效果图。
- 保护前,如图所示:

- 保护后,如图所示:

- 保护前,如图所示:
- Unity3D资源文件的保护效果,可以使用反编译工具(例:AssetStudio)对Unity3D资源进行反编译查看一下效果。
- 原始Unity3D资源文件反编译效果,如图所示:

- 对resS、assets和resource资源文件进行保护后的反编译效果,如图所示:

- 原始Unity3D资源文件反编译效果,如图所示:
Unity3D调用dll插件
首先查找Unity编译器中mono.dll或mono-2.0-bdwgc.dll的位置。
- mono.dll一般在.\Editor\Data\Mono\EmbedRuntime目录下。

- mono-2.0-bdwgc.dll一般在.\Editor\Data\MonoBleedingEdge\EmbedRuntime。

- mono.dll一般在.\Editor\Data\Mono\EmbedRuntime目录下。
可以创建了一个假的Unity3d程序目录,目录和普通Unity3d目录结构一样,主要是为了加壳工具可以识别并成功加壳。以下为mono-2.0-bdwgc为例
1)将mono-2.0-bdwgc.dll放入bin\MonoBleedingEdge\EmbedRuntime\目录下。
2)将dll插件(比如demo.dll)放入到bin\data\Managed目录下。

将bin目录拖入到加壳工具中。
1)设置许可。

2)进入到加密选项,点击添加程序集。

3)添加成功后,将多余的程序集给删除掉,保留自己的插件dll。

4)点击“保护选择项目”,进行加壳,加壳成功后会生成ssp.bin。

进入到ssp.bin目录下,将ssp.bin\MonoBleedingEdge\EmbedRuntime下的mono-2.0-bdwgc.dll拷贝到Editor\Data\MonoBleedingEdge\EmbedRuntime目录下(原始文件备份),将ssp.bin\data\Managed目录下的demo.dll放入到项目中即可。
不插锁情况下运行会弹出提示“找不到许可”或运行过程中拔锁会提示“找不到许可”。
Java程序保护
由于Java 源代码编译后生成的 class 文件由于包含类名、方法名、变量等信息,很容易被反编译,且反编译后几乎可以达到与源代码一致的效果,为了java的安全,VirboxProtector工具针对java程序实现两种保护方式,分为BCE和VME两种,两者区别:
1、原理不同
BCE方式:加密 Java 方法中的 JVM 字节码,仅在方法即时编译(JIT)过程中解密,每次仅解密一个方法在内存,无法整体 Dump。
VME方式:将 JVM 字节码转换为自定义的虚拟机指令,运行时跳转至 自定义的Native 虚拟机中执行,安全强度高,无法被任何已知工具还原出原始 Java 代码。
2、安全性不同
高:VME方式保护的jar包 > BCE方式保护的jar包。
3、加壳方式不同
BCE方式,需要将jar包所在的目录直接拖入到加壳工具中,进行加壳。
VME方式,需要将jar包直接拖入到加壳工具中,进行加壳。
4、保护内容不同
BCE方式:加密 jar/war/class 中的 Java 方法,且对java代码中使用的方法没有要求。
VME方式:加密java程序中的函数,虚拟化保护 Java 程序中的 JVM 字节码,仅支持jar和war包,不支持class文件;
且vme方式暂时不支持java代码中使用构造方法、析构方法、反射方法的代码,默认跳过不保护;
也不支持直接对jar里内嵌jar包保护,若想要保护,需要把内嵌jar包单独弄出来进行保护。
5、运行方式不同
BCE方式:运行时需要指定sjt_agent.jar。
VME方式:不需要指定任何文件,原程序如何运行的,保护后的程序也如何运行。
6、支持范围相同
bce方式和vme方式均支持Windows(x86和x64)、Linux(x86和x64)、ARM Linux(arm32和arm64)、macOS(x64和arm64)平台架构。
7、各平台上操作相同
在Windows、Linux和macOS平台上,每个平台上使用BCE和VME的保护方式相同,基本上无任何区别。
8、sdk标签支持不同
BCE方式:不支持SDK标签
VME方式:支持SDK标签
BCE方式
界面保护流程
1.将jar包所在的目录(比如:javatest)直接拖入到加壳工具中,点击”保护选中项目“,保护成功后会默认生成javatest_protected(加密选项处可自行设置保护输出文件目录)。
注意:Java密码设置选项
(假设待保护目录为javatest和javatest1)
1、若默认为空,javatest和javatest1加密后所生成的sjt_agent.jar 不可通用;
2、若设置密码,javatest和javatest1加密时使用相同密码,则sjt_agent.jar 可通用;
3、若设置密码,javatest和javatest1加密时使用不同密码,则sjt_agent.jar 不可通用;
jar包保护后程序运行
1、进入保护后的ssp.javatest目录;
2、启动终端;
3、执行命令:
运行jar包:java -javaagent:sjt_agent.jar -jar ***.jar
运行class文件:java -javaagent:sjt_agent.jar ****
运行war包:需要将sjt_agent.jar配置到运行环境里
war包保护后程序运行
war保护成功后的文件结构如下所示:

1.Windows系统
以下配置方法不能互相兼容,需选其一:
tomcat目录下设置setenv.bat
1)在tomcat\bin目录下新建setenv.bat,文件中设置环境变量比如,set CATALINA_OPTS=%CATALINA_OPTS% -javaagent:sjt_agent.jar的全路径,如图所示:

2)将保护后的war包放入到
.\apache-tomcat\webapps文件夹中,直接启动tomcat服务即可运行。若启动tomcat时在服务中启动
1)首选需要将tomcat服务给卸载,控制台命令service.bat uninstall;
2)在service.bat里的JvmOptions参数里加上sjt库,如图所示:

3)然后在控制台命令行里service.bat install;
4)然后服务里启动tomcat ;
5)将保护后的war包放入到
.\apache-tomcat\webapps文件夹中,直接启动tomcat服务即可运行。若是直接使用tomcat9.exe启动服务
1)首先启动tomcat9w.exe;
2)在Java Options操作列表添加sjt库,如图所示:

3)然后运行tomcat9.exe启动tomcat服务,将保护后的war包放入到
.\apache-tomcat\webapps文件夹中,直接启动tomcat服务即可运行。
2.Linux系统
tomcat目录下设置setenv.sh
1)在tomcat\bin目录下新建setenv.sh,文件中设置环境变量比如CATALINA_OPTS="$CATALINA_OPTS -javaagent:sjt_agent.jar"的全路径,如图所示:

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

3)将保护后的war包放入到
.\apache-tomcat\webapps文件夹中,tomcat服务正常解析war包,网页即可运行。
注:若配置系统环境变量后,即使指定sjt库的位置,java运行也会先走系统环境变量里的配置。
3.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 文件夹中,tomcat服务正常解析war包,网页即可运行。
jar和war包保护效果
1.使用jd-gui对jar和war包反编译效果:

2.使用Virbox Protector工具保护后对jar和war包反编译效果:

VME方式
目前只有专业版许可壳支持VME方式。
界面保护流程
1.将jar包文件直接拖入到加壳工具中;
2.函数选项处。添加所需函数,并选择虚拟化保护;
3.点击”保护选中项目“,保护成功后会默认生成protected/***.jar(加密选项处可自行设置保护输出文件目录);
命令行保护
1.使用Virbox Protector界面工具生成配置文件;
2.打开终端窗口,进入到“virboxprotector_con”所在的路径,直接输入“virboxprotector_con.exe”运行可查看帮助信息;
3.使用virboxprotector_con进行保护;
BCE方式
云账号:
VirboxProtector_con.exe -java <jar_dir> -c cloud -u <开发者账号> -p <开发者账号密码> -o <jar_dir_protected>
控制锁:
VirboxProtector_con.exe -java <jar_dir> -c local -p <控制锁PIN码> -o <jar_dir_protected>
VME方式
云账号:
VirboxProtector_con.exe <jar> -c cloud -u <开发者账号> -p <开发者账号密码> -o <jar_protected>
控制锁:
VirboxProtector_con.exe <jar> -c local -p <控制锁PIN码> -o <jar_protected>
VirboxProtector插件
.NET程序集合并
界面操作
.NET 程序集合并功能,可以将 .NET 格式的可执行程序(.exe)及动态库(.dll)合并为一个模块,可以消除模块间的依赖,再对其进行保护可以起到更好的名称混淆效果。
可以在 Virbox Protector 工具菜单下打工合并界面:

合并完成后,可以删除除了主程序集外的其它被合并的 dll。
主程序集
合并后生成的主程序集,可以是 exe 或 dll。
合并注意事项
- 合并模块必须是 .NET 格式的程序,可以是 .exe 或 .dll。
- 除了合并的主程序集模块,其它模块不能被未合并的模块依赖,否则运行时会因找不到模块而异常。
命令行操作
使用 -ilmerge 选项进行合并:
virboxprotector_con -ilmerge <main_assembly> <other_assemblies ...> -o <output_path>
举例
virboxprotector_con -ilmerge Project.exe MyLibrary1.dll MyLibrary2.dll -o Merged/Project.exe
DS插件
DS插件是配合DSProtector工具对调用资源或脚本文件的解释器进行保护的插件;
对Python/PHP 等脚本语言保护,请参考同目录下的《DS.pdf》文档。
常见问题
其他平台上使用VirboxProtectorLM
目前Virbox开发者工具盒只有Windows版,故Linux和macOS平台上,需要单独安装SDK和Virbox用户工具,才能使用授权壳。
Linux
在深思数盾官方网站下载对应系统的
Virbox用户工具进行安装使用;将Windows平台上Virbox开发者工具盒的安装目录下的 sdk\API\Linux目录拷贝到Linux 系统上,执行copy_lib_share.sh 脚本文件进行安装SDK;

将Virbox Protector (LM)版本拷贝到Linux系统上,使用root权限运行./virboxprotector后,界面即可识别SDK信息;
将程序拖入加壳工具界面中,可对程序进行保护使用。
macOS
在深思数盾官方网站下载对应系统的
Virbox用户工具进行安装使用;将Windows平台上Virbox开发者工具盒的安装目录下的sdk\API\mac目录拷贝到macOS系统上,执行copy_lib_share.sh 脚本文件进行安装SDK;

将Virbox Protector (LM)版本拷贝到macOS系统上,使用root权限运行./virboxprotector后,界面即可识别SDK信息;
将程序拖入加壳工具界面中,可对程序进行保护使用。
ArmLinux平台
1.需要联系深思销售单独获取Arm linux平台下的SDK;
2.将sdk目录下库修改名字后,放入到Virbox Protector (LM) Professional加壳工具中的bin目录下;
若使用硬件锁,只需修改 ss_runtime 库的命名即可。
若使用云锁或软锁,需要修改 user_login 和 ss_runtime 库的命名
名字修改规则如下:
| sdk库 | sdk原始命名 | sdk修改后的名字 |
|---|---|---|
| runtime库 | lib\libslm_runtime.so | slm_runtime_linux_a32.so |
| lib64\libslm_runtime.so | slm_runtime_linux_a64.so | |
| user_login库 | lib\libss_user_login.so | ss_user_login_linux_a32.so |
| lib64\libss_user_login.so | ss_user_login_linux_a64.so |
Android平台
1.需要联系深思销售单独获取Android平台下的SDK;
2.将sdk目录下库修改名字后,放入到Virbox Protector (LM) Professional加壳工具中的bin目录下;
名字修改规则如下:
| sdk库 | sdk原始命名 | sdk修改后的名字 |
|---|---|---|
| runtime库 | armeabi-v7a\libslm_runtime.so | slm_runtime_android_a32.so |
| arm64-v8a\libslm_runtime.so | slm_runtime_android_a64.so | |
| x86\libslm_runtime.so | slm_runtime_android_x86.so | |
| x86_64\libslm_runtime.so | slm_runtime_android_x64.so | |
| user_login | armeabi-v7a\libss_user_login.so | ss_user_login_android_a32.so |
| arm64-v8a\libss_user_login.so | ss_user_login_android_a64.so | |
| x86\libss_user_login.so | ss_user_login_android_x86.so | |
| x86_64\libss_user_login.so | ss_user_login_android_x64.so |
加密后的软件被杀毒软件拦截
- 问题描述:使用加壳工具对开发者软件进行加壳,然而加密后的程序被 360 等杀毒软件认为是病毒软件。
- 解决方法:提交 360 认证
- 软件中可执行文件(不包含驱动程序 .sys)及打包后的可执行文件使用沃通(Wosign)签名(使用沃通代码签名工具并且购买代码签名证书进行签名,沃通签名相关问题请咨询沃通官方网站客服人员,沃通签名在 360 认证过程有很大帮助)。
- 注册并登录 360 开放平台:http://open.soft.360.cn/
- 在“我的软件”页面中选择提交我的软件,如下图:
- 选择“仅安全检测”,并填写软件名称,软件版本(主要为了后续记录查看),提交方式可以选择本地上传安装包,然后提交软件。

- 同时可以在“软件列表”中查看已经提交过的待检测软件和“通过检测”的软件。目前软件提交后通过检测的时间大约为1天。
不支持列表
由于程序代码语言、书写规范、平台和架构等影响编译出的程序有部分Virbox Protector目前不支持保护,请参考下表:
| 类型 | 不支持的情况列表 | |
| 其他 | 不支持二次加壳,无论是第三方还是本程序加壳后的文件,都不能再次进行加壳 | |
| 不支持带有自校验检查的程序 | ||
| 文件类型 | .NET | 暂不支持带有程序集签名(强签名)的程序进行加壳 |
| .NET加壳不支持第三方运行时库,只支持微软标准运行时库 | ||
| SDK标签不支持.NET程序 | ||
| C#开发的.NET程序或DLL库中含有外部引用或公开的方法,此类程序不能加名称混淆,若选择名称混淆会改变方法名,会使程序某个函数无法正常使用 | ||
| .NET 的AnyCPU加压缩后不支持被其他的.NET 模块引用,原因是加压缩后会将.NET程序类型变为PE32 | ||
| Linux和macOS上Dotnet Core3 的dll不支持压缩功能和JIT加密 | ||
| LM许可壳暂不支持对Linux和macOS上Dotnet Core3 的dll进行加壳 | ||
| PE | PPT转exe的程序不支持资源保护 | |
| VB6.0语言程序不能加资源保护 | ||
| 导入表:导入的符号必须都是函数,不能有导入变量,否则运行时程序会崩溃 | ||
| 如果被保护的程序使用了内存加载方式执行,压缩后无法运行 | ||
| ELF | Linux的程序暂不支持附加数据 | |
| 不支持-static编译的ELF格式的程序 | ||
| ELF文件不支持map文件分析 | ||
| 如果默认选项导出了所有符号,可能在运行时会崩溃,建议只导出需要导出的函数 | ||
| pyinstall转成的Linux可执行文件的暂不支持压缩 | ||
| 暂不支持go语言静态编译的 ELF文件,支持go语言动态编译的ELF文件 | ||
| 保护选项 | 代码加密 | 由解析器通过引用分析得到的函数(函数列表中没有名称的函数),可能存在外部入口而不支持 |
| 函数指令字节过小,不能保护 | ||
| 混淆/虚拟化/碎片化 | 对于 ELF 和 Mach-O 格式的程序,如果函数被优化为使用了“野栈”,则不支持保护 | |
| 函数指令字节过小,不能保护 | ||
| ARM架构程序不支持碎片化 | ||
已知问题
.NET 加壳不支持第三方运行时库,只支持微软标准运行时库。
使用命令行加壳时,其目标程序的配置文件必须存在。
在.NET程序中使用类似 GetField("name", bindingAttr) 函数时,加壳后名称混淆可能出现异常,如果 .NET 程序加壳后运行失败,尝试去掉名称混淆。
对函数块进行碎片化代码保护的时候,存在不能成功保护的情况,主要原因是,碎片代码对指令的长度过小,指令可能不可移植,存在跳转等情况。
AutoCAD 的 ARX 插件程序只能选择“远程桌面服务会话消息框”,并且目前只支持 win7 和 server2008 以上的版本。
如果用户的机子上装有杀毒软件 AVAST,可能会出现加壳后的程序无法运行的情况。导致此问题的原因是,当加壳程序运行的时候 AVAST 会杀死加壳程序的进程。
暂不支持带有程序集签名(强签名)的程序进行加壳。