Virbox Protector 加密选项说明
本地可执行程序保护
代码混淆
描述:Virbox Protector 支持对 x86/arm/.net il 系列指令进行混淆。
原理:代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。
功能:扰乱原始指令,防止静态分析。
优点
- 防反编译,代码分析难度大。
代码虚拟化
原理:将原始指令转换为自定义的虚拟机指令,交由配套虚拟机系统模拟执行。
功能:隐藏原始指令,防止代码逻辑分析。
优点
- 保护强度高,几乎不能被分析出原始的代码逻辑。
代码加密(Native)
原理:代码加密是使用 SMC(Self-Modifying Code)技术,将原始的函数加密,在函数被执行时才将函数解密并执行的保护方式。
功能:防脱壳,防止直接 Dump。
优点
- 运行效率高,几乎没有性能损失。
碎片代码
原理:将代码从原程序中抽取出来,加密后转移到安全环境执行。对软件授权和代码逻辑双重保护。
导入表保护
描述:隐藏原程序中的导入表,保护程序的函数外部调用,可以达到干扰逆向分析、防脱壳的作用。
支持范围:目前仅支持 PE 格式的程序。
原理:去除原程序的导入表,将导入地址表(IAT) 替换为修复函数,由壳代码接管导入函数的跳转。
资源加密
描述:资源加密是针对 PE 格式程序的资源进行加密的保护功能,可以防止程序中的资源信息被提取,篡改。
原理:在加壳时将 PE 格式程序中的资源抽取并加密,仅保护一些外部需要的资源(如图标、版本信息等),在程序执行时,在壳代码中再解密。
附加数据扩展
描述:附加数据一般是由某些编译器或打包工具,将一些数据(如音视频、数据库等)与原始的可执行程序拼接,这些数据一般在运行时被原始的程序读取,附加数据在执行时并不会直接被映射到内存中。
功能:由于加壳会改变原始程序文件,如果将附加数据直接拼接到保护后的程序,可能会导致运行时异常。
附加数据扩展:使用了 Hook 手段使程序能正常读取到附加数据,另外对附加数据做了加密处理,防止数据被轻易窃取。
压缩
描述:Virbox Protector 的压缩功能,其核心目的不是"压缩",并非专为缩小程序体积而设计的。它真正的作用是将代码与数据段做了加密,并将原先的导入表与重定位信息隐藏了起来,再"顺便"将原先的数据做了压缩。
原理:将原始的代码段与数据包打包并压缩,将原始程序入口(OEP)替换为壳代码,运行时由壳代码将代码段与数据段还原,并进行一些重定位等操作,使程序能正常运行。
功能:防止静态反编译,防止程序被打补丁。
.NET 程序保护
代码加密(.NET)
原理:代码加密是使用动态代码技术,将原始方法字节码加密,执行时才将方法解密并执行的保护方式。
功能:防脱壳,防止直接 Dump。
保护效果图
保护前,如图所示:
保护后,如图所示:
代码加密不支持类型
针对 C# 程序选择函数的保护方式为代码加密时,加壳时提示“部分被保护函数设置了其不支持的保护方式,请前往函数选择界面更改保护方式。[0xA000A000]”的情况,以下列出代码中不支持的写法:
- 值类型(及其继承类)的非静态方法 System.ValueType
- 泛型方法暂不支持
- C++ .net不支持
- 递归调用不支持
- 可变参数不支持
- 默认参数不支持
代码碎片化
原理:将代码从原程序中抽取出来,加密后转移到安全环境执行。对软件授权和代码逻辑双重保护。
保护效果图
保护前,如图所示:
保护后,如图所示:
代码混淆
描述:Virbox Protector 支持对 x86/arm/.net il 系列指令进行混淆。
原理:代码混淆亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式。
功能:扰乱原始指令,防止静态分析。
保护效果图
保护前,如图所示:
保护后,如图所示:
名称混淆(.NET)
描述:将 .net 的方法名类名使用随机字符串重新命名,导出和外部的名称不会改变。
压缩
描述:将 .NET 元数据(Meta Data)信息抽取并压缩加密,运行时再由壳代码将其还原,使其能正常运行,可以有效防止 .NET 程序中的方法被 DnSpy,ILSpy,.NET Reflector 等工具反编译
功能:防止静态反编译,防止程序被打补丁。
JIT 加密
描述:是将 .NET 所有方法的 IL 指令经过加密,仅在 .NET 虚拟机进行 JIT 编译阶段才解密,可以防止静态反编译,也能防止 IL 代码在内存被 Dump。JIT 加密可以配合代码混淆、代码加密、.NET 压缩一起使用,达到多层保护的效果,在兼顾性能的同时,更进一步提升保护后代码的安全性。
启用 “JIT 加密” 后,VBP 2 在进行保护时,会将 .NET 方法的 IL 字节码加密,并插入 VBP JIT HOOK 模块完成保护。
在运行阶段,.NET 虚拟机对原程序中的元数据等信息进行解析,最终需要在 JIT 阶段将 IL 方法进行编译,VBP JIT Hook 模块会在此时进行解密,使编译过程顺利进行。