排行榜 统计
  • 文章总数:1690 篇
  • 评论总数:5 条
  • 分类总数:8 个
  • 最后更新:昨天 09:10

VirboxProtector的SDK标签使用流程

本文阅读 13 分钟
首页 安全资讯 正文

简介#

Virbox Protector工具的SDK标签静态载入到需要保护的函数当中,生成可执行程序,Virbox Protector 加壳工具解析该程序界面就能够分析出SDK标识的函数,这样就能帮助用户找到核心代码所在的位置。

目前支持的语言:c\c++\c#\oc\swift\java

环境#

1.安装Virbox Protector工具;

2.包括SDK标签所用的静态库和动态库;

windows的路径:C:\Program Files\senseshield\Virbox Protector 3\sdk\windows\x86Linux的路径:C:\Program Files\senseshield\Virbox Protector 3\sdk\linux,包括arm和x86架构macOS的路径:C:\Program Files\senseshield\Virbox Protector 3\sdk\darwin,包括arm和x86架构Android的路径:C:\Program Files\senseshield\Virbox Protector 3\sdk\android,包括arm和x86架构

3.demo示例

demo的路径:C:\Program Files\senseshield\Virbox Protector 3\example\sdk

程序类型#

Native程序#

Native程序包括Windows、Linux、ARM Linux、Android和macOS系统编译的可执行程序或动态库;

安装目录下包括SDK标签所用的头文件:
C:\Program Files\senseshield\Virbox Protector 3\sdk\inc\virbox.h

标签示例路径:C:\Program Files\senseshield\Virbox Protector 3\example\sdk

注意:

1.若一段代码两个标签同时先后顺序写,则在前面的标签不会生效,在后面的标签生效。

2.若只写Begin不写end,加壳工具解析时发现未闭合的标签则默认在保护日志中进行提示。

函数标签#

函数标签可以标记整个函数,在保护时可以保护整个函数,包括编译生成的函数入口指令。

VBMutateFunction 混淆当前函数

VBVirtualizeFunction 虚拟化当前函数

代码示例:

intadd(intx,inty){intret=0;VBMutateFunction("add#");ret=x+y;printf("x+y=%d\n",ret);returnret;}intsub(intx,inty){intret=0;VBVirtualizeFunction("sub#");ret=x-y;printf("x-y=%d\n",ret);VBProtectEnd();returnret;}

代码块标签#

代码块标签即 Begin&End 标签,可以标记函数中的代码片段,在保护时仅保护Begin和End之间的代码。

Begin标签

VBProtectBegin代码虚拟化开始

VBVirtualizeBegin代码虚拟化结束(同VBProtectBegin

VBMutateBegin代码混淆开始

VBSnippetBegin代码碎片化开始,仅支持 Virbox Protector LM (Pro)版。

End标签

VBProtectEnd代码保护结束,与Begin标签配对使用。

代码示例:

intfoo(intx){if(x==0){VBVirtualizeBegin("foo_1#");VBProtectEnd();}else{VBMutateBegin("foo_2");VBProtectEnd();}return0;}

9.注意事项:

1)只能静态加载,不支持动态加载dll(即 LoadLibrary 的方式);

2)VBProtectBeginVBVirtualizeBegin等接口,传入的字符串参数,不能与其他函数共用;

3)传入的字符串参数保证为 ANSII 码的形式,这样显示在界面上的函数名称才正确,否则就会显示为乱码;

4)每个Begin对应一个End,并且一个函数里面不要出现多对 Begin+End,Begin/End不能嵌套使用。;

5)如果标签标记的保护方式和ssp配置文件中保存的保护方式冲突了,以ssp配置文件中的保护方式为准;

6)标签Begin和End之间的代码最好大于3行(若标记的代码正汇编生成的指令小于15个字节,则加壳工具界面上不会显示该标记函数);

7)SDK动态库分32和64位,在使用的时候要开发者根据要编译的程序进行加载对应的库。

功能标签#

VBProtectDecrypt#

VBProtectDecrypt标签仅建议 Virbox Protector LM (Pro) 版本使用。

VBProtectDecrypt 使用高安全性算法(AES256)加密数据,数据长度必须为16的整数倍。

接口声明:

void *VB_API_CALL VBProtectDecrypt(void *dst, const void *src, int size);

staticconstcharg_my_key[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};inttest_decrypt(){charbuf[sizeof(g_mey_key)];VBProtectDecrypt(buf,g_my_key,sizeof(g_my_key));return0;}
字符串和数据加密#

Virbox Protector 提供了数据和字符串加密标签,使用该标签后,每次保护时会使用随机密钥加密。

VBDecryptData

函数声明:void* VB_API_CALL VBDecryptData(const void *data, int size);

VBDecryptData可以加密任意长度的常量数据

VBDecryptStringA

VBDecryptStringA 是对VBDecryptData的封装,用于方便加密字符串。

VBDecryptStringW

VBDecryptStringW 一般用于加密Windows下宽字符串。

VBFreeData

VBFreeData用于释放以上三个接口返回的字符串。可以内存搜索工具搜索到该数据。


为了方便开发者调用,Virbox Protector 另外提供了无需释放的数据解密接口,仅在第一次使用字符串时解密到堆内存,在模块卸载时自动释放。

VBDecryptDataOnce

同 VBDecryptData,无需释放。

VBDecryptStringOnceA

同 VBDecryptStringA,无需释放。

VBDecryptStringOnceW

同 VBDecryptStringW,无需释放。

代码示例:

inttest_encrypt_key(){staticconstunsignedchars_key[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10};unsignedchar*key=VBDecryptData(s_key,sizeof(s_key));for(inti=0;i!=sizeof(s_key);++i){printf("%02x ",key[i]);}printf("\n");VBFreeData(key);printf(VBDecryptStringOnceA("hello"));return0;}
安全退出#

VBSafeExit

如果程序发现一些恶意行为,调用 exitabort 等函数容易被破解者追踪到调用位置并绕过。VBSafeExit标签可动销毁调用位置的栈帧,返回地址等信息,让破解者难以追踪到调用位置。

内存校验#

void VB_API_CALL VBProtectVerifyImage();

VBProtectVerifyImage 可以校验当前模块的内存完整性,检查程序是否被篡改(包括静态补丁和动态内存补丁),如果发现篡改则自动安全退出。

int VB_API_CALL VBVerfiyImage();

VBVerifyImage 可以校验当前模块的内存完整性,检查程序是否被篡改(包括静态补丁和动态内存补丁),如果发现篡改则返回非0值。

调试器检测#

int VB_API_CALL VBDetectDebugger(void);

检测程序是否正在被调试器进行调试,发现则返回非0值。

虚拟机检测#

int VB_API_CALL VBDetectVirtualMachine(void);

检测程序是否正在VMware, Virtual Box等虚拟机中运行,发现则返回非0值。(仅支持Windows)

功能示例#

intcheck(){VBMutateFunction("check#");intcode=0;if(VBVerifyImage()!=0){code=1;}if(VBDetectDebugger()!=0){code|=2;}if(VBDetectVirtualMachine()!=0){code|=4;}if(code!=0){VBSafeEixt(0xdead0000|code);}return0;}

macOS程序#

macOS程序和Native程序所用到的sdk标签是一样的,只是在编译项目时Xcode需要进行一些配置,下面简述OC和swift使用标签时的流程:

1.OC语言

1)将virbox.h放到工程中,使用Xcode打开工程后,将virbox.h添加到工程中;

2)选中TARGETS->Build Settings->Architectures,查看项目的架构是arm64还是x64还是Fat格式的;

3)从Virbox Protector工具的安装目录sdk/darwin下找到对应架构的libvirbox64.dylib,选中TARGETS->Build Phases->Link Binary选项,添加libvirbox64.dylib;

4)在代码中引用virbox.h,并添加标签;

代码参考示例,:

#import "virbox.h"-(void)readLoad{//可以根据自己需求选择其他标签VBMutateBegin("load_test"); //代码混淆for (int i=0; i<array.count; i++) {News * news=[[News alloc]init];news.content=array[i];[_newsArray addObject:news];}VBProtectEnd();return NO;}- (BOOL)isImageSetFolder:(NSString *)folder{//可以根据自己需求选择其他标签VBVirtualizeFunction("reset_test"); //代码虚拟化if ([folder hasSuffix:kSuffixImageSet]|| [folder hasSuffix:kSuffixAppIcon]|| [folder hasSuffix:kSuffixLaunchImage]) {return YES;}return NO;}

2.Swift语言

1)将virbox.h放到工程中,使用Xcode打开工程后,将virbox.h添加到工程中,并将virbox.h设置为桥接文件;

TARGETS->Build Settings->Swift Compiler->Object-C Bridging Header->项目名/virbox.h

2)选中TARGETS->Build Settings->Architectures,查看项目的架构是arm64还是x64还是Fat格式的;

3)从Virbox Protector工具的安装目录sdk/darwin下找到对应架构的libvirbox64.dylib,选中TARGETS->Build Phases->Link Binary选项,添加libvirbox64.dylib;

4)在代码中直接添加标签,且需要给标签添加变量名;

代码参考示例:

struct ContentView: View {var body: some View {//可以根据自己需求选择其他标签var body_begin = VBMutateBegin("body_test")//代码混淆let columns = [GridItem(.flexible()),GridItem(.flexible()),GridItem(.flexible()),GridItem(.flexible())]var body_end = VBProtectEnd()//代码段结束}}struct RdioApp: App {var body: some Scene {//可以根据自己需求选择其他标签var myva = VBVirtualizeFunction("test") //代码虚拟化HStack(spacing: 24) {Image(systemName: "backward.fill").font(.title3)Image(systemName: "play.fill").font(.title)Image(systemName: "forward.fill").font(.title3)}}}

3.程序运行

1)编译后的app直接运行需要依赖libvirbox64.dylib,即将对应app程序架构的libvirbox64.dylib拷贝到/usr/local/lib/libvirbox64.dylib,然后再运行编译后的app,即可正常运行;

如果不拷贝则会报以下错误:

注:若是arm架构和FAT格式的libvirbox64.dylib,需要先对其进行签名后,再进行拷贝。

2)将编译后的app拖入到加壳工具中,函数选项即可显示标记的函数;

对文件进行保护,则保护后的程序即可运行,不会依赖libvirbox64.dylib

NET程序#

.NET程序支持代码加密、代码混淆和代码虚拟化三种函数保护方式,sdk标签参考微软标准的写法,程序编译成功后,将编译好的程序拖入到加壳工具界面,界面会显示代码中设置的函数保护方式:

标签示例参考:C:\Program Files\senseshield\Virbox Protector 3\example\sdk\dotnet_sdk_demo

代码书写方式:

//命名[Obfuscation(Feature = "Rename", Exclude = false)]//名称混淆public class main{[Obfuscation(Feature = "Mutate", Exclude = false)]//代码混淆public static void test1(string[] args){System.Console.WriteLine("hello Virbox.Mutate!");}[Obfuscation(Feature = "Encrypt", Exclude = false)]//代码加密public static void test2(string[] args){System.Console.WriteLine("hello Virbox.Encrypt!");}[Obfuscation(Feature = "Virtualization", Exclude = false)]//代码虚拟化public static void test3(string[] args){System.Console.WriteLine("hello Virbox.Virtualize!");}}

注意事项:

1.可以添加到类名前,但如果方法也设置了sdk标签,那么将会优先显示方法里设置的。

2.函数标签和名称混淆标签不能添加到代码里,只能添加到类和方法名前面。

Java程序#

JAVA程序支持代码虚拟化保护方式,代码中设置VBVirtualize注解,并在函数上引用,程序编译成功后,将编译好的程序拖入到加壳工具界面,界面会显示代码中设置的函数保护方式:

注意:文件名必须是VBVirtualize,包名必须是virbox,否则标记的标签加壳工具无法识别到。

1.新建VBVirtualize.java,内容是:

package virbox;public @interface VBVirtualize{}

2.调用方式:

import virbox.VBVirtualize;@VBVirtualize //可添加到类上面,所有的方法都会默认保护public class Main {public static void main(String[] args) {System.out.println("hello");test_vir();}@VBVirtualize //可添加到方法上面,只保护该方法public static void test_vir(){System.out.println("test_vir");}}

Android程序#

适用场景

使用虚拟化标签标记过的类和方法后,编译出的Android APK/AAB应用拖入到Virbox Protector界面进行解析时,默认会显示标记的类和方法。

若使用proguard混淆后,无法判断函数名称,若使用虚拟化标签标记过的类和方法后,在对该应用保护时就不需要去查找对应的类和方法名。

标签示例参考:C:\Program Files\senseshield\Virbox Protector 3\example\sdk\APK

注意:1)若开启proguard编译的Android APK/AAB应用,有些函数会被优化,导致标记的函数不会解析出来。2)文件名必须是VBVirtualize,包名必须是virbox,否则标记的标签加壳工具无法识别到。

操作流程

1.打开Android工程,新建一个目录,命名为virbox;

2.创建Java Class;

3.选择Interface,命名为VBVirtualize;

4.在VBVirtualize.class中添加以下代码;

package virbox;import androidx.annotation.Keep;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;@Keep@Retention(RetentionPolicy.RUNTIME)public @interface VBVirtualize {}

5.在其他类上调用VBVirtualize;

@VBVirtualize若放在类上面

若使用proguard混淆,@VBVirtualize若放在类上面,将会对该类进行标记,并保留该类的名称,其他类的名称不会进行保留;

若不使用proguard混淆,@VBVirtualize若放在类上面,将会对该类的进行标记;

import virbox.VBVirtualize;@VBVirtualizepublic class SecondFragment{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {FragmentSecondBinding inflate = FragmentSecondBinding.inflate(inflater, container, false);this.binding = inflate;return inflate.getRoot();}public void onDestroyView() {super.onDestroyView();this.binding = null;}}

@VBVirtualize若放在方法上面:

若使用proguard混淆,@VBVirtualize若放在方法上面,将会对该方法进行标记,并保留该方法的名称,其他方法的名称不会进行保留;

若不使用proguard混淆,@VBVirtualize若放在方法上面,将会对该方法进行标记;

import virbox.VBVirtualize;public class SecondFragment{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {FragmentSecondBinding inflate = FragmentSecondBinding.inflate(inflater, container, false);this.binding = inflate;return inflate.getRoot();}@VBVirtualizepublic void onDestroyView() {super.onDestroyView();this.binding = null;}}

问题#

1.标签、map、pdb文件谁的优先级高?

答:标签的优先级高且标签和map和pdb文件共存。

2.如果编译出来是arx,sdk标签也支持吗?

答:支持。

3、全局变量是否可以进行保护?

答:使用SDK标签VBDecryptStringA,PE、elf和macho格式的都可以。

4.begin end是只处理当前函数的函数体,如果函数A调用函数B,函数B使用了SDK标签,那么函数A也可以再使用SDK标签,这种情况属于嵌套么?

答:不属于嵌套。

5.c++程序,使用字符串加密sdk标签后,能使用OD调试器可以看到么?

答:使用OD在堆内存里能搜到,可以每次用完调用 VBFreeString(xxx)给释放了,就在堆内存里搜不到了。

6.C#程序,字符串加密,能防止从内存中dump出字符串么?OD调试器可以看到么?

答:不能防止从内存中dump出字符串,OD调试器直接扫是扫不到的,如果找到了真正使用字符串的地方断下来,那是可以看到的。

本文经授权后发布,本文观点不代表立场
免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。避免网络欺诈,本站不倡导任何交易行为。如您私自与本站转载自公开互联网中的资讯内容中提及到的个人或平台产生交易,则需自行承担后果。本站在注明来源的前提下推荐原文至此,仅作为优良公众、公开信息分享阅读,不进行商业发布、发表及从事营利性活动。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。
-- 展开阅读全文 --
wordpress获取文章自定义字段
« 上一篇 03-04
1元2元5元微信小号新白号,微信白号出售平台1元-微信5元一个出售平台
下一篇 » 03-04