四款iOS加固工具評測

賓士雪鐵龍發表於2018-04-19

年前我們的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。

四款iOS加固工具評測

保護的範圍可以通過兩種方式選擇,

  • 通過新增C Flags開啟全域性保護。

四款iOS加固工具評測

  • 通過函式註解的方式針對特定函式開啟
    int foo() __attribute((__annotate__(("fla"))));
    int foo() {
       return 2;
    }
    複製程式碼

然後直接編譯,整個保護過程並不算複雜。

效果

這個是某個函式混淆全開的效果,可以清晰地看出fla的結構,程式碼膨脹了數倍。

四款iOS加固工具評測

小結

  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[]型別字串沒用, 不知道是不是我姿勢不對,圖片摘自他們的文件。

四款iOS加固工具評測

  • 程式碼邏輯混淆, 猜測類似ollvm的fla+bcf+sub
  • 符號混淆,防class-dump的,看上去是把符號換成了等長的亂碼字串,感覺不是隨機的,更像是個可逆的變換。selector中相同的部分,混淆後也是一樣的(圖片摘自文件,注意下圖第三個框裡的andReplyID和下一行)。

四款iOS加固工具評測

  • 防除錯,這個功能算是錦上添花吧,開啟後自動在app裡注入防除錯的程式碼,省去了自己寫這部分程式碼。 易盾的加固過程是先clean一下,編譯一個未加固版本,然後再用加固工具進行處理,所以實際上編譯了兩遍,如果工程比較大,編譯一次挺浪費時間的。

四款iOS加固工具評測

小結

  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格式,圖摘自官方文件。

四款iOS加固工具評測

  • 編譯引數,需要新增在Other Linker Flags裡,也是指定百分比。 配置好之後直接在Xcode里正常Build即可。

效果

頂象的加固有以下功能:

  • 程式碼虛擬化(免費版沒有這個功能),開啟虛擬化後會使函式體消失,進入虛機執行,效果如下圖。

四款iOS加固工具評測
這個應該就是虛擬機器的程式碼(太寬了截不下)。

四款iOS加固工具評測

  • 邏輯混淆,也是ollvm那一套,略。
  • 字串加密,支援OC和C的字串,圖片摘自官方文件。

四款iOS加固工具評測

  • 符號混淆,摘自官方文件,混淆後的符號名是隨機的,預設是用Il1三個字元混淆,可以自定義修改

四款iOS加固工具評測

小結

  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版本。

四款iOS加固工具評測

  1. 下載加固後的壓縮包。

效果 官方宣稱有以下三個功能:

  • 混淆加固函式流,應該也是ollvm那一套 這個是Level3 強度優先的效果,一張圖截不下,Level1 效率優先的效果跟這個也差不了多少, 一個非常簡單十幾行程式碼的函式,被膨脹了幾十上百倍。

四款iOS加固工具評測

  • 隱藏程函式呼叫,恕我愚鈍,不知道是啥, 也沒測出來
  • 字串和符號深度加密,實測沒看到這個效果,選了強度優先,符號和字串都沒變化,不知道是不是又是姿勢不對。

小結

  1. 整個過程比較簡單,沒有什麼學習成本,但是打包-上傳-下載的操作路徑有點長。
  2. 就是因為太簡單了,可定製性太差,不能選擇保護的範圍,只能選一個全域性的強度。
  3. 需要強制關閉除錯資訊和編譯器優化,開發的時候不可能關閉除錯資訊,加固的時候就要來回改配置,加固後除錯也是個問題。
  4. 必須開啟bitcode,如果你的專案裡依賴了一個第三方不帶bitcode的庫,就開不起來bitcode,也就沒辦法用360加固。
  5. 加固後同樣沒有bitcode,也沒有選項可以開啟,估計用的也是llvm 5.0之類。

橫向對比

最後,放上一個橫向對比供大家參考:

四款iOS加固工具評測

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

相關文章