iOS 逆向工程初體驗
從越獄、提取iPA檔敲殼到UI分析注入及反編譯的探索過程
關於安全
之前唯一做過跟安全有關的就只有 << 使用中間人攻擊嗅探傳輸資料 >> ;另外也接續這篇,假設我們在資料傳輸前編碼加密、接受時 APP 內解密,用以防止中間人嗅探;那還有可能被偷走資料嗎?
答案是肯定的!,就算沒真的試驗過;世界上沒有破不了的系統,只有時間成本的問題,當破解耗費的時間精力大於破解成果,那就可以稱為是安全的!
How?
都做到這樣了,那還能怎麼破?就是本篇想記錄的議題 — 「逆向工程 」 ,敲開你的 APP 研究你是怎麼做加解密的;其實一直以來對這個領域都是懵懵懂懂,只在 iPlayground 2019 上聽過兩堂大大的分享,大概知道原理還有怎麼實現,最近剛好有機會玩了一下跟大家分享!
逆了向,能幹嘛?
- 查看 APP UI 排版方式、結構
- 獲取 APP 資源目錄 .assets/.plist/icon…
- 竄改 APP 功能重新打包 (EX: 去廣告)
- 反編譯推測原始程式碼內容取得商業邏輯資訊
- dump 出 .h 標頭檔 / keycahin 內容
實現環境
macOS 版本: 10.15.3 Catalina iOS 版本: iPhone 6 (iOS 12.4.4 / 已越獄) *必要 Cydia: Open SSH
越獄的部分
任何版本的 iOS、iPhone 都可以,只要是能越獄的設備,建議使用舊的手機或是開發機,以避免不必要的風險;可根據自己的手機、iOS 版本參考 瘋先生越獄教學 ,必要時需要將 iOS 降版 ( 認證狀態查詢 )再越獄。
我是拿之前的舊手機 iPhone 6 來測試,原本已經升到 iOS 12.4.5 了,但發現 12.4.5 一直越獄不成功,所幸先降回 12.4.4 然後使用 checkra1n 越獄就成功了!
步驟不多,也不難;只是需要時間等待!
附上一個自己犯蠢的經驗: 下載完舊版 IPSW 檔案後,手機接上 Mac ,直接使用 Finder 檔案瀏覽器(macOS 10.5 後就沒有 iTunes 了),在左方 Locations 選擇手機,出現手機資訊畫面後, 「Option」按著然後再點「Restore iPhone」 就能跳出 IPSW 檔案選擇視窗,選擇剛下載下來的舊版 IPSW 檔案就能完成刷機降版。
我本來傻傻的直接按 Restore iPhone…只會浪費時間重刷一次最新版而已….
使用 lookin 工具查看別人的 APP UI 排版
我們先來點有趣的前菜,使用工具搭配越獄手機查看別人APP 是怎麼排版。
查看工具: 一是 老牌 Reveal (功能更完整,需付費約 $60 美金/可試用),二是騰訊 QMUI Team 製作的 lookin 免費開源工具;這邊使用 lookin 作為示範,Reveal 大同小異。
若沒有越獄手機也沒關係,此工具主要是讓你用在開發中的專案上,查看 Debug 排版(取代 Xcode 陽春的 inspector) 平常開發也能用到 !
唯有要看別人的 APP 需要使用越獄手機。
如果要看自己的專案…
可以選擇使用 CocoaPods 安裝、 斷點插入 (僅支援模擬器)、 手動導入Framework 到專案 、 手動設置 ,四種方法。
將專案 Build + Run 起來之後,就能 在 Lookin 工具上選擇 APP 畫面 -> 查看排版結構 。
如果要看別人的APP…
Step 1. 在越獄手機上打開「 Cydia 」-> 搜尋「 LookinLoader 」->「 安裝 」-> 回到手機「 設定 」->「 Lookin 」->「 Enabled Applications 」-> 啟用想要查看的 APP 。
Step 2. 使用傳輸線 將手機連接至 Mac 電腦 -> 打開想要查看的APP -> 回到電腦, 在 Lookin 工具上選擇 APP 畫面 -> 即可 查看排版結構 。
Lookin 查看排版結構
Facebook 登入畫面排版結構
可在左側欄檢視 View Hierarchy、右側欄對選中的物件進行動態修改。
原本的「建立新帳號」被我改成「哈哈哈」
對物件的修改也會實時的顯示在手機 APP 上,如上圖。
就如同網頁的「F12」開發者工具,所有的修改僅對 View 有效,不會影響實際的資料;主要是拿來 Debug ,當然也可以用來改值、截圖,然後騙朋友 XD
使用 Reveal 工具查看 APP UI 排版結構
雖然 Reveal 需要付費才能使用,但個人還是比較喜歡 Reveal;在結構顯示上資訊更詳細、右方資訊欄位幾乎等同於 XCode 開發環境,想做什麼即時調整都可以,另外也會提示 Constraint Error 對於 UI 排版修正非常有幫助!
這兩個工具在日常開發自己的 APP 上都非常有幫助!
了解完流程環境及有趣的部分之後,就讓我們進入正題吧!
*以下開始都需要越獄手機配合
提取 APP .ipa 檔案 & 砸殼
所有從 App Store 安裝的 APP,其中的 .ipa 檔案都有 FairPlay DRM 保護 ,俗稱加殼保護/相反的去掉保護就叫「砸殼」,所以單純從 App Stroe 提取 .ipa 是沒有意義的,也用不了。
*另一個工具 APP Configurator 2 只能提取有保護的檔案,沒意義就不再贅述,有興趣使用此工具的朋友可以 點此 查看教學。
使用工具+越獄手機提取砸殼之後的原始 .ipa 檔案:
關於工具部分起初我使用的是 Clutch ,但怎麼嘗試都出現 FAILED 查了下專案 issue,發現有很多人有同樣狀況,貌似此工具已經不能在 iOS ≥ 12 使用了、另外還有一個老牌工具 dumpdecrypted ,但我沒有研究。
這邊使用 frida-ios-dump 這個 Python 工具進行動態砸殼,使用起來非常方便!
首先我們先準備 Mac 上的環境:
- Mac 本身自帶 Python 2.7 版本,此工具支援 Python 2.X/3.X,所以不用在特別安裝 Python;但我是使用 Python 3.X 進行操作的,如果有遇到 Python 2.X 的問題,不妨嘗試 安裝使用 Python 3 吧!
- 安裝 pip ( Python 的套件源管理器)
- 使用 pip 安裝 frida :
sudo pip install frida -upgrade -ignore-installed six
(python 2.X)sudo pip3 install frida -upgrade -ignore-installed six
(python 3.X) - 在 Terminal 輸入
frida-ps
如果沒錯誤訊息代表安裝成功! - Clone AloneMonkey/frida-ios-dump 這個專案
- 進入專案,用文字編輯器打開 dump.py 檔案
- 確認 SSH 連線設定部分是否正確 (預設不用特別動) User = ‘root’ Password = ‘alpine’ Host = ‘localhost’ Port = 2222
越獄手機上的環境:
- 安裝 Open SSH :Cydia → 搜尋 → Open SSH →安裝
- 安裝 Frida 源:Cydia → 來源 → 右上角「編輯」 → 左上角「加入」 → https://build.frida.re
- 安裝 Frida:Cydia → 搜尋 → Frida → 依照手機處理器版本安裝對應的工具(EX: 我是 iPhone 6 A11,所以是裝
Frida for pre-A12 devices
這個工具)
環境都弄好之後,開工:
1.將手機使用 USB 連接到電腦
2.在 Mac 上打開一個 Terminal 輸入 iproxy 2222 22
,啟動 Server。
3.確保手機/電腦處於相同網路環境中(EX: 連同個WiFi)
4.再打開一個 Terminal 輸入 ssh root@127.0.0.1,輸入 SSH 密碼(預設是 alpine
)
5.再打開一個 Terminal 進行敲殼命令操作,cd 到 clone 下來的 /frida-ios-dump 目錄下。
輸入 dump.py -l
列出手機中已安裝/正在執行的 APP。
6. 找到要敲殼導出的 APP 名稱 / Bundle ID,輸入:
dump.py APP名稱或BundleID -o 輸出結果的路徑/輸出檔名.ipa
這邊務必指定 輸出結果的路徑/檔名 ,因為預設輸出路徑會在 /opt/dump/frida-ios-dump/
這邊不想把它搬到 /opt/dump
中,所以要指定輸出路徑避免權限錯誤。
7. 輸出成功後就能取得已敲殼的 .ipa 檔案!
- 手機必須在解鎖情況下才能使用工具
- 若出現連線錯誤、reset by peer…等原因,可嘗試拔掉重插 USB 連接、重開 iproxy。
7.將 .ipa 檔直接重新命名成 .zip 檔,然後直接右鍵解壓縮檔
會出現 /Payload/APP名稱.app
有了原始 APP 檔後我們可以…
1. 提取 APP 的資源目錄
在 APP名稱.app 右鍵 → 「Show Package Contents」就能看到 APP 的資源目錄
2. class-dump 出 APP .h頭文件訊息
使用 class-dump 工具導出全 APP (包含 Framework) .h 頭文件訊息 (僅限 Objective-C,若專案為 Swift 則無效)
nygard/class-dump 大大的工具我嘗試失敗,一直 failed;最後還是一樣使用 AloneMonkey / MonkeyDev 大大的工具集中改寫過的 class-dump 工具才成功。
- 直接從這裡 Download MonkeyDev/bin/class-dump 工具
- 打開 Terminal 直接使用:
./class-dump -H APP路徑/APP名稱.app -o 匯出的目標路徑
dump 成功之後就能獲取到整個 APP 的 .h 資訊。
4. 最後也是最困難的 — 進行反編譯
可以使用 IDA 和 Hopper 反編譯工具進行分析使用,兩款都是收費工具, Hopper 可免費試用(每次 30 分鐘)
我們將取得的 APP名稱.app 檔案直接拉到 Hopper 即可開始進行分析。
不過我也就止步於此了,因為從這開始就要研究機器碼、搭配 class-dump 結果推測方法…等等;需要非常深入的功力才行!
突破反編譯後,可以自行竄改運作重新打包成新的 APP。
圖片取自航海王
逆向工程的其他工具
1. 使用 MITM Proxy 免費工具嗅探 API 網路請求資訊
2.Cycript (搭配越獄手機) 動態分析/注入工具:
- 在越獄手機上打開「Cydia」-> 搜尋「Cycript」->「安裝」
- 在電腦打開一個 Terminal 使用 Open SSH 連線至手機,
ssh root@手機IP
(預設是alpine
) - 打開目標 APP (APP 保持在前景)
- 在 Terminal 輸入
ps -e | grep APP Bundle ID
查找正在運行的 APP Process ID - 使用
cycript -p Process ID
注入工具到正在運行的 APP
可使用 Objective-c/Javascript 進行調試控制。
For Example:
1
2
cy# alert = [[UIAlertView alloc] initWithTitle:@"HIHI" message:@"ZhgChg.li" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nl]
cy# [alert show]
注入一個 UIAlertViewController…
- chose( ) : 獲取目標
- UIApp.keyWindow.recursiveDescription( ) .toString( ) : 顯示 view hierarchy 結構資訊
- new Instance(記憶體位置): 獲取物件
- exit(0) : 結束
詳細操作可參考 此篇文章 。
前面介紹過,再推一次;在自己的專案日常開發上也非常好用,建議購買使用 Reveal。
4. MonkeyDev 集成工具 ,可透過動態注入竄改 APP 並重新打包成新的 APP
5. ptoomey3 / Keychain-Dumper ,導出 KeyChain 內容
詳細操作請參考 此篇文章 ,不過我沒試成功,看專案 issue 貌似也是在 iOS ≥ 12 之後就失效了。
總結
這個領域是個超級大坑,需要非常多的技術知識基礎才有可能精通;本篇文章只是粗淺了「體驗」了一下逆向工程是什麼感覺,如有不足敬請見諒! 僅供學術研究,勿做壞壞的事 ;個人覺得整個流程工具玩下來蠻有趣的,也對 APP 安全更有點概念!
有任何問題及指教歡迎 與我聯絡 。
===
View the English version of this article here.
本文首次發表於 Medium ➡️ 前往查看