Skip to main content

命令行保护程序

本文档适用Virbox Protector版本:3.x及以上版本。

命令行工具#

1.Virbox Protector 的命令行工具 virboxprotector_con 的默认路径位于:

1)Windows平台:C:\Program Files\senseshield\Virbox Protector 3\bin2)Linux平台:/usr/share/virboxprotector/bin3)macOS平台:/Applications/Virbox Protector 3.app/Contents/MacOS/bin

2.调用命令行可以指定完整全路径,例如:

"C:\Program Files\senseshield\Virbox Protector 3\bin\virboxprotector_con.exe" <file_path> <options ..> -o <output_path>

3.如果在Windows系统,也可以加入环境变量,然后直接输入 virboxprotector_con,无需输入全路径。

4.非Windows系统,也可以设置软链接:

例如Linux系统,参考命令:sudo ln -s /usr/share/virboxprotector/bin/virboxprotector_con /usr/local/bin/virboxprotector_con

然后即可直接输入virboxprotector_con 命令进行保护。

命令行主功能#

参数选项#

1.使用virboxprotector_con --help查看命令选项参数;

支持的类型如下:

--help={native|dotnet|apk|aab|aar|app|u3d|java-bce|java-vme|h5|strip|u3dres|mulpkg|ilmerge}

例如查看apk的参数,命令:

virboxprotector_con --help=apk

其中 native 程序是指操作系统原生的程序类型,运行时不依赖于虚拟机或解释器的程序,一般由C/C++/Delphi/VB6 等语言编译生成,包括 Windows 下 PE 格式的程序(.exe/.dll/.sys等后缀),Linux/Android 下 ELF 格式的程序(.so后缀或主程序),macOS/iOS 下的 MachO 格式的程序(.dylib或主程序)。

2.对于一般的程序类型,可以直接传入路径进行保护,程序类型可以自动识别,如:

virboxprotector_con <file_path> <options ...> -o <output_path>

3.对于几类特殊的保护方式,需要指定类型:

保护方式参数
Java-BCE 保护方式-java
Unity3D资源加密(Windows/Linux热更新)-u3dres
Html5应用(.js)-h5
移除调试信息(ELF格式 strip)-strip
多渠道打包-mulpkg
程序集合并-ilmerge

java bce方式保护,举例:

virboxprotector_con -java <java_dir> <other_options ...>

命令行风格#

对于绝大部分开关类型的命令行选项,使用 --{opt}=value 的风格,1代表开启,0 代表关闭:

举例

--mem-check=1, --jit-enc=0

程序类型和选项#

Android应用#

注:其中选项的具体功能介绍参考安卓APK/AAB保护最佳实践文档。

Android应用包括apk和aab两种格式,使用命令行保护时可根据自己的功能需求指定参数。

选项命令行默认选项
Dex 加密--dex-enc=APK:1, AAB:0
字符串加密--str-enc=0
文件校验--file-check=1
签名校验(APK)--sign-check=0
反注入--anti-inject=1
内存保护--mem-protect=0
防截屏--anti-screenshot=0
调试器检测--detect-dbg=1
模拟器检测--detect-emu=0
Root检测--detect-root=0
多开检测--detect-multi=0
代理检测--detect-proxy=0
VPN检测--detect-vpn=0
输出 apks (AAB启用签名时生效)--apks=<apks_path>N/A

资源加密

使用 --res-enc=1 开启资源加密,资源列表使用 ; 隔开,支持通配符 *

选项命令行默认选项
启用-res-enc=<value>0
资源列表-res <resource_list>默认只支持assets和res/layout目录下的资源
过滤资源文件--exclude-res=<exclude_list>N/A

举例:

保护指定的资源:--res-enc=1 -res "file1;file2;assets/file1;assets2/*"保护支持的所有资源:--res-enc=1 -res "*"

场景示例:

1.若res目录的资源混淆过

1)保护res/layout目录下所有的资源文件,命令参考如下

virboxprotector_con app-release.apk --filter-res=0 --res-enc=1 -res "@layout/*"

2)保护res目录下指定文件,文件路径需要以加壳工具界面显示的路径为准,命令参考如下

virboxprotector_con app-release.apk --filter-res=0 --res-enc=1 -res "@layout/abc_action_item"

2.若res目录的资源没有混淆过

1)保护res/layout目录下的资源文件,命令参考如下

virboxprotector_con app-release.apk --filter-res=0 --res-enc=1 -res "res/*"

2)保护res目录下指定文件,文件路径需要以加壳工具界面显示的路径为准,命令参考如下

virboxprotector_con app-release.apk --filter-res=0 --res-enc=1 -res "res/layout/abc_action_item.xml"

SO 保护

选项命令行默认选项
隐藏符号表--hide-symtab=0
资源列表-lib <nativelib_list>N/A
过滤so库文件--exclude-lib=<exclude_list>N/A

举例:

--hide-symtab=0 -lib "lib/armeabi-v7a/libhello.so;/lib/arm64-v8a/*"

函数选项

APK/AAB 的函数级保护仅支持代码虚拟化

默认虚拟化入口Application类 和 Main Activity类中的方法,指定具体函数见 函数选项

多渠道打包

多渠道打包见 多渠道打包

签名

签名选项见 签名选项

举例

开启dex加密、文件校验、签名校验、资源加密、选择so库和启用签名功能,命令参考如下:virboxprotector_con app-release.apk     --dex-enc=1 --file-check=1 --detect-dbg=0 --sign-check=1    --res-enc=1 -res "assets/*;res/layout/*"    --hide-symtab=0 -lib "lib/armeabi-v7a/libhello.so;/lib/arm64-v8a/*"    --sign=1 --ks="test/android.ks" --ks-pass=mypass --ks-key-alias=CERT --key-pass=mykeypass    -o app-release-protected.apk

AAR程序#

Android AAR 支持代码虚拟化,和其中的SO库的保护:

选项命令行默认选项
虚拟化的方法-v <method_list>随机
字符串加密--str-enc=0
过滤不支持的方法--ignore-unsupported=随机
隐藏符号表--hide-symtab=0
选择so库保护-lib <native_libraries>随机
输出路径-o <path>xxxx_protected

举例

保护com.example 包下所有类方法,开启字符串加密,保护所有so库,命令参考如下:virboxprotector_con test.aar -v "com.example.*" --str-enc=1 -lib "jni/*" -o protected/test.aar

PE程序#

注:其中选项的具体功能介绍参考Native程序保护最佳实践文档。

PE格式一般是指Windows下的程序(.exe/.dll/.sys等后缀)。

选项命令行默认选项
压缩--pack=1
内存校验--mem-check=0
导入表保护--imp-protect=0
资源加密--res-sect-enc=0
附加数据加密--overlay-enc=0
调试器检测--detect-dbg=0
虚拟机检测--detect-vm=0
移除强名称签名--remove-sns=1

举例

对exe保护,开启压缩、内存校验、导入表保护和调试器检测功能,命令参考如下:virboxprotector_con test.exe --pack=1 --mem-check=1 --imp-protect=1 --detect-dbg=1 -o protected/test.exe

ELF程序#

注:其中选项的具体功能介绍参考Native程序保护最佳实践文档。

ELF格式一般是指Linux/Android下的程序(.so后缀或主程序)。

选项命令行默认选项
压缩--pack=1
导入表保护--imp-protect=0
内存校验--mem-check=0
内存保护(仅Linux)--mem-protect=0
调试器检测--detect-dbg=0
移除调试信息--strip-dbginfo=1

举例

对linux可执行程序保护,开启压缩、内存校验、导入表保护、调试器检测和移除调试信息功能,命令参考如下:virboxprotector_con test --pack=1 --mem-check=1 --imp-protect=1 --detect-dbg=1 --strip-dbginfo=1 -o protected/test

MachO程序#

注:其中选项的具体功能介绍参考Native程序保护最佳实践文档。

MachO格式一般是指macOS/iOS下的程序(.dylib或主程序)。

选项命令行默认选项
内存校验--mem-check=0
调试器检测--detect-dbg=0
移除调试信息--strip-dbginfo=1

签名选项

签名选项 中的 iOS/macOS 签名;

如果是macOS arm架构的程序,需要启用签名对保护后的程序进行签名。

举例

对mac可执行程序保护,开启内存校验、调试器检测和移除调试信息功能,命令参考如下:virboxprotector_con test --mem-check=1 --detect-dbg=1 --strip-dbginfo=1 -o protected/test

函数选项

函数选项内的功能参数描述。

举例

对mac可执行程序保护,对指定的类进行保护并开启内存校验、调试器检测和移除调试信息功能,并启用签名,命令参考如下:virboxprotector_con test -v "-[ViewController *]" -m "-[SecondViewController *]" --mem-check=1 --detect-dbg=1 --strip-dbginfo=1 --sign=1 --identity="Apple Development:ceshi@123.com" -o protected/test 

APP程序#

注:其中选项的具体功能介绍参考iOS应用保护最佳实践文档。

APP程序保护macOS app和iOS app两种格式的程序,使用命令行保护时可根据自己的功能需求指定参数。

选项命令行默认选项
内存校验--mem-check=0
调试器检测--detect-dbg=0
移除调试信息--strip-dbginfo=1
Objective-C名称混淆--objc-rename=0
签名校验(仅iOS)--sign-check=0
指定app内的frameworks--frameworks=<.framework>
输出路径-oprotected/<file_name>

举例

1.使用命令行查看系统上的证书security find-identity -v -p codesigning2.对ipa保护,勾选内存校验、调试器检测和签名校验选项,并启用签名,命令参考如下:virboxprotector_con test.ipa --mem-check=1 --detect-dbg=1 --sign-check=1 --sign=1 --identity="证书id" -o protector/test.ipa

1.macOS app保护,参考示例:

开启内存校验、调试器检测和移除调试信息功能,并启用签名,命令参考如下:virboxprotector_con test.app --mem-check=1 --detect-dbg=1 --strip-dbginfo=1 --sign=1 --identity="Apple Development:ceshi@123.com" -o protected/test.app

2.iOS app保护,参考示例:

开启内存校验、调试器检测和移除调试信息功能,并启用签名,输出ipa,命令参考如下:virboxprotector_con test.app --mem-check=1 --detect-dbg=1 --strip-dbginfo=1 --sign=1 --identity="Apple Development:ceshi@123.com" --ipa=protected/test.ipa

3.若app中的有framework框架,使用--frameworks=<.framework>参数保护app内的framework框架,其中<.framework>是指app内嵌套的framework的文件名,参考示例:

virboxprotector_con test.app --mem-check=1 --detect-dbg=1 --strip-dbginfo=1 --frameworks="test.framework" --sign=1 --identity="Apple Development:ceshi@123.com" --ipa=protected/test.ipa

函数选项

选项参数
代码虚拟化-v
代码混淆-m
忽略不支持的函数--ignore-unsupported=

支持指定函数名称或规则保护,使用 ;号隔开,支持通配符 *,举例:

-m "function1;function2" -v "function3;function4" --ignore-unsupported=1

举例

1)对指定的方法名进行混淆和虚拟化,参考示例:

virboxprotector_con test.app -v "-[ViewController setDetectResults:];-[ViewController timer]" -m "-[ViewController setTableView:];-[ViewController detectResults]" --detect-dbg=0 --sign-check=0 --sign=1 --identity="Apple Development: XXXX@qq.com" --ipa=protected/test.ipa

2)对某个类名进行混淆和虚拟化,参考示例:

virboxprotector_con AppProtectDemo.app -v "-[ViewController *]" -m "-[SecondViewController *]" --detect-dbg=0 --sign-check=0 --sign=1 --identity="Apple Development: XXXX@qq.com" --ipa=protected/test.ipa

上面命令表示:ViewController类名下的方法均会被虚拟化,SecondViewController类名下的方法均会被混淆。

注意

  1. 每个程序的函数名都不一样,根据自己的需求指定对应的函数名;
  2. 一个函数名不能同时指定代码混淆和代码虚拟化两种保护方式;
  3. 函数选项过多代码虚拟化后可能会影响程序性能,建议对关键函数进行设置代码虚拟化。

NET程序#

选项命令行默认选项
压缩--pack=0
JIT 加密--jit-enc=1
资源加密--res-enc=0
字符串加密--str-enc=1
附加数据加密--overlay-enc=1
调试器检测--detect-dbg=0
名称混淆--rename=0
名称混淆保留规则--keep-rules=""
运行平台--platforms=<platform_list>N/A
启用强名称签名--sns=N/A
强名称密钥路径--snk=N/A

如果没有附加数据,则忽略 --overlay-enc 选项。

名称混淆选项

--rename=0 关闭。

--rename=1 混淆私有成员。

--rename=2 保留自定义名称。

名称保留规则

使用封号; 隔开,支持通配符*

举例

virboxprotector_con test.dll --pack=0 --jit-enc=1 --str-enc=1 --rename=2 --keep-rules="MyNamespace.MyInterface.*;MyNamespace.ExportForInvoke.*"

函数选项

函数选项,默认对入口函数代码加密。

举例

开启压缩、jit加密、字符串加密和调试器检测,同时勾选Windows和Linux运行平台virboxprotector_con test.exe -v "*" --ignore-unsupported=1 --pack=0 --jit-enc=1 --str-enc=1 --detect-dbg=1 --platforms="windows-x86;linux-x86" -o prrotected/test.exe

Unity3D程序#

Unity3D程序包括windows、Linux、macOS、Android和iOS平台的程序,其中unity又包括il2cpp和mono格式的程序,使用命令行保护时可根据自己的功能需求指定参数。

选项命令行默认选项
内存校验(仅il2cpp)--mem-check=1
文件校验(仅安卓)--file-check=1
签名校验(仅安卓的apk)--sign-check=0
反注入(仅安卓)--anti-inject=1
内存保护(仅安卓)--mem-protect=0
Unity引擎保护(仅安卓il2cpp)--unity-engine-protect=1
MetaData名称混淆(仅il2cpp)--metadata-rename=0
调试器检测--detect-dbg=1
反截屏--anti-screenshot=0
模拟器检测(仅安卓)--detect-emu=0
Root检测(仅安卓)--detect-root=0
多开检测(仅安卓)--detect-multi=0
代理检测--detect-proxy=0
VPN检测--detect-vpn=0

程序集加密

使用 -asm 指定程序集列表,使用封号 ; 隔开,支持通配符 *,默认会加密 Assembly-CSharpAssembly-UnityStrcip 开头的 Dll,一般无需指定。

举例:

-asm "Data/Managed/Assembly-CSharp.dll;Data/Managed/Assembly-CSharp-first.dll"

资源加密

使用 --res-enc=1 开启资源加密,资源列表使用封号; 隔开,支持通配符 *

选项命令行默认选项
启用--res-enc=0
大小优先(仅安卓、iOS)--res-favor-size=0
资源加密密码(仅Windows/Linux/Android)--res-pass=N/A
资源列表-res <resource_list>默认所有资源
过滤资源文件--exclude-res=<exclude_list>N/A

举例:

--res-enc=1 -res "file1;file2;assets/file1;assets2/*"

Java程序#

Java-BCE#

virboxprotector_con -java <project_directory> [--java-pass=<password>] [-o <output_directory>]
选项命令行默认选项
设置密码--java-pass=随机
加密内嵌jar包--include-embedded=0
运行平台--platforms=<platform_list>N/A
输出路径-o <path>xxxx_protected

举例:

virboxprotector_con -java my_java_dir --java-pass=12345 --include-embedded=1 -o my_java_dir_protected

Java-VME#

1.使用virboxprotector_con --help=java-vme可查看具体的帮助信息。

选项命令行默认选项
虚拟化的方法-v <method_list>随机
过滤不虚拟化的方法-ev <method_list>随机
字符串加密--str-enc=0
调试器检测--detect-dbg=0
文件校验--file-check=0
过滤不支持的方法--ignore-unsupported=随机
运行平台--platforms=<platform_list>N/A
输出路径-o <path>xxxx_protected

2.java-vme方式不支持直接对内嵌jar包加密,需要将内嵌jar包取出后再进行加密,将加密后的内嵌jar包放回原jar包,对原jar包在进行加密。

3.java-vme方式仅支持对函数虚拟化保护。

virboxprotector_con <jar_path> -v "com.example.test1.*;com.example.test2.*" -o <output_path>

举例(保护test1和test2的所有方法):

virboxprotector_con my_jar.jar -v "com.example.test1.*;com.example.test2.*" -o protected/my_jar.jar

举例(保护jar包中的所有方法):

virboxprotector_con my_jar.jar -v "*" -o protected/my_jar.jar

H5应用#

virboxprotector_con -h5 <dir_or_file> -o <output_path>

静态库和目标文件#

使用virboxprotector_con --help=archive可查看具体的帮助信息。

选项命令行默认选项
合并目标文件(仅静态库)--obj-merge=<value>0
名称混淆--rename=<value>0
名称混淆保留规则--keep-rules=<rules>
保留自定义符号文件--keep-file=<file_path>
代码虚拟化-v <method_list>
代码混淆-m <method_list>
过滤不支持的方法--ignore-unsupported=<value>
输出文件-o <output_path>

名称混淆选项

--rename=0 关闭。

--rename=1 混淆私有成员。

--rename=2 保留自定义名称。

举例

virboxprotector_con <file_path> -m test --rename=2 --keep-rules=test;main -o <output_path>

合并目标文件

举例

virboxprotector_con -objmerge <archive1> <archive2> ... <options ...> -o <output_path>

签名选项#

APK/AAB 签名#

选项命令行默认选项
启用签名--sign=0
Key Store 路径--ks=全局配置
Key Store 密码--ks-pass=全局配置
密钥别名--ks-key-alias=全局配置
密钥密码--key-pass=全局配置

举例

virboxprotector_con <file_path> <other_options ...>     --sign=1 --ks="test/android.ks" --ks-pass=mypass --ks-key-alias=CERT --key-pass=mykeypass     -o <output_path>

iOS/macOS 签名#

注意:签名校验功能只会校验证书的Team id,不校验证书的类型

选项命令行默认选项
启用签名--sign=0
证书--identity=N/A
输出ipa文件--ipa=N/A

证书查找命令参考:security find-identity -v -p codesigning

函数选项#

支持指定函数名称或规则保护,使用 ;号隔开, 支持通配符 *

选项命令行通配符
忽略不支持的函数--ignore-unsupported=<value>N/A
代码加密-e支持 *
代码混淆-m 支持 *
代码虚拟化-v

举例

-m "function1;function2" -v "function3;function4" -e "test*" --ignore-unsupported=1

其中--ignore-unsupported= 选项用于忽略不支持的函数,不支持则跳过,对 Jar/aar/war/apk/aab 格式的程序默认开启。

注意:

1.Android app/apk、Android aar、Java vme方式保护时,只有代码虚拟化功能。

2.iOS app和macOS app保护时,只有代码虚拟化和代码混淆功能。

其它选项#

多渠道打包#

保护并使用渠道模板

virboxprotector_con <apk_path> <other_options ...>     --mulpkg-template=<template_path> --mulpkg-outdir=<multi_package_outdir>     [-o <output_main_apk_file>]

仅渠道打包不做保护

virboxprotector_con -mulpkg <apk_path> --mulpkg-template=<template_path> -o <output_directory>

指定签名(可选)

以上命令,均可指定签名选项,见 签名选项

程序集合并#

使用 -ilmerge 选项进行合并:

virboxprotector_con -ilmerge <main_assembly> <other_assemblies ...> -o <output_path>

举例

virboxprotector_con -ilmerge Project.exe MyLibrary1.dll MyLibrary2.dll -o Merged/Project.exe

移除符号表#

使用 -strip 选项移除 ELF 程序中的调试信息(静态符号表和静态字符串表):

virboxprotector_con -strip <file_path> -o <output_path>

举例

virboxprotector_con -strip libhello.so -o striped/libhello.so