Virbox Protector LM 软件加密+授权
产品介绍
软件自动保护工具 Virbox Protector,简称独立加壳工具,是深思数盾科技股份有限公司经过多年技术深耕开发的一款高强度自动保护(加密)工具。Virbox Protector 集自动代码移植、混淆、代码加密等于一身,无需编程就能达到极高的保护强度,是业界领先的软件保护工具。Virbox Protector 一共推出了独立保护版、试用版、许可关联版和魔锐版,可以针对不同平台、不同文件格式进行加密保护,支持几乎所有主流开发语言, 并且,可以在不同平台上进行交叉保护,是软件加密保护领域的不二选择。
本文档主要介绍 Virbox Protector (LM) Standard 和 Virbox Protector (LM) Professional 的使用手册,有关 Virbox Protector 独立版 和 Virbox Protector (Moway) 等版本的使用手册,请参考相关文档。
版本对比
产品名称 | 描述 | 收费模式 | 目标平台 | 备注 |
---|---|---|---|---|
Virbox Protector (LM) Standard | 标准版,Virbox LM SDK 中自带,必须使用精锐5/云/软许可,支持 macOS、Linux、Windows 系统。 | 免费,永久使用 | Windows、Linux、macOS | |
Virbox Protector (LM) Professional | 在标准版基础上,增加 ARM-Linux,Android SO 和 Android Unity3D的保护 | 标准版之外每个平台单独购买(永久模式、订阅模式) | Windows、Linux、macOS、ARM Linux、Android | 将自动安装 Virbox 用户工具和反黑引擎用于自我保护 |
支持列表
支持多种架构,并且支持多种语言编译的程序,如下表所示。
文件类型 | 支持系统 | CPU 架构 | 开发语言 |
---|---|---|---|
.NET | Windows | x86、x64 | VB、C#等 |
.NET Core3 | Windows、Linux、macOS | 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 | x86、x64 | java |
获取更多帮助
您可以通过如下方式获取更多的帮助信息
官方网址:https://lm.virbox.com/
客服电话:010-56730936
公司地址:北京市海淀区西北旺东路 10 号院 5 号楼软件园二期互联网创新中心 C 区 510
获取方式
Virbox Protector (LM) Standard
- 在 Virbox 开发者中心(http://developer.lm.virbox.com/
)注册成为 Virbox 开发者,并申请成为正式开发者。
- 在 Virbox 开发者中心下载 Virbox 开发者工具盒,不同厂商 SDK 相互独立,不可互用。
- 安装 Virbox 开发者工具盒,并下载最新版本 SDK ,SDK中会携带标准版 Virbox Protector (LM)
注意:Virbox 开发者工具盒目前只有 Windows版,若需要在 Linux、macOS 等其他平台若使用 Virbox Protector 工具,需要进行单独的配置。
Virbox Protector (LM) Professional
需要联系深思数盾销售人员获取。
Virbox Protector 界面使用
安装目录结构
如下所示:
├─bin
│ ├─virboxprotector.exe
│ ├─virboxprotector_con.exe
│ └─dsprotector_con.exe
├─example
│ ├─plugin
│ │ └─demo
│ │ └─src
│ └─sdk
├─help
├─plugin
│ ├─anti
│ └─ds
└─sdk
使用流程
1、Virbox Protector LM 工具主界面,如图所示:
2、可对文件列表中的文件进行批量保存。
3、文件加密保护成功,可运行或发布保护过后的文件。
Virbox Protector LM界面功能
工具栏
工具栏处显示打开文件、保存选中配置等快捷按钮,在工具栏处右键点击还可以隐藏工具栏。
- 保存选中配置:指保存选中文件的设置的函数选项、加密选项等配置信息。
- 保存所有配置:指保存文件列表中所有文件的设置的函数选项、加密选项等配置信息。
- 保护选中项目:指将选中文件进行加密保护。
- 保护所有项目:指将文件列表中所有文件进行加密保护。
SDK信息
SDK 信息界面显示开发者 ID、API 密码、本地开发锁或云账号的信息。
开发者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 工具界面,工具界面展示文件信息。
- 鼠标焦点的文件右侧会显示程序的基本信息、函数选项、加密选项等信息,手动进行填写所需信息。
- 选中单个或多个文件,点击鼠标右键,在弹框列表中可对选中的文件进行批量解析、保存配置和保护等功能。
- 打开文件所在目录:指打开鼠标焦点的文件所在目录。
- 设置保护后输出目录:指将选中文件保护后输出的路径更改到指定的目录。
基本信息
主要显示文件(夹)位置、文件创建时间、文件修改时间、文件最后访问时间和文件类型信息。
许可选项
1、许可形式,保护后的软件可以使用的许可所在的载体,在使用Virbox Protector LM工具的时候,以下许可形式至少选择其中一种。
- 硬件锁
- 本地许可,指本地加密锁中的许可,表示插在用户本机器上的硬件锁。
- 网络许可,插在局域网内其他机器上的硬件锁中的许可。
- 云锁
- 云许可,云端虚拟的加密锁中的许可。
- 软锁
- 单机许可,用纯软件实现的加密锁,不依赖任何硬件锁,跟PC机器硬件唯一指纹绑定。
- 集团许可,一台绑定授权码软锁,其他客户端可通过网络共用服务器的软锁许可,但受到访问数量限制。
2、可选项:使用可调试 Runtime API(许可功能库),发布版本时请务必不要勾选!
此选项功能是为了方便使用 slm_runtime_dev 库调试代码,勾选此选项后,不需要将 slm_runtime_dev 库名改为 slm_runtime 。
注意
注意
- 由于Linux和macOS系统上没有调试库,故没有这个功能。
- 为了保证 Runtime 库的一致性,slm_runtime_dev.dll 的查找会依赖同目录下的 slm_runtime.dll,若同目录下的 slm_runtime.dll 库不存在,将不会在找其他目录下的 slm_runtime_dev.dll,此时文件加壳会失败。
许可ID
开发者用于管理用户软件版权控制与发放凭证的一个序列号,开发者能够在 Virbox 开发者中心 分发给普通的云账户,同时开发者也可以通过开发者管理工具为用户锁分发许可。
锁芯片号
一串32个字符表示的,能够唯一确定加密锁的序号,如果软件保护使用了指定的锁序列号,那么保护后的程序只能使用指定序列号的用户锁才能打开,通过 Virbox 用户工具获取。
函数选项
需要保护的具有重要价值的函数块,用户能够选择混淆、虚拟化、碎片化和代码加密的保护方式。
查看函数的详细信息
鼠标点击函数保护列表中的函数,在右侧的工作区窗口中展示函数的详细信息,包括函数的保护方式、函数名、函数的地址和汇编代码的展示。
添加函数
- 点击函数选项右侧【添加函数】按钮,进入到添加保护函数界面。
- 此界面会罗列出解析出程序中的函数模块(托管代码程序和非托管代码程序有细微的差别),选择单个或多个函数更改保护类型。
- 托管代码程序:函数名称为"命名空间+类名称+函数名称"。
- 非托管代码程序:函数名称为函数的va的值。
- 点击确定按钮,选择的函数将在函数列表中展示,点击保护选中项目进行加密程序。如图所示:
- 若保护过程中失败,提示"部分被保护的函数设置了不支持的保护方式",需要将其更改为其他的保护方式后再进行加壳。如图所示:
全局搜索函数
在搜索框中输入关键字,程序会列出所有名称中包含关键字的函数块,支持模糊查询。
性能分析
点击性能分析按钮,运行需要保护的程序,执行正常的业务操作,然后关闭程序后,程序中各个函数模块调用的次数即可显示在列表中,参见上图。如果当前分析的程序位为ll程序,需要选择启动模块。
信息展示
可保护函数列表信息展示,显示了函数的总个数、已添加函数个数、混淆函数个数、碎片代码函数个数。
加密选项
输出文件(夹)
输出文件,可以修改程序保护后生成文件的路径和名称。
设置
包括导入表保护、压缩、资源保护、名称混淆等功能,主要是对文件的整体保护。
- 针对Virbox Protector体系的工具,无后台检测时间间隔(s)和检测用户锁拔出消息功能。
- 针对Virbox Protector LM体系的工具,具有后台检测时间间隔(s)和检测用户锁拔出消息功能,两者为互斥关系。
- 后台检测时间间隔(s),表示每隔多少秒对运行程序进行检测是否存在对应许可,如果没有那么就会提示错误,或者退出。如果后台检测时间设为0s,那么后台就不会进行检测许可的操作。
- 检测用户锁拔出消息,表示程序运行过程中拔掉用户锁时,直接进行许可查找,若找不到对应许可,则弹框提示信息。
- 针对Virbox Protector Moway体系的工具,具有后台检测时间间隔(s)功能。
反调试插件
支持平台:Windows、Linux、ARM Linux、Android so和Android Unity3D。
Windows
反调试插件包括检测硬件断点、检测内存断点和内存检查,主要防止ollydbg、windbg等工具进行调试。
【注意】代码加密和内存检测为互斥关系,ds和内存检测为互斥关系。
- 检测硬件断点,可以检测程序中是否设置内存断点,若检测到程序中设置内存访问断点和内存写入断点时,则程序直接终止运行。
- 检测内存断点,可以检测程序中是否设置硬件断点,若检测到则程序直接终止运行。
- 内存检查,可以检测到内存是否被修改(比如被调试器附加修改),若程序内存被修改则程序将终止运行。
Linux、ARM Linux、Android so和Android Unity3D
反调试插件包括检测调试器功能,主要防止保护后的程序被反编译工具(如gdb、IDA等)进行调试。
勾选此功能后,使用gdb调试保护后的程序的效果,如图所示:
勾选此功能后,使用IDA工具调试保护后的程序的效果,如图所示:
消息选项
消息配置
- 提示语言:指设置弹出消息框文字的语言,包括简体中文、英文,繁体。
- 许可失效提示形式:主要是用于设置,加壳后的程序找不到指定的许可的时候,如何进行提示。目前支持三种方式:
- 程序不提示消息,直接闪退。
- 弹出许可消息框提醒。
- 远程桌面服务会话消息框(支持 vista 和 server2008 以上版本)等三种不同的提示形式。
【注意】如果是对 AutoCAD 的 ARX 程序、IIS 服务或 NX 加载 DLL 等类型进行加壳,建议选择第三种许可会话失效提示形式。
- 程序冻结:当许可会话已经失效时,会弹出提示框,此时程序界面和进程将会被冻结。
- 延迟退出(s):当许可会话已经失效时,会弹出提示框,如果此时选择了"取消"那么您的程序会在设定的延迟退出时间到达的时候退出,这样做的目的是给客户提供了存档的时间。
- 提示标题:设置弹出消息框的标题信息。
自定义信息
对主要的许可消息框状态信息进行显示,开发者可按照一定的格式自定义编辑提醒消息,使保护后的程序更加的人性化的向用户展示许可状态信息。
云锁登陆错误信息
- 首先许可形式选择云锁或软锁。
- 许可失效提示形式选择了"弹出许可消息框提醒"。
- 程序运行时找不到许可的情况下,会弹出云账号登陆框,如果此时登录出错那么本程序会显示对应的错误消息。
错误信息
定义了对应的错误码显示的提示信息,错误信息的格式为【8 位 16 进制错误码-错误信息】,可以添加错误消息也可以删除错误消息,如果没有自定义错误消息,那么加壳后的程序出现错误的时候会弹出系统错误信息。【详细的错误码介绍请参见 SDK 中的 ss_error.h 文件】
状态栏
Virbox Protector 工具的状态栏从左到右分别显示了被保护程序的文件的全路径、程序的类型以及程序的硬件机器版本。
本地可执行程序保护
本地可执行程序包括 PE、ELF、Mach-O 文件格式。
基础保护
导入表保护
描述:隐藏原程序中的导入表,保护程序的函数外部调用,可以达到干扰逆向分析、防脱壳的作用。
支持范围:目前仅支持 PE 格式的程序。
原理:去除原程序的导入表,将导入地址表(IAT) 替换为修复函数,由壳代码接管导入函数的跳转。
资源加密
描述:资源加密是针对 PE 格式程序的资源进行加密的保护功能,可以防止程序中的资源信息被提取,篡改。
原理:在加壳时将 PE 格式程序中的资源抽取并加密,仅保护一些外部需要的资源(如图标、版本信息等),在程序执行时,在壳代码中再解密。
附加数据扩展
描述:附加数据一般是由某些编译器或打包工具,将一些数据(如音视频、数据库等)与原始的可执行程序拼接,这些数据一般在运行时被原始的程序读取,附加数据在执行时并不会直接被映射到内存中。
功能:由于加壳会改变原始程序文件,如果将附加数据直接拼接到保护后的程序,可能会导致运行时异常。
附加数据扩展:使用了 Hook 手段使程序能正常读取到附加数据,另外对附加数据做了加密处理,防止数据被轻易窃取。
压缩
描述:Virbox Protector 的压缩功能,其核心目的不是"压缩",并非专为缩小程序体积而设计的。它真正的作用是将代码与数据段做了加密,并将原先的导入表与重定位信息隐藏了起来,再"顺便"将原先的数据做了压缩。
原理:将原始的代码段与数据包打包并压缩,将原始程序入口(OEP)替换为壳代码,运行时由壳代码将代码段与数据段还原,并进行一些重定位等操作,使程序能正常运行。
功能:防止静态反编译,防止程序被打补丁。
优点
- 能起到一层整体保护效果,可以隐藏程序的代码、数据和文件结构信息。
- 运行效率高,仅在程序被加载时轻微的性能损失。
缺点
- 壳代码执行完毕后,代码段与数据段会还原,可以被 Dump。
保护效果图
保护前,如图所示:
保护后,如图所示:
img
函数级保护
代码混淆
描述:Virbox Protector 支持对 x86/arm/.net il 系列指令进行混淆。
原理:代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。
功能:扰乱原始指令,防止静态分析。
优点
- 防反编译,代码分析难度大。
缺点
- 运行效率有损失。
保护效果图
x86架构程序保护前,如图所示:
x86 架构程序保护后,如图所示:
ARM 架构程序保护前,如图所示:
ARM 架构程序保护后,如图所示:
代码虚拟化
原理:将原始指令转换为自定义的虚拟机指令,交由配套虚拟机系统模拟执行。
功能:隐藏原始指令,防止代码逻辑分析。
优点
- 保护强度高,几乎不能被分析出原始的代码逻辑。
缺点
- 运行效率低。
代码加密(Native)
原理:代码加密是使用 SMC(Self-Modifying Code)技术,将原始的函数加密,在函数被执行时才将函数解密并执行的保护方式。
功能:防脱壳,防止直接 Dump。
优点
- 运行效率高,几乎没有性能损失。
缺点
- 函数执行后会解密,解密之后容易被分析。
保护效果图
保护前,如图所示:
保护后,如图所示:
碎片代码
原理:将代码从原程序中抽取出来,加密后转移到安全环境执行。对软件授权和代码逻辑双重保护。
保护效果图
保护前,如图所示:
保护后,如图所示:
自动化保护
使用 map 文件
使用 BCB 生成 map 文件
工程设置如下图:
使用VC生成map文件
工程设置如下图:
使用 VS 生成 map 文件
工程设置如下图:
使用 VB6.0 生成 map 文件
工程设置如下图:
使用 Delphi 生成 map 文件
工程设置如下图:
使用 SDK 标签
SDK 工具包,包括头文件、静态库以及动态库,用户在编程的过程中将 SDK 标签静态载入到需要保护的函数当中,这样生成的可执行程序,在 Virbox Protector 加壳工具中就能够分析出 SDK 表示的函数,这样就能够找到用户的核心代码所在的位置。目前支持,VBProtectBegin(常规保护),VBVirtualizeBegin(虚拟化保护),VBMutateBegin(混淆化保护),VBSnippetBegin(碎片化代码保护),VBProtectDecrypt(许可加解密)。
注意
SDK 标签可以方便的找到关键代码
函数模块保护
注意事项
只能静态加载,不支持动态加载dll(即 LoadLibrary 的方式)。
VBProtectBegin、VBVirtualizeBegin、VBSnippetBegin 以及 VBMutateBegin 等接口,传入的字符串参数,不能与其他函数共用。
传入的字符串参数保证为 ANSII 码的形式,这样显示在界面上的函数名称才正确,否则就会显示为乱码。
每个 Begin 对应一个 End,总是成对出现,并且一个函数里面不要出现多对 Begin+End。
如果 SDK 表示的保护方式和工程文件中保存的保护方式冲突了,以工程文件中的保护方式为准。
Begin+End 锁定代码最好大于 3 行代码。(因为锁定的代码正汇编生成的指令小于 15 个字节,那么不会显示在加壳工具界面上)
SDK 动态库,分为 32 以及 64 位,在使用的时候要开发者根据要编译的程序位数进行加载对应的库。
目前明确不支持的语言:易语言、Java 程序、Unity3d。
Begin/End 不支持嵌套使用。
VBProtectDecrypt 被加密的字符串或者是缓冲区的长度必须是 16 的倍数。
eg:char g_test_string[16] = {"test_decrypt"};
VBProtectDecrypt 传入缓冲区和传出缓冲区不能是同一个缓冲区。
VBProtectDecrypt 传入的缓冲区只能放在函数外,即全局变量。具体的使用参照 demo。
.Net 程序暂时不支持。
字符串加解密
加密的字符串必须是常量。
也可以使用 VBDecryptData 直接到数据加密,但数据和长度也必须是常量。
字符串解密支持的写法有以下几种:
直接字符串解密:
VBDecryptStringA("test_string");
局部静态变量:
static const char g_string[] = "test_string";
全局变量:
char g_test_string[] = "test_string";
const char g_test_string[] = "test_string";
static const char g_test_string[] = "test_string";
如果程序过于复杂可能会导致解析不出加密的数据,而在加壳时报错,使用 -fpic 或 -fpie 加上 -O2 编译的 32 位 Linux 程序此类情况比较明显。建议降低代码的复杂度。
编译器可能会将相同的常量字符串合并为同一个,如果只加密了其中一个,会导致出错,如以下代码:
const char* a = "test_string";
const char* b = VBDecryptStringA("test_string");
printf("a = %s, b = %s\n", a, b);
这种情况,打印字符串a,可能会是乱码。
生成 .ssp 配置文件
手动生成 ssp 文件
将文件拖入到 Virbox Protector 工具中,手动更改信息后,点击"保存选中配置"或"保存所有配置"选项后,在和文件同一层目录下会生成一个 .ssp 配置文件。
自动生成 ssp 文件
需要联系深思数盾客服,我们将单独提供生成工具。
使用命令行工具保护
Virbox Protector 命令参数解析
命令 | 描述(本地锁) | 描述(云锁) | 备注 |
---|---|---|---|
filename | 指准备保护的原文件 | / | |
-u3d | 指对 Unit3D 程序保护 | ||
-o output | 指保护后输出文件路径 | ||
-c local|cloud | 指使用硬件锁 | 指使用云锁 | 仅 Virbox Protector LM 体系工具有此命令 |
-u username | / | 指 Virbox 云账户的用户名 | |
-p password | 指 PIN 码 | 指 Virbox 云账户的密码 |
Virbox Protector LM
1、普通程序使用方法
以Windows 平台的 PE 程序为例:
- 【必选】使用 Virbox Protector 界面工具生成配置文件
- 打开终端窗口,进入到"virboxprotector_con.exe"所在的路径,直接输入"virboxprotector_con.exe"运行可查看帮助信息
- 使用硬件锁对程序进行保护
- VirboxProtector_con.exe的路径 需要被保护的程序路径 -c local –p PIN码 -o 输出文件的路径,如图所示
- 使用云账号对程序进行保护
- VirboxProtector_con.exe的路径 需要被保护的程序路径 -c cloud -u 开发者名称 -p 开发者密码 -o 输出文件的路径,如图所示
2、Unity3D程序使用方法
Unity3D 作为一个特殊的文件类型,和普通程序的保护方式不同,需要对 Unity3D 整个目录进行保护。以Linux平台的 Unity3D 为例:
- 使用 Virbox Protector 界面工具生成配置文件
- 打开终端窗口,进入到"virboxprotector_con.exe"所在的路径,直接输入"virboxprotector_con.exe"运行可查看帮助信息
- 使用硬件锁对程序进行保护
- 硬件锁:VirboxProtector_con.exe的路径 需要被保护的程序路径 -c local –p PIN码 -u3d -o 输出文件的路径,如图所示
- 使用云账号对程序进行保护
- 云账号:VirboxProtector_con.exe的路径 需要被保护的程序路径 -c cloud -u 开发者名称 -p 开发者密码 -u3d -o 输出文件的路径,如图所示
.NET 程序保护
基础保护
名称混淆(.NET)
描述:将 .net 的方法名类名使用随机字符串重新命名,导出和外部的名称不会改变。
保护效果图
保护前,如图所示:
保护后,如图所示:
压缩
描述:Virbox Protector 的压缩功能,其核心目的不是"压缩",并非专为缩小程序体积而设计的。它真正的作用是将代码与数据段做了加密,并将原先的导入表与重定位信息隐藏了起来,再"顺便"将原先的数据做了压缩。
原理:将原始的代码段与数据包打包并压缩,将原始程序入口(OEP)替换为壳代码,运行时由壳代码将代码段与数据段还原,并进行一些重定位等操作,使程序能正常运行。
功能:防止静态反编译,防止程序被打补丁。
优点
- 能起到一层整体保护效果,可以隐藏程序的代码、数据和文件结构信息。
- 运行效率高,仅在程序被加载时轻微的性能损失。
缺点
- 壳代码执行完毕后,代码段与数据段会还原,可以被 Dump。
保护效果图
保护前,如图所示:
保护后,如图所示:
去除强签名
- 强名称(StrongName)使.NET提供的一种验证机制, 主要包括标识版本和标识原作者。
- 强名称可以用来帮助用户验证自己得到的程序是否为原作者所写切没有被修改(例如添加恶意代码), 跟自校验有点类似。
- 因此添加了强名称的程序加壳时要去除强名称, 并在加壳后重新添加强名称。
函数级保护
代码加密(.NET)
原理:代码加密是使用动态代码技术,将原始方法字节码加密,执行时才将方法解密并执行的保护方式。
功能:防脱壳,防止直接 Dump。
优点
- 运行效率高,几乎没有性能损失。
缺点
- 方法执行后会解密,解密之后容易被分析。
保护效果图
保护前,如图所示:
保护后,如图所示:
代码加密不支持类型
针对 C# 程序选择函数的保护方式为代码加密时,加壳时提示“部分被保护函数设置了其不支持的保护方式,请前往函数选择界面更改保护方式。[0xA000A000]”的情况,以下列出代码中不支持的写法:
- 值类型(及其继承类)的非静态方法 System.ValueType
- 泛型方法暂不支持
- C++ .net不支持
- 递归调用不支持
- 可变参数不支持
- 默认参数不支持
代码碎片化
原理:将代码从原程序中抽取出来,加密后转移到安全环境执行。对软件授权和代码逻辑双重保护。
保护效果图
保护前,如图所示:
保护后,如图所示:
代码混淆
代码混淆
描述:Virbox Protector 支持对 x86/arm/.net il 系列指令进行混淆。
原理:代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。
功能:扰乱原始指令,防止静态分析。
优点
- 防反编译。
缺点
- 运行效率略有损失,保护强度不高。
保护效果图
保护前,如图所示:
保护后,如图所示:
Unity3D 程序保护
功能
- 对 Unity3D 脚本 C# 代码进行加密,防止逆向和反编译。
- 可以添加程序集文件,即Managed目录下自主开发的C# 程序集。
保护原理
- 解析 Assembly-CSharp.dll 脚本文件,将 function 转换成 IL 代码。
- 将 IL 代码进行加密,其中密钥为每次随机生成,保持到脚本文件中。
- 如果使用 LM 版本的壳,加解密使用锁内密钥.
- 链接重新生成 Assembly-CSharp.dll 脚本文件,此时所有代码已经被加密。
- 对 Unity3D 的 .NET 运行时库 mono 进行处理,定位到解析 .NET 方法的函数并进行 hook。
- 插入 hook 代码对 Assembly-CSharp.dll 的方法解密,重新编译生成新的 mono 并替换原始动态库。
保护效果图
保护前,如图所示:
保护后,如图所示:
Android程序保护
普通apk程序
针对普通apk程序,需要将apk解压,然后对文件夹lib目录下的so库使用加壳工具进行保护,如图所示。
保护完成后,对文件夹重新打包签名安装即可。
Android Unity3D
针对Unity3D编译选项时选择的mono和IL2CPP格式,两种保护方式不同。
mono格式
先将Android Unity3D apk解压,查看lib库目录,如图所示:
若是lib目录下含有libmono.so库,那么说明Unity3D编译选项时选择的是mono,此时需要对apk整个目录进行加壳。如图所示:
加壳成功后会生成ssp.apk,然后重新对加壳后的ssp.apk进行签名打包,才能正常安装。
IL2CPP格式
先将Android Unity3D apk解压,查看lib库目录,如图所示:
若是lib目录下含有libil2cpp.so库,那么说明Unity3D编译选项时选择的是IL2CPP,此时需要对lib目录下的so库进行保护。
保护完成后,对文件夹重新打包签名安装即可。
Java 程序保护
如何对 jar 包保护
使用 Virbox Protector 工具可以直接对未使用框架的 jar 包进行加密保护。
注意
若使用 Java 框架的 jar包,请使用 DSProtector 进行保护,具体操作方法和使用说明请参《DSProtector 用户手册》
操作流程
- 将 jar包拖入工具中,直接进行保护。
- 保护成功后会生成文件和 sjt 插件。
运行加壳后的程序(两种方法,选其一)
- 1、-agentpath:sjt64.dll,指定 sjt64.dll 的路径,默认是与 ClockDemo.ssp.jar 同一目录。
- 2、Java版本若是 32 位的,使用 sjt32.dll; Java 版本若是 64 位的,使用 sjt64.dll。
命令行:java -agentpath:sjt64.dll -jar ClockDemo.ssp.jar
命令行:java -agentpath:C:\Users\test\Desktop\sample\java\sjt64.dll -jar ClockDemo.ssp.jar
如何对 war 包保护
使用 Virbox Protector 工具可以直接对未使用框架的war包进行加密保护。
注意
保护后的war包只能在 Windows 平台上运行,若使用框架的 war 包,请使用 DSProtector 进行保护,具体操作方法和使用说明请参《DSProtector 用户手册》
操作流程
- 将war包拖入工具中,直接进行保护。
- 保护成功后会生成文件和sjt插件。
- 若使用Tomcat来运行加密保护后的程序,需要将保护后的 sample.ssp.war 放入到 .\apache-tomcat\webapps 文件夹中,在 .\apache-tomcat\bin\catalina.bat 配置 sjt 库,如图所示:
- 两种配置方法,选其一:
- set JAVA_OPTS=-agentpath:sjt64.dll或set JAVA_OPTS=-agentpath:sjt32.dll,将sjt32.dll或sjt64.dll拷贝到jdk。
- set JAVA_OPTS=-agentpath:C:64.dll或set JAVA_OPTS=-agentpath:C:32.dll,指定sjt库的路径,不需要拷贝。
- 运行.\apache-tomcat\bin\startup.bat,网页启动http://localhost:8080/sample.ssp
正常运行即可。
Python/PHP 等脚本语言保护
请参考《DSProtector 用户手册》。
常见问题
如何在其他平台上使用 Virbox Protector LM
由于目前 Virbox 开发者工具盒只有 Windows版,在 Linux 和 macOS 平台上使用 Virbox Protector (LM) 对程序进行保护需要进行配置。
Linux 平台
- 需要将 Windows 平台上 Virbox 开发者工具盒的安装目录下的 sdk\API\Linux目录拷贝到Linux系统上,执行copy_lib_share.sh 脚本文件进行安装 SDK。
- 将 Virbox Protector (LM) 版本拷贝到 Linux 系统上,运行 ./virboxprotector 后,界面即可识别SDK信息。
- 需要在深思数盾官方网站下载对应系统的 Virbox 用户工具进行安装使用。
- 将程序拖入加壳工具界面中,可对程序进行保护使用。
macOS 平台
- 需要将 Windows 平台上 Virbox 开发者工具盒的安装目录下的 sdk\API\mac目录拷贝到macOS 系统上,执行copy_lib_share.sh 脚本文件进行安装 SDK。
- 将 Virbox Protector (LM) 版本拷贝到 macOS 系统上,运行 ./virboxprotector 后,界面即可识别 SDK 信息。
- 需要在深思数盾官方网站下载对应系统的 Virbox 用户工具进行安装使用。
- 将程序拖入加壳工具界面中,可对程序进行保护使用。
其他平台
由于目前 Virbox Protector (LM) Professional 只能在 Windows、Linux 和 macOS 平台运行,针对 ARM-Linux、Android 平台,需要进行单独配置。
- 将 ARM-Linux、Android 平台的程序直接拖入加壳工具中加壳时提示“Senseshield SDK 不存在:请安装 SDK开发包或者将 SDK 库拷贝到加壳程序同级目录。
- 遇到这种情况,需要手动将 SDK (需要联系深思销售单独获取)目录下的 ss_runtime 或 user_login 库放入到Virbox Protector (LM) Professional 加壳工具中的 bin 目录下。
- 修改库的命名,如表所示:
- 若使用硬件锁,只需修改 ss_runtime 库的命名即可。
- 若使用云锁或软锁,需要修改 user_login 和 ss_runtime 库的命名。
ARM-Linux 平台
系统架构 | runtime库 | user_login |
---|---|---|
ARM32 | slm_runtime_linux_a32.so | ss_user_login_linux_a32.so |
ARM64 | slm_runtime_linux_a64.so | ss_user_login_linux_a64.so |
Android 平台
系统架构 | runtime库 | user_login |
---|---|---|
ARM32 | slm_runtime_android_a32.so | ss_user_login_ android _a32.so |
ARM64 | slm_runtime_android_a64.so | ss_user_login_ android _a64.so |
X86 | slm_runtime_android_x86.so | ss_user_login_ android _x86.so |
X64 | slm_runtime_android_x64.so | ss_user_login_ android _x64.so |
这种方式也适合 Windows、Linux 和 macOS 平台,针对一些未安装 Virbox 开发者工具盒的用户,可以选择这种方式,其中库的命名如表所示:
系统 | runtime库 | User_login |
---|---|---|
Windows | slm_runtime_windows_x86.dll | ss_user_login_windows_x86.dll |
slm_runtime_windows_x64.dll | ss_user_login_windows_x64.dll | |
Linux | slm_runtime_linux_x86.so | ss_user_login_linux_x86.so |
slm_runtime_linux_x64.so | ss_user_login_linux_x64.so | |
macOS | slm_runtime_macos_x64.dylib | ss_user_login_macos_x64.dylib |
加密后的软件被杀毒软件拦截
问题描述:使用加壳工具对开发者软件进行加壳,然而加密后的程序被 360 等杀毒软件认为是病毒软件。
解决方法:提交 360 认证。
操作方法:
- 软件中可执行文件(不包含驱动程序 .sys)及打包后的可执行文件使用沃通(Wosign)签名(使用沃通代码签名工具并且购买代码签名证书进行签名,沃通签名相关问题请咨询沃通官方网站客服人员,沃通签名在 360 认证过程有很大帮助)。
- 注册并登录 360 开放平台:http://open.soft.360.cn/
- 在"我的软件"页面中选择提交我的软件,如下图:
- 选择"仅安全检测",并填写软件名称,软件版本(主要为了后续记录查看),提交方式可以选择本地上传安装包,然后提交软件。
- 同时可以在"软件列表"中查看已经提交过的待检测软件和"通过检测"的软件。目前软件提交后通过检测的时间大约为1天。
不支持列表
由于程序代码语言、书写规范、平台和架构等影响编译出的程序有部分Virbox Protector目前不支持保护,请参考下表:
类型 | 不支持的列表 | |
---|---|---|
其他 | 不支持二次加壳,无论是第三方还是本程序加壳后的文件,都不能再次进行加壳 | |
加壳工具不支持对spring框架的jar包直接加壳,如果是spring框架的Java程序,请使用资源加密的方式保护 | ||
不支持带有自校验检查的程序 | ||
文件类型 | .NET | 暂不支持带有程序集签名(强签名)的程序进行加壳 |
.NET加壳不支持第三方运行时库,只支持微软标准运行时库 | ||
SDK标签不支持.NET程序 | ||
C#开发的.NET程序或DLL库中含有外部引用或公开的方法,此类程序不能加名称混淆,若选择名称混淆会改变方法名,会使程序某个函数无法正常使用 | ||
.NET 的AnyCPU加压缩后不支持被其他的.NET 模块引用,原因是加压缩后会将.NET程序类型变为PE32 | ||
.NET的DLL没有压缩功能 | ||
PE | PPT转exe的程序不支持资源保护 | |
VB6.0语言程序不能加资源保护 | ||
导入表:导入的符号必须都是函数,不能有导入变量,否则运行时程序会崩溃 | ||
如果被保护的程序使用了内存加载方式执行,压缩后无法运行 | ||
ELF | Linux的程序暂不支持附加数据 | |
不支持-static编译的ELF格式的程序 | ||
ELF文件不支持map文件分析 | ||
如果默认选项导出了所有符号,可能在运行时会崩溃,建议只导出需要导出的函数 | ||
保护选项 | 代码加密 | 由解析器通过引用分析得到的函数(函数列表中没有名称的函数),可能存在外部入口而不支持 |
函数指令字节过小,不能保护 | ||
混淆/虚拟化/碎片化 | 对于 ELF 和 Mach-O 格式的程序,如果函数被优化为使用了"野栈",则不支持保护 | |
函数指令字节过小,不能保护 | ||
ARM架构程序不支持虚拟化和碎片化 |
已知问题
- .NET 加壳不支持第三方运行时库,只支持微软标准运行时库。
- 使用命令行加壳时,其目标程序的配置文件必须存在。
- 在.NET程序中使用类似 GetField("name", bindingAttr) 函数时,加壳后名称混淆可能出现异常,如果 .NET 程序加壳后运行失败,尝试去掉名称混淆。
- 对函数块进行碎片化代码保护的时候,存在不能成功保护的情况,主要原因是,碎片代码对指令的长度过小,指令可能不可移植,存在跳转等情况。
- AutoCAD 的 ARX 插件程序只能选择"远程桌面服务会话消息框",并且目前只支持 win7 和 server2008 以上的版本。
- 如果用户的机子上装有杀毒软件 AVAST,可能会出现加壳后的程序无法运行的情况。导致此问题的原因是,当加壳程序运行的时候 AVAST 会杀死加壳程序的进程。
- 暂不支持带有程序集签名(强签名)的程序进行加壳。