VirboxProtector 最佳实践#
文档目的#
本文档详细描述了Virbox Protector 、ViSual C++/PE等技术参数、实施方案,对与之相关的技术细节和实施都有准确的描述,以确保项目有关各部门及个人就产品本身达成共识,其中VBP代表Virbox Protector ,VBPS代表 Virbox Protector Standalone。
文档范围#
VBP相关#
0.最佳实践
1.如何保证加壳代码不崩溃
2.如何CI 自动化编译打包部署
3.安全性和【兼容性/稳定性】的平衡
免杀相关#
0. 为什么被杀? 1.360查杀云推送脚本和反查杀的实践 2.微软查杀策略等
Visual C++相关#
全局优化; Debug与Release C89 C99 与微软历史版本兼容性 VC编译器的BUG等
读者对象#
各个软件开发商 内部研发 测试 解决方案部等
术语与名词#
缩写、术语 | 解 释 |
---|---|
代码加密(X86) | 针对X86汇编代码:一种代码自修改技术(SMC)保护代码。把当前代码加密存储为密文,存储起来,当程序运行到被保护函数时候自动解密并且执行,执行之后再擦除代码,运行到哪里才解密哪里的代码,黑客无法获得原始机器指令和内存完整性的代码,由于是纯内存操作所以运行速度快, 性价高的保护手段,建议全加 |
代码加密(IL) | 针对dotNet程序,保护IL代码:一种动态运行方法解密被保护代码。把当前代码加密存储为密文,存储起来,当程序运行到被保护函数时候自动解密并且执行,执行之后再擦除代码,执行之后再擦除代码,运行到哪里才解密哪里的代码,黑客无法获得原始的中间语言的指令和内存完整性的代码,由于是纯内存操作所以运行速度快, 性价高的保护手段,建议全加 |
代码混淆(X86) | 针对X86汇编代码:是将被保护的代码块(一个函数之内机器代码),转换成一种功能上等价,但是难于阅读和理解的形式的行为。从而干扰静态反汇编工具和增加黑客阅读代码难度。通常有指令等价替换 非等价替换 |
代码混淆(IL) | · 将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。· 重写代码中的部分逻辑,将其变成功能上等价,但是更难理解的形式。比如将for循环改写成while循环,将循环改写成递归,精简中间变量,等等。· 打乱代码的格式。比如删除空格,将多行代码挤到一行中,或者将一行代码断成多行等等。· 添加花指令,通过特殊构造的指令来使得反汇编器出错,进而干扰反编译工作的进行。代码混淆器也会带来一些问题。主要的问题包括:· 被混淆的代码难于理解,因此调试除错也变得困难起来。开发人员通常需要保留原始的未混淆的代码用于调试。· 对于支持反射的语言,代码混淆有可能与反射发生冲突。· 代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。 |
代码虚拟机(X86) | 针对X86代码: 是指将机器代码翻译为机器和人都无法识别的一串伪代码字节流;在具体执行时再对这些伪代码进行一一翻译解释,逐步还原为原始代码并执行。 这段用于翻译伪代码并负责具体执行的子程序就叫作虚拟机VM(好似一个抽象的CPU)。它以一个函数的形式存在,函数的参数就是字节码的内存地址。 由于虚拟机代码和虚拟机CPU的实现可以做到每次都是随机设计和随机执行 并且代码每次可以随机变化,包括一些逻辑上的等价变化可以参考硬件N个与非门NOT-AND实现各种逻辑门,算法和访问内存形式的变化,包括数学上的非等价变化,代码体积几乎可以膨胀达到100到10000倍,造成机器无法做算法还原到原有逻辑。可以参考:https://bbs.pediy.com/thread-139586.htm https://zhuanlan.zhihu.com/p/28700011 |
碎片代码执行(X86/IL) | 深思自主知识产权的最新技术:基于 LLVM 和 ARM 虚拟机技术,自动抽取海量代码移入 SS 内核态模块,极大的降低了使用门槛, 不再需要手动移植算法,可移植的算法从有限的几个增长到几乎无限多,支持的语言也不再限于 C, 这是加密技术的一次综合应用,效果上类似于将软件打散执行,让破解者无从下手。,参考https://www.sense.com.cn/VirboxProtector.html |
压缩 | 类似zip等压缩软件把代码和数据段压缩,由于带有动态密码,没有任何工具可以自动脱壳,是防止反编译和反汇编关键手段。 |
IAT表/导入表 | IAT的全称是Import Address Table,是PE程序加载其他DLL中函数一个表格主要记录,是记录PE文件中用到的动态连接库的集合,一个dll库在导入表中占用一个元素信息的位置,这个元素描述了该导入dll的具体信息。如dll的最新修改时间、dll中函数的名字/序号、dll加载后的函数地址等。而一个元素即一个结构体,一个导入表即该结构体的数组,其_IMAGE_IMPORT_DESCRIPTOR;如果该表被加密保护,如果不修复则程序脱壳之后无法正确运行。 |
资源保护 | 是指PE文件结构之后关键程序资源等二进制数据保护,使用许可加密之后存储,没有许可则无法正确解密运行。 |
CI | 自动化集成编译 |
数字签名 | 代码签名,检测程序是否修改的一种手段,同时标明产品属于哪家开发商。详情请参考:https://www.wosign.com/products/wosign_codesigning_individuals.htm |
PE | Windows可执行文件缩写,C++和Delphi VB6和dotNet程序都是PE结构,其规范可以参考微软MSDN。 |
VBP最佳实践#
如何保证VC++的代码加壳代码不崩溃
VBP官方推荐代码如下:
#pragma optimize( "g", off ) // int main(int argc, char* argv[]) { int ret = 0; char buffer[512] = { 0 }; char *szMsg = "sdk test demo\n"; printf(szMsg); VBSnippetBegin("main_vsb"); if(60 != add(20, 40)) return 1; if (10 != sub(50, 40)) return 1; ret = test_string1(); if (0 != ret) return ret; VBProtectEnd(); return 0; } #pragma optimize( "g", on )
其中关键几点注重声明
1.被VBP保护的代码一定手工取消编译优化 使用 #pragma optimize( "g", off) 关闭;
2.被VBP保护的代码不能提前return 返回,可以调用其他库函数;
3.VBP对C/C++ SEH异常支持是有问题,不推荐VBP保护的代码带有异常;
4.VBP保护的代码对于C++的对象析构也会出问题;
5.代码集中声明,最好放到VBPBegin之前。
给出一个最佳实践:
#pragma optimize( "g", off ) Int demo_function(void) { Int i =0; Int ret =0; //变量集中声明 Void * p = NULL; //code start ….. VBProtectBegin(“demo”) P = malloc(2048); if (p == NULL) { printf(“memory alloc faield…\n”); goto END; } For(i=0;i<365;i++) { Ret = func(i); If (ret != OK) { Printf(“failed\n”); Break; } } END: If (p != NULL) { Free(p); p= NULL; } VBProtectEnd(); Return ret; } #pragma optimize( "g", on )
如何CI 自动化编译打包部署#
1.先把VBP的安装目录加入CI服务器的Path目录中
2.在CI编译设置中在编译之后加入VBP处理的脚本
a)脚本:virboxprotector_con.exe your.exe/your.dll
3.被处理大的PE文件和VBProtect的工程文件一定要在一起,才能处理;
安全性和【兼容性/稳定性】的平衡#
最佳实践: 1.安全性最大:先使用VBP最大保护,然后加壳再做测试,出现问题之后再根据具体问题减少加壳选项; 2.兼容性最好:先使用VBP最小保护,任何选项都不选,然后加壳再做测试,逐步加加密选项,看成是否能顺利启动。 3.使用碎片代码保护关键性执行1-2次代码,多加,最好10处以上,黑客就基本放弃到盗版了,主要用来保护软件跟授权最大化关联。 4.代码虚拟机用来保护重要关键代码可以是授权相关也可以是核心算法,但是效率会降低1万倍数量级别,代码混淆是可以还源代码逻辑效率降低1000倍数量级,两者相互使用最大化保护代码逻辑,防止竞争对手抄袭算法。 5.代码加密是性价比最高的代码保护,建议全加,尤其是dotNet代码。
注意几个问题:#
1.PE文件结构如果有附加数据会被加密,程序执行时候会解密,但是第三方静态读取数据不会自动解密,所以数据校验会失败。
2.程序加壳之后会被防毒软件当作病毒,恭喜你,说明你的保护强度非常可以,杀毒软件自带的脱壳器无法识别你的文件原始信息,但是烦恼就是杀毒软件会不断报毒,这点请参考外壳专门的免杀。
免杀相关#
参考 加壳工具相关文档
Visual C++相关#
全局优化; Debug与Release C89 C99 与微软历史版本兼容性 VC编译器的BUG等 这部分参考互联网相关搜索。