年前我們的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的結構,程式碼膨脹了數倍。
小結
- 開源專案,程式碼也比較簡單,採用LLVM相同的開源協議,基本上啥都不限制,可以用於商業軟體。
- 跟Xcode整合比較方便,開啟加固後可以直接在xcode裡除錯。
- 據說開發團隊把中心放在他們的商業專案,所以這個開源版本應該是不維護了,支援的Xcode版本較低,需要自己移植。程式碼裡還有一些bug根本沒人fix,已知bug[傳送門]https://github.com/obfuscator-llvm/obfuscator/issues。
- Apple的llvm版本跟官方開源llvm略有不同,移植高版本llvm打包生成的bitcode,iTunesConnect是識別不了的,upload的時候無法通過原始檔處理,不能帶bitcode上架。
- 只能針對函式做混淆,沒有字串混淆,試過交大孤挺花那個版本,似乎對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一下,編譯一個未加固版本,然後再用加固工具進行處理,所以實際上編譯了兩遍,如果工程比較大,編譯一次挺浪費時間的。
小結
- 易盾加固安裝簡單,配置也比較方便。
- 功能豐富,除了程式碼混淆以外,還有字串、符號混淆、防除錯等功能。
- 不需要改工程的配置,加固所用到的工具和配置都是獨立的,設定起來也比較簡單。
- 只能用命令列進行呼叫,不能跟xcode結合起來,除錯不方便。
- 開啟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
三個字元混淆,可以自定義修改
小結
- 安裝比較方便,可以整合在xcode中,也支援xcodebuild命令列呼叫。
- 功能豐富,程式碼虛擬化保護技術是其他工具沒有的,加固強度是這幾個裡面最高的。
- 配置方式太多,使用起來稍顯複雜,有一定的學習成本。
- 加固後帶bitcode,拿一個小應用測過可以上架。
- 加固後可以直接除錯,不開虛擬化保護的函式,能直接對應到行號,這點很方便。
- Xcode不允許第三方編譯器提交AppStore,所以加固完需要手動修改一下plist檔案,不知道後續會不會優化。
## 360加固
[360iOS加固]jiagu.360.cn/qcms/help.h…為線上加固,現階段是免費內測,不需要安裝相關程式,只需要在工程中進行相關的配置即可。
使用
- 首先確保bitcode已開啟。
- 關閉
Generate Debug Symbol
,這個選項是去除除錯資訊, 並將Optimization Level
設為-O0
- Archive。
- 將Archive出來的檔案上傳到360加固官網,選擇加固級別及Xcode版本。
- 下載加固後的壓縮包。
效果 官方宣稱有以下三個功能:
- 混淆加固函式流,應該也是ollvm那一套 這個是Level3 強度優先的效果,一張圖截不下,Level1 效率優先的效果跟這個也差不了多少, 一個非常簡單十幾行程式碼的函式,被膨脹了幾十上百倍。
- 隱藏程函式呼叫,恕我愚鈍,不知道是啥, 也沒測出來
- 字串和符號深度加密,實測沒看到這個效果,選了強度優先,符號和字串都沒變化,不知道是不是又是姿勢不對。
小結
- 整個過程比較簡單,沒有什麼學習成本,但是打包-上傳-下載的操作路徑有點長。
- 就是因為太簡單了,可定製性太差,不能選擇保護的範圍,只能選一個全域性的強度。
- 需要強制關閉除錯資訊和編譯器優化,開發的時候不可能關閉除錯資訊,加固的時候就要來回改配置,加固後除錯也是個問題。
- 必須開啟bitcode,如果你的專案裡依賴了一個第三方不帶bitcode的庫,就開不起來bitcode,也就沒辦法用360加固。
- 加固後同樣沒有bitcode,也沒有選項可以開啟,估計用的也是llvm 5.0之類。
橫向對比
最後,放上一個橫向對比供大家參考:
從安裝使用,到加固的效果,總體來說,頂象和易盾的加固都是很不錯的,特別是頂象企業版裡的程式碼虛擬化功能,是個絕對的亮點。後續如果接觸到其他加固工具,我會補充進來。