App 混淆再資安保護領域來說,可謂是最複雜的一環,也是最重要的一環
但是資安檢測無法有個標準的檢核方式,因此在資安檢驗只有建議,並沒有強制要求此項
另外外在販售的 APP保護服務,都在混淆這個基礎上下功夫
回到正題,混淆到底是混淆什麼,混淆的重要性到底在哪
要了解混淆重要,要先從 app 反編譯講起,知道別人是怎麼破解app 才能知道需要怎麼保護
從 App Store 安裝的 APP,其中 .ipa 檔案都有 FairPlay DRM 保護 ,所以單純從 App Stroe 想直接反組譯是不行的
因此需要先進行「砸殼」,砸殼工具很多 dumpdecrypted 、 frida-ios-dump 、clutch、gdb....
砸殼:保護手段叫做加殼保護,相之的去掉保護就叫「砸殼」 又稱為脫殼
想深入讀者可以參考 OWASP Acquiring the App Binary 如何提取二進位檔
有詳細說明如何「砸殼」(刪除 FairPlay DRM)
用 debug下產生的 ipa 或者是release下的ipa ,都是沒有經過Apple DRM保護, 可以直接進行反編譯
這章重點在於混淆,簡單介紹砸殼讓讀者了解大概是怎麼進行
簡單的專案如下,除了套件以外,就只有一個初始 ViewController
├── AppSecDev
│ ├── AppDelegate.swift
│ ├── Assets.xcassets
│ ├── Base.lproj
│ ├── Info.plist
│ ├── SceneDelegate.swift
│ └── ViewController.swift
├── AppSecDev.xcodeproj
├── AppSecDev.xcworkspace
├── Podfile
└── Pods
尋找編譯後的 .app ,從 products 內直接使用右鍵從 Finder 尋找到編譯後二進位執行檔
AppSecDev.app
就是我們要找的編譯後二進位執行檔
屬於靜態分析的一種,將公開類別名及方法 dump 出來
使用工具 class-dump(Nygard)
在Terminal 執行
./class-dump -H APP路徑/APP名稱.app -o 匯出目標資料夾
class-dump -H .../DerivedData/AppSecDev-xxxxxx/Build/Products/Debug-iphonesimulator/AppSecDev.app -o ./out
Dump出的東西
這是原始 ViewController 內定義的方法
可以比對一下發現有點不一樣,原因是我使用的 class-dump 無法解析Swift 相關的東西,但objC 部分都沒什麼問題
因為對這個範例所需資料已經夠用
依照剛剛解析出來資料
可看出想要破解的資料應該是在 _TtC9AppSecDev14ViewController 裡面
後續可以用這個當做搜尋用的關鍵字
想要完整解析 swift 可以使用 dsdump
反編譯需要具備很多專業知識,看懂組合語言是基本東,當然還有很多『美美角角』要知道
因此這邊就不詳細敘述怎麼反編譯
反編譯很多工具可以使用,目前列出最受歡迎的 IDA 、Hopper 和 NSA 開發的Ghidra
func aes(){
let aes_message = "aes_message 咩"
let aes_key_HexString = "01234567890000000000000000000111"
let keyArray = Array<UInt8>.init(hex: aes_key_HexString)
if
let aes = try? AES(key: keyArray, blockMode: ECB()) , // aes128
let encrypted = try? aes.encrypt(aes_message.bytes) ,
let EncData = encrypted.toBase64()
{
print(EncData)
}
}
找到我們在程式內進行加密的字串
和金鑰
認真在分析,還原程式也可知道使用什麼加密演算法
看了上面的反編譯流程,可以得知順序怎麼進行,因此可以這流程上做手腳
達到混淆有心人士的意圖,讓分析動作十分困難,讓他們覺得無利可圖,而放棄
混淆可分為這三大類
字串在反編譯中算是最沒有難度,因為工具有一區就是記載全部的字串,可以慢慢在裡面找
如果字串包含很大的識別程度,很快就會被找到,像是Android 指定 加密模式是用字串
"AES/CBC/PKCS5Padding"
所以我們可以在字串上面作手腳
串接,字串雖然會複雜一點,但還是很快可以組出來因此就不討論
通常是用字串上做位元運換,或其他方式轉換,因此加密也是一種方式
加密前
詳細運作方式及原理可以參考以下文章
https://blog.csdn.net/junzia/article/details/85466578
https://blog.csdn.net/jaccty/article/details/52471196
但原理大同小異,只是演算方式不同
也有人寫好的套件可以使用 ,https://github.com/UrbanApps/UAObfuscatedString
大多數反組第一步都會先做靜態分析,從對應的class 結構來找尋有用的資料
所以要增加困難度,就是對 class name 、 method 進行混淆,使其造成閱讀困難,無法使用關鍵字搜索
有些人會自己寫
也有些不錯的工具
https://github.com/CUITCHE/code-obfuscation for ObjC
https://github.com/rockbruno/swiftshield for Swift
為了讓反組譯的人更不容易找到資料,所以會針對指令修改,流程做的更複雜,讓人更不好破解
控制流程扁平化
指令替换
標準二元運算符(+ , – , & , | 和^)
SDK API function 置換
虚假控制流程
iOS 上有人又稱為 OLLVM (Obfuscator-LLVM),用這個關鍵字也可以找到很多前輩分享的作法
程式碼混淆保護
但為了更加的安全,會採用加殼處理
自定義底層保護
dsdump 支援Objective-C和Swift。支持Swift 5+
命令工具,用於檢查Mach-O(Mach object)主要針對 Objective-C classes, categories, and protocols
class-dump-z 可使class-dump-z速度比其前任快近10倍。
Ghidra是由NSA研究部開發的一套軟件逆向工程(SRE)工具
https://github.com/OWASP/owasp-mstg/blob/master/Document/0x06c-Reverse-Engineering-and-Tampering.md
恭喜完賽~
這個系列我要來年再來閱讀,到時候用留言繼續讚美XD
感謝大大,恭喜大大也完賽了
(此回應已被刪除)