加壳工具最佳实践(快速版)
为什么写VBP最佳实践(快速版)?
很多开发商都需要对自己的软件进行安全保护,以应对黑客/盗版者的恶意破解行为,维护自身的知识产权和经济利益。但软件保护专业性较强,专业名词和策略较多,初次上手时可能会存在很多疑问,不利于安全方案的快速应用。
对软件保护,我们推出了自己的加壳工具Virbox Protector
、Virbox Protector(LM)
,并完善了技术原理和使用文档。但新手使用者仍存在很多疑惑,比如:
“哪些函数需要保护?”、“选择什么加密方式?”、“对性能影响大不大?”
对于上述问题,我们整理了这篇文档,期望可以协助您快速、高效的把加壳保护用到现有的项目里。
函数选项的选择
函数选项有四个选项,从安全程度来说 碎片化>虚拟化>代码加密/代码混淆,运行效率正好相反。
代码加密和代码混淆
说明:
代码加密和代码混淆安全等级基本一致,代码加密是在内存层面上的。在运行过程中把代码解密到内存,执行结束又变回加密状态;代码混淆是永久的混淆,可以简单理解为添加很多无意义的指令和跳转,增大分析难度。
建议:
可以根据实际需求加密,代码加密是性价比极高,如果对性能和安全都有要求,可以选择代码加密。在接受的范围内,可以选择全部函数进行代码加密。(全部加密的情况需要考虑实际的性能,如果对性能影响不可接受,可适当减少加密后函数)
代码虚拟化和碎片化
说明:
虚拟化是做了虚拟机保护, 它将代码底层的逻辑转换为虚拟机指令。 破解的难度相当于对整个安全虚拟机进行破解,破解成本极大。
碎片化是授权产品Virbox LM
(精锐5、软锁、云锁)独有的策略,我们通过安全中间件Virbox用户工具
拿到了系统内核R0
级别的权限,以此权限申请安全内存,把函数部分逻辑转移到此内存里,R0
级别的权限可以让黑客无法访问我们申请的内存。
建议:
虚拟化和碎片化对性能有影响,如果函数内存在循环语句或对性能要求高,不建议使用。虚拟化和碎片化只建议用于保护关键逻辑,比如功能判断(判断客户有没有购买某个模块)或调用次数较少的关键函数上。
建议选择3到5处函数进行虚拟化加密,1到2处选择碎片化加密。
安全性和【性能/运行效率】平衡
情况说明
安全性和运行效率是成反比两个概念,添加安全策略后,会导致原始逻辑变得更加复杂,从而干扰破解者的破解。在实际情况下,有些性能延迟是可以接受的,比如图形界面,只需要做到用户无感知即可;有些性能延迟是不可接受的,比如之前运行在50毫秒左右,加固后变成200毫秒。但是事无绝对,我们可以通过更换加固策略,改善对性能的影响,从而找到一个对安全和性能都可以接受的平衡点。
操作建议
经过实际测试混淆会变慢10-100倍;虚拟机代码保护会慢100-1000倍,这些测试结果取决于CPU性能和浮点数运行、整数逻辑计算等。
使用SDK 混淆/虚拟化保护核心代码,比如VBPXXXBegin 和VBPProtectEND 保护局部函数,而不是大量无关代码。
避免保护大量循环、递归代码,这类代码加密后运行效率会变得很慢。
如果保护DLL,注意DLL的函数或者对象的方法实现。函数中如果包括调用WINDOWS-API,请取消IAT表保护,IAT表由于存在VM虚拟机保护,导致依赖WINDOWS-API函数会变慢。
安全性和【兼容性/稳定性】的平衡
情况说明
安全性和稳定性没有直接利害冲突,但因为加壳会改变原始的代码逻辑,可能对稳定性存在影响。
操作建议
- 安全性最大:先使用VBP最大保护,然后加壳再做测试,出现问题之后再根据具体问题减少加壳选项;
- 兼容性最好:先使用VBP最小保护,任何选项都不选,然后加壳再做测试,逐步加加密选项,看是否能顺利启动。
- 使用碎片代码保护关键性执行1-2次代码,主要用来保护软件跟授权最大化关联的位置。在可接受范围内可以多加,如果达到10处以上,黑客就基本放弃到盗版了。
- 虚拟机用来保护重要关键代码,可以是授权相关也可以是核心算法,但是效率会降低1万倍数量级别,代码混淆是可以还源代码逻辑效率降低1000倍数量级,两者相互使用最大化保护代码逻辑,防止竞争对手抄袭算法。
- 代码加密是性价比最高的代码保护,建议全加,尤其是dotNet代码。
注意几个问题:
- PE文件结构如果有附加数据会被加密,程序执行时候会解密,但是第三方静态读取数据不会自动解密,所以数据校验可能会失败。
- 程序加壳之后会被防毒软件当作病毒。这其实不是一件坏事,杀毒软件会自带脱壳器,进行病毒分析,如果脱壳失败,会提示疑似病毒。出现报毒说明现在保护强度,说明杀毒软件自带的脱壳器已经无法识别你的文件原始信息了。对于杀毒软件报毒,如何避免被查杀,请参考外壳文档的免杀部分文档。 主流安全软件免杀指南 | Virbox Protector
相关文档
授权外壳操作手册:
独立外壳使用文档:
报毒后提交免杀的步骤: