ios-class-guard - iOS程式碼混淆與加固實踐
目錄
摘要
本文介紹了在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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iOS應用加固--程式碼混淆iOS
- ios加固,ios程式碼混淆,ios程式碼混淆工具, iOS原始碼混淆使用說明詳解iOS原始碼
- 程式碼安全之程式碼混淆及加固(Android)?Android
- 【iOS開發】iOS App的加固保護原理:使用ipaguard混淆加固iOSAPP
- Android程式碼混淆的實踐Android
- iOS安全/程式碼混淆iOS
- iOS 初探程式碼混淆(OC)iOS
- JavaScript混淆安全加固JavaScript
- 前端程式碼安全與混淆前端
- 程式碼混淆工具ipaguard:如何使用ipaguard保護和混淆iOS應用程式程式碼iOS
- iOS程式碼實踐總結iOS
- Flutter 程式碼混淆 混淆Dart程式碼FlutterDart
- 程式碼混淆與反混淆學習-第二彈
- ios安全加固 ios 加固方案iOS
- App加固中的程式碼混淆功能,讓逆向工程師很頭疼APP工程師
- 深度解析Android APP加固中的必備手段——程式碼混淆技術AndroidAPP
- class-dump 混淆加固、保護與最佳化原理
- 【程式碼混淆】react-native 程式碼混淆React
- 微信開發者工具實現程式碼加固
- python程式碼混淆與編譯Python編譯
- SpringBoot程式碼混淆與反混淆加密工具詳解Spring Boot加密
- iOS安全加固方法及實現iOS
- js程式碼混淆JS
- Android Studio實現程式碼混淆Android
- 基於多重替換方式的iOS程式碼混淆方案iOS
- Android程式碼混淆&元件化混淆方案Android元件化
- 鴻蒙程式碼配置混淆鴻蒙
- Android程式碼混淆Android
- iOS程式碼瘦身實踐:刪除無用的類iOS
- 【教程】深入探究 JS程式碼混淆與加密技術JS加密
- Python程式碼混淆工具,Python原始碼保密、加密、混淆Python原始碼加密
- 前端程式碼質量的思考與實踐前端
- powershell程式碼混淆繞過
- 程式碼混淆的規則
- iOS使用shell指令碼注入混淆內容iOS指令碼
- JNI程式碼實踐
- Eclipse與Android原始碼中ProGuard工具的使用(程式碼混淆)EclipseAndroid原始碼
- 唯品會iOS程式碼覆蓋率的應用實踐iOS