四款iOS加固工具评测

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

Obfuscator-LLVM

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

Obfuscator-LLVM提供了以下功能:github

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

安装shell

因为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里配置一下,具体步骤可参考这里xcode

使用bash

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

保护的范围能够经过两种方式选择,函数

  • 经过添加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之类。

横向对比

最后,放上一个横向对比供你们参考:

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

相关文章
相关标签/搜索