ios-class-guard - iOS程式碼混淆與加固實踐

雪奈椰子發表於2023-12-01

目錄


摘要

本文介紹了在iOS應用開發中常見的程式碼混淆和加固技術,重點討論了使用ios-class-guard和ipaguard工具進行程式碼混淆和加固的操作步驟,並探討了其原理和使用方法。透過本文的學習,讀者可以瞭解到如何保護iOS應用的安全性,降低程式碼的可讀性和破解難度。

引言

隨著移動應用的普及,iOS平臺上的應用安全問題日益受到關注。為了保護應用程式的安全性,開發者需要採取一系列措施來降低程式碼被惡意逆向工程和破解的風險。在iOS開發中,常見的安全措施包括程式碼混淆和加固。本文將介紹iOS程式碼混淆與加固的實踐,以及相關工具的使用方法和原理。

一、class-dump

  • 能夠從可執行檔案中獲取類/方法和屬性的資訊, ios-class-guard 從 class-dump 演化而來

  • 逆向工程中會使用的工具,如果可執行檔案 Mach-File 是從 AppStore 上下載的,都是經過簽名加密的,需要先進行砸殼

1. class-dump 的原理

利用 Objective-C 語言的 runtime 特性,將儲存在 Mach-O 檔案中的 @interface 和 @protocol 資訊提取出來,並生成對應的 .h 檔案

二、ios-class-guard 混淆原理

ios-class-guard 由 class-dump 演化而來,對 Mach-O 檔案進行靜態掃描,透過檔案地址分析出類、方法的名字,然後透過宏定義替換方法成無序隨機字串來達到混淆的效果

三、ios-class-guard 混淆結果

使用 ios-class-guard 的 option,最後 -o 會輸出方法名的宏定義,-m 生成方法名和隨機字串的對映表,需要將 -o 輸出的宏定義標頭檔案匯入到 Prefix.pch

四、ios-class-guar 的使用

1. 安裝 ios-class-guard

brew install ios-class-guard 或 brew install --HEAD ios-class-guard

2. 下載 obfuscate_project 混淆指令碼

curl -o obfuscate_project 

3. 編輯 obfuscate_project 混淆指令碼

修改一下幾個引數

  • 主要是修改這幾個引數, 下面是使用 workspace 管理時的引數修改(如果不是使用 workspace ,就註釋 WORKSPACE 那一行,解開 PROJECT 的註釋)

  • WORKSPACE、PROJECT、SCHEME、CONFIGURATION、CONFIGURATION 根據實際專案填寫

  • SDK 版本號可以使用 xcodebuild -showsdks 進行檢視

obfuscate_project

4. 執行 obfuscate_project 混淆指令碼

bash obfuscate_project


下面我們來分析一下 obfuscate_project 指令碼的程式碼

  • Clean current workspace

    清除 git 最近的提交

Clean current workspace

  • Just in case: wipe build

    清除 build/資料夾

Just in case: wipe build

  • Automatically detect PODS

    檢測 pod 所在位置,並執行 pod install

Automatically detect PODS

  • Build project to fetch symbols

    build 專案

Build project to fetch symbols

  • Insert SYMBOLS_FILE to all .pch found in project

    將混淆符號的 .h 檔案匯入到 含有 -Prefix.pch 的檔案中

Insert SYMBOLS_FILE to all .pch found in project

指令碼中預設 $SYMBOLS_FILE 檔名為 symbols.h

symbols

  • Obfuscate project

可以看出混淆專案的主要指令是 ios-class-guard,指令碼中使用了一下引數:$CLASS_GUARD_OPTS_SDK: (--sdk-root )$CLASS_GUARD_OPTS (自定義 ios-class-guard 引數)-O "$SYMBOLS_FILE" (輸出含有宏定義的 .h檔案 )"$app/$TARGET" (<mach-o-file>)

Obfuscate project

ios-class-guard 所有引數

ios-class-guard

  • -F 過濾不需要混淆的類 -F !AppDelegate

  • -i 過濾掉不需要使用的符號

  • --sdk-root 指定 SDK,目前只支援 iPhoneSimulator SDK

  • -m 儲存符號對映表 .json,預設為 symbols.json

  • -O 輸出定義混淆符號的標頭檔案


ios-class-guard 不支援 Swift

ios-class-guard 工具在 Github 上不支援 Swift,遇到帶 Swift 專案會報錯,具體報錯: Error: Cannot find offset for address XXXXXXXX in stringAtAddress:

ios-class-guard Error.png

後面透過 Github 找到一個支援 Swift 的 class-dump ,結合 ios-class-guard 原始碼。最終實現 Category 的過濾 -F、以及能夠在 Swift 和 OC 混編程式碼中執行;最終實現也只是對 OC 程式碼進行混淆,Swift 不做改動 -- ios-class-guard-Swift

目前 ios-class-guard-Swift 暫未支援用 install.sh 安裝 ios-class-guard,需要手動編譯一下;然後將生成的可執行檔案 exec 拖到 /usr/local/bin,之後就可以透過終端執行 ios-class-guard 命令

ios-class-guard 不支援 iPhoneOS SDK

ios-class-guard Error.png

從上面的報錯資訊,我們還可以看出除了 Error: Cannot find offset for address XXXXXXXX in stringAtAddress: 的報錯之外,還有 Warning: Failed to load: XXXXXXXX.dylib

透過 Github 的 issue 找到相關解釋,ios-class-guard 不支援 iPhoneOS SDK,所以在選擇引數時需要選擇 iPhoneSimulator,例如 ios-class-guard --sdk-root /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.2.sdk

ios-class-guard iPhoneOS SDK

然後在作者的回答中也有提到,PreEmptive Protection for iOS - Rename (or PPiOS-Rename),使用相同的原理,但是它將使用 iPhoneSimulator 支援 iPhoneOS SDK,但是經測試,該工具只能用於純 OC 專案,並不支援 OC 與 Swift 混編的專案

PPiOS-Rename

ios-class-guard --sdk-root

執行以下命令

ios-class-guard -O XXX --sdk-ios /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.2.sdk 'XXXX.app' 出現了以下提示報錯

--sdk-ios

後面在 issue 中找到相關回答

issue

解決方案是用 --sdk-root 代替 --sdk-ios

--sdk-root

ios-class-guard OC & Swift

ios-class-guard 執行結果,會輸出宏定義 .h 檔案,當我們匯入該 .h 時,OC 的類/方法被定義為混淆字串。

注意:如果在混編專案中,Swift 中呼叫 OC 的類或擴充套件,需要忽略該 OC 類或擴充套件的混淆。在執行 ios-class-guard 新增 -F 引數,例如 -F !AppDelegate

綜上來看  iOS-Class-Guard操作步驟是非常繁瑣的,我們這邊引入一個新的工具-ipaguard。

 

 使用ipaguard來對程式進行加固

程式碼加固是進一步保護應用的一種方式,通常透過特定平臺來對應用進行加固處理。

這邊以ipaguard為例,目前還在免費階段,想薅羊毛的快快試試。

Ipa Guard是一款功能強大的ipa混淆工具,不需要ios app原始碼,直接對ipa檔案進行混淆加密。可對IOS ipa 檔案的程式碼,程式碼庫,資原始檔等進行混淆保護。 可以根據設定對函式名、變數名、類名等關鍵程式碼進行重新命名和混淆處理,降低程式碼的可讀性,增加ipa破解反編譯難度。可以對圖片,資源,配置等進行修改名稱,修改md5。只要是ipa都可以,不限制OC,Swift,Flutter,React Native,H5類app。

所以就要使用到混淆器,混淆器是把裡面的程式碼變數等資訊進行重新命名,這樣可讀性會變得非常差,接著,

到這裡,我們完成了對程式碼的混淆,但是還沒有進行加固,防止反編譯,所以,請往下看

然後匯入自己的包就可以了,這裡是流水式的走下來,所以只需要匯入和匯出就可以了,

新增單個檔案,選擇好剛剛混淆後的包,然後你做的事情就是等,等待上傳完--加固完--下載完--已完成,當到已完成的時候,說明這裡已經可以匯出了,匯出需要前面提到的自己建立的簽名,這裡可是會用到的,如果不用,則包安裝包可能會出現問題

選擇匯出簽名包,選擇簽名檔案,輸入密碼,然後點選開始匯出

 

匯出的包是經過混淆,經過加固比較安全的包了


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70026554/viewspace-2998419/,如需轉載,請註明出處,否則將追究法律責任。

相關文章