命令行保护程序
本文档适用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> | 无 |
输出路径 | -o | protected/<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类名下的方法均会被混淆。
注意
- 每个程序的函数名都不一样,根据自己的需求指定对应的函数名;
- 一个函数名不能同时指定代码混淆和代码虚拟化两种保护方式;
- 函数选项过多代码虚拟化后可能会影响程序性能,建议对关键函数进行设置代码虚拟化。
#
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-CSharp
和 Assembly-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-BCEvirboxprotector_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-VME1.使用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