四款iOS加固工具评测

9,067 阅读6分钟

年前我们的App iOS端被破解了,产生了一笔不小的经济损失,在老板的强烈要求下准备给我们的iOS App上个加固。由于网上对于iOS的加固讨论比较少,产品也不多,所以前段时间花了点时间调研了几种加固工具,整理了一下简单的评测。

Obfuscator-LLVM

Obfuscator-LLVM是由HEIG-VD于2010年6月发起的一个项目,可能是目前最让人熟知的iOS保护方案了,但是长期停留在llvm3.4时代,去年刚更新了个4.0,依然有很多bug。

Obfuscator-LLVM提供了如下功能:

  • [Instructions Substitution] -mllvm -sub
  • [Bogus Control Flow] -mllvm -bcf
  • [Control Flow Flattening] -mllvm -fla

安装

由于llvm4.0不支持iOS 11的SDK中引入的一些新的语法,所以官方的obfuscator-llvm 4.0版本是没办法直接使用的,需要自己port到5.0以上版本的llvm中,好在ollvm的代码非常简单,照着llvm-4.0分支里的commits做一遍就行了,主要是lib/Transforms/Obfuscation下的一堆文件和lib/Transforms/IPO/PassManagerBuilder.cpp 测试的时候开启bcf编译会crash,参考了这个pull request进行修复,看了一眼代码,好像是在某种不支持的情况下跳过了bcf..... 编译完,需要在Xcode里配置一下,具体步骤可参考这里

使用

在工程目录里修改默认编译器为Obfuscator。

保护的范围可以通过两种方式选择,

  • 通过添加C Flags开启全局保护。

  • 通过函数注解的方式针对特定函数开启
    int foo() __attribute((__annotate__(("fla"))));
    int foo() {
       return 2;
    }
    

然后直接编译,整个保护过程并不算复杂。

效果

这个是某个函数混淆全开的效果,可以清晰地看出fla的结构,代码膨胀了数倍。

小结

  1. 开源项目,代码也比较简单,采用LLVM相同的开源协议,基本上啥都不限制,可以用于商业软件。
  2. 跟Xcode集成比较方便,开启加固后可以直接在xcode里调试。
  3. 据说开发团队把中心放在他们的商业项目,所以这个开源版本应该是不维护了,支持的Xcode版本较低,需要自己移植。代码里还有一些bug根本没人fix,已知bug[传送门]https://github.com/obfuscator-llvm/obfuscator/issues。
  4. Apple的llvm版本跟官方开源llvm略有不同,移植高版本llvm打包生成的bitcode,iTunesConnect是识别不了的,upload的时候无法通过源文件处理,不能带bitcode上架。
  5. 只能针对函数做混淆,没有字符串混淆,试过交大孤挺花那个版本,似乎对OC的字符串没有效果。

网易易盾

网易易盾iOS应用加固不是免费的,从朋友那里蹭了一个网易易盾加固的试用版测了一下。

安装 易盾的加固工具是独立的编译器,不需要安装,解压就行了,但是之后需要安装一个插件xcpretty 里面内置了一个clang-5.0和xcodebuild

$ ~/Downloads/ntescstool_ef_1/tool/ntescs/bin/clang  --version
clang version 5.0.0 (tags/RELEASE_500/final)

使用

纯命令行工具,可以像xcodebuild一样使用,通过ntescstool命令完成加固功能,例如 ./ntescstool -project xxx.xcodeproj -scheme xxx -mode Archive -string-encryption 相当于将xcodebuild命令替换成ntescstool,然后再后面添加加固的参数。 加固范围的选择,提供了三种方式。

  • 函数注解,类似ollvm,函数级别的选择。
  • 配置文件,把要混淆的源代文件名放在特定的配置文件里,实现文件级别的选择。
  • 命令行参数,指定一个百分比,由加固工具随机选择。

效果

易盾加固包含以下功能:

  • 字符串加密, 支持OC字符串,但实测貌似对c代码中的char[]类型字符串没用, 不知道是不是我姿势不对,图片摘自他们的文档。

  • 代码逻辑混淆, 猜测类似ollvm的fla+bcf+sub
  • 符号混淆,防class-dump的,看上去是把符号换成了等长的乱码字符串,感觉不是随机的,更像是个可逆的变换。selector中相同的部分,混淆后也是一样的(图片摘自文档,注意下图第三个框里的andReplyID和下一行)。

  • 防调试,这个功能算是锦上添花吧,开启后自动在app里注入防调试的代码,省去了自己写这部分代码。 易盾的加固过程是先clean一下,编译一个未加固版本,然后再用加固工具进行处理,所以实际上编译了两遍,如果工程比较大,编译一次挺浪费时间的。

小结

  1. 易盾加固安装简单,配置也比较方便。
  2. 功能丰富,除了代码混淆以外,还有字符串、符号混淆、防调试等功能。
  3. 不需要改工程的配置,加固所用到的工具和配置都是独立的,设置起来也比较简单。
  4. 只能用命令行进行调用,不能跟xcode结合起来,调试不方便。
  5. 开启bitcode的情况下,加固后的文件不带bitcode,跟ollvm相同的原因,毕竟clang-5.0。

顶象加固

顶象iOS加固有一个免费的lite版,注册就能下载,但是有一些限制,联系客服咨询了一些问题,软磨硬泡要了个企业版试用。

安装

顶象的iOS加固提供的是一套编译器插件,下载解压后,放在~/Library/Developer/Toolchains/下即可完成安装,里面也带了一个clang,版本显示竟然是Apple LLVM 9.0,不知道是什么黑科技。

$ ~/Library/Developer/Toolchains/DX-VM.xctoolchain/usr/bin/clang --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)

使用

安装后需要在Xcode菜单栏 Xcode -> Toolchains 里选择 dx-vm 启用加固工具,如果想用回自带的编译器,再切换回去即可,不安装的时候,是没这个菜单的。如果要使用xcodebuild进行编译,则需要添加一个命令行参数 -toolchain dx-vm。 加固范围的选择,跟网易的差不多,也提供了三种方式,

  • 函数注解,类似ollvm。
  • 配置文件,除了可以填文件名,也可以填函数名进去,不过配置文件的格式稍微有点复杂,用了yaml格式,图摘自官方文档。

  • 编译参数,需要添加在Other Linker Flags里,也是指定百分比。 配置好之后直接在Xcode里正常Build即可。

效果

顶象的加固有以下功能:

  • 代码虚拟化(免费版没有这个功能),开启虚拟化后会使函数体消失,进入虚机运行,效果如下图。

这个应该就是虚拟机的代码(太宽了截不下)。

  • 逻辑混淆,也是ollvm那一套,略。
  • 字符串加密,支持OC和C的字符串,图片摘自官方文档。

  • 符号混淆,摘自官方文档,混淆后的符号名是随机的,默认是用Il1三个字符混淆,可以自定义修改

小结

  1. 安装比较方便,可以集成在xcode中,也支持xcodebuild命令行调用。
  2. 功能丰富,代码虚拟化保护技术是其他工具没有的,加固强度是这几个里面最高的。
  3. 配置方式太多,使用起来稍显复杂,有一定的学习成本。
  4. 加固后带bitcode,拿一个小应用测过可以上架。
  5. 加固后可以直接调试,不开虚拟化保护的函数,能直接对应到行号,这点很方便。
  6. Xcode不允许第三方编译器提交AppStore,所以加固完需要手动修改一下plist文件,不知道后续会不会优化。

## 360加固

[360iOS加固]jiagu.360.cn/qcms/help.h…为在线加固,现阶段是免费内测,不需要安装相关程序,只需要在工程中进行相关的配置即可。

使用

  1. 首先确保bitcode已打开。
  2. 关闭Generate Debug Symbol,这个选项是去除调试信息, 并将Optimization Level设为-O0
  3. Archive。
  4. 将Archive出来的文件上传到360加固官网,选择加固级别及Xcode版本。

  1. 下载加固后的压缩包。

效果 官方宣称有以下三个功能:

  • 混淆加固函数流,应该也是ollvm那一套 这个是Level3 强度优先的效果,一张图截不下,Level1 效率优先的效果跟这个也差不了多少, 一个非常简单十几行代码的函数,被膨胀了几十上百倍。

  • 隐藏程函数调用,恕我愚钝,不知道是啥, 也没测出来
  • 字符串和符号深度加密,实测没看到这个效果,选了强度优先,符号和字符串都没变化,不知道是不是又是姿势不对。

小结

  1. 整个过程比较简单,没有什么学习成本,但是打包-上传-下载的操作路径有点长。
  2. 就是因为太简单了,可定制性太差,不能选择保护的范围,只能选一个全局的强度。
  3. 需要强制关闭调试信息和编译器优化,开发的时候不可能关闭调试信息,加固的时候就要来回改配置,加固后调试也是个问题。
  4. 必须开启bitcode,如果你的项目里依赖了一个第三方不带bitcode的库,就开不起来bitcode,也就没办法用360加固。
  5. 加固后同样没有bitcode,也没有选项可以开启,估计用的也是llvm 5.0之类。

横向对比

最后,放上一个横向对比供大家参考:

从安装使用,到加固的效果,总体来说,顶象和易盾的加固都是很不错的,特别是顶象企业版里的代码虚拟化功能,是个绝对的亮点。后续如果接触到其他加固工具,我会补充进来。