.NET 程序的安全性一直备受开发者重视,Virbox Protector 对 .NET 程序的保护,包含了整体的加密、运行时反调试、名称混淆、函数级别的保护(包括代码加密,代码混淆,以及高强度的代码虚拟化等技术)。
对程序做好保护,并不是一件简单的事,需要结合具体的场景和安全需求,尤其是高强度的保护选项,往往伴随着使用限制或者性能问题,没有哪种加密策略可以保证安全性高又不影响性能,本文档将对保护的场景、流程(包括集成构建)以及加密选项进行指引。
#
支持范围.NET 程序最早只在由微软实现的 .NET Framework 环境下环境,随着 Mono 运行时的出现(尤其是 Unity 引擎的推广),以及 .NET Core 的推出和 .NET 5 及以上的推出,运行环境变得更复杂。
由于不同运行时环境对 .NET 标准和底层库的支持不同,而代码保护技术往往依赖一些底层技术,在不同环境下会存在兼容性差异。
#
运行环境运行环境 | 是否支持 | 备注 |
---|---|---|
.NET Framework 2.x ~ 4.x | 是 | 完整支持 |
.NET Core 2 | 部分功能支持 | 已废弃版本 |
.NET Core 3 | 是 | 非Windows系统部分功能不支持 |
.NET 5 至 .NET 7 | 是 | 非Windows系统部分功能不支持 |
Mono Runtime | 否 | 如果是Unity引擎,可以使用 Unity 加密方案 |
#
功能与兼容性保护选项 | 兼容性 | 备注 |
---|---|---|
压缩 | 仅支持 Windows 系统;不支持In Memory Module ,比如使用Assembly.Load 加载的 dll | |
JIT加密 | 仅支持 Windows | |
字符串加密 | 完整支持 | |
附加数据加密 | 仅支持 Windows | 部分打包工具会生成附加数据 |
调试器检测 | 完整支持 | |
名称混淆 | 完整支持 | |
[E] 代码加密 | 完整支持 | |
[M] 代码混淆 | 完整支持 | |
[V] 代码虚拟化 | 完整支持 |
#
保护指引#
普通的保护方式如果对安全性没有较高的要求,不需要函数级别的保护,只需要调整基础保护选项即可实现防反编译和防普通的内存 Dump。
保护选项 | 保护建议 | 备注 |
---|---|---|
压缩 | 不勾选 | |
JIT加密 | Windows系统下勾选 | |
字符串加密 | 有敏感字符串则勾选 | |
附加数据加密 | 有附加数据则勾选 | 部分打包工具会生成附加数据 |
调试器检测 | 每个进程只需要保护一个模块(如主程序exe);如果模块做为SDK发布供第三方调用,则不勾选 | |
名称混淆 | 对主程序exe,选择“保留自定义名称”;对dll,选择“只混淆私有成员” | |
[E] 代码加密 | Windows 平台使用默认选项(仅加密入口函数);非Windows平台由于不支持JIT加密,建议对必要的函数勾选 | |
[M] 代码混淆 | 无需选择 | |
[V] 代码虚拟化 | 无需选择 |
#
高安全性保护如果对安全性有较高要求,可以在 名称混淆
上加强,并对关键的函数进行代码虚拟化
。
自定义名称混淆
可以对命名空间、类、方法等名称进行混淆,由于模块间一般存在互相调用,对public属性的名称混淆会导致调用出错找不到方法,需要由开发者自定义配置。
对于模块间调用问题,也可以通过程序集合并
功能将多个模块合并为一个再进行保护。Virbox Protector 提供了免费工具 程序集合并
功能,可以在菜单栏 工具
-.NET程序集合并
中找到。virboxprotector_con 支持命令行选项 -ilmerge
进行合并,实现自动化。
举例:
virboxprotector_con -ilmerge test.exe test.dll -o merged/test.exe
对关键的函数逻辑(如授权验证,关键的加密解密代码逻辑),推荐使用代码虚拟化
进行保护,代码虚拟化对运行性能有一定影响,不适合大面积使用。如需诊断性能问题,可以在函数选项
-添加函数
-性能分析
中运行程序查看函数的调用次数。
#
自动化集成#
命令行工具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
#
使用配置文件保护使用工具界面进行保护,在被保护的程序旁边会生成 .ssp
文件,然后调用virboxprotector_con
:
virboxprotector_con<input_file>-o<output_file>
virboxprotector_con
会自动查找 <input_file>.ssp 作为配置文件开始保护。
#
无配置文件保护如果没有配置文件,virboxprotector_con
会使用默认参数保护,可以传入具体参数覆盖默认选项(见命令行选项)。
也可以使用SDK 标签
在代码中标注。
#
命令行选项保护选项
选项 | 命令行 | 默认选项 |
---|---|---|
压缩 | --pack= | 0 |
JIT 加密 | --jit-enc= | 1 |
字符串加密 | --str-enc= | 1 |
附加数据加密 | --overlay-enc= | 1 |
调试器检测 | --detect-dbg= | 0 |
名称混淆 | --rename= | exe 混淆所有名称;dll 只混淆私有名称1 |
名称混淆保留规则 | --keep-rules= | "" |
函数选项
选项 | 命令行 |
---|---|
忽略不支持的函数 | --ignore-unsupported=<value> (默认关闭:0) |
代码加密 | -e |
代码混淆 | -m |
代码虚拟化 | -v |
支持指定函数名称或规则保护,使用 ;
号隔开, 支持通配符 *
,举例:
-m "function1;function2" -v "function3;function4" -e "test*" --ignore-unsupported=1
#
命令行保护场景举例对主程序保护(混淆所有名称,开启反调试):
virboxprotector_con test.exe --pack=0--jit-enc=1--str-enc=1--rename=2--keep-rules=""-detect-dbg=1-o protected/test.exe
对dll保护(混淆私有名称):
virboxprotector_con test.dll --pack=0--jit-enc=1--str-enc=1--rename=1
对dll保护(保留自定义的名称):
virboxprotector_con test.dll --pack=0--jit-enc=1--str-enc=1--rename=2--keep-rules="MyNamespace.MyClass1.*;MyNamespace.MyClass2.*"
对非Windows平台dll保护(不使用JIT加密,加密所有方法,开启反调试,忽略不支持的函数):
virboxprotector_con test.dll --pack=0--jit-enc=0--detect-dbg=1--str-enc=1--rename=1-e"*"--ignore-unsupported=1