四款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之類。

橫向對比

最後,放上一個橫向對比供你們參考:

從安裝使用,到加固的效果,整體來講,頂象和易盾的加固都是很不錯的,特別是頂象企業版裏的代碼虛擬化功能,是個絕對的亮點。後續若是接觸到其餘加固工具,我會補充進來。

相關文章
相關標籤/搜索