iOS 逆向工程初體驗

ZhgChgLi
ZRealm Dev.
Published in
12 min readMar 28, 2020

--

從越獄、提取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 上的環境:

  1. Mac 本身自帶 Python 2.7 版本,此工具支援 Python 2.X/3.X,所以不用在特別安裝 Python;但我是使用 Python 3.X 進行操作的,如果有遇到 Python 2.X 的問題,不妨嘗試安裝使用 Python 3 吧!
  2. 安裝 pip( Python 的套件源管理器)
  3. 使用 pip 安裝 frida
    sudo pip install frida -upgrade -ignore-installed six (python 2.X)
    sudo pip3 install frida -upgrade -ignore-installed six (python 3.X)
  4. 在 Terminal 輸入 frida-ps 如果沒錯誤訊息代表安裝成功!
  5. Clone AloneMonkey/frida-ios-dump 這個專案
  6. 進入專案,用文字編輯器打開 dump.py 檔案
  7. 確認 SSH 連線設定部分是否正確 (預設不用特別動)
    User = ‘root’
    Password = ‘alpine’
    Host = ‘localhost’
    Port = 2222

越獄手機上的環境:

  1. 安裝 Open SSH :Cydia → 搜尋 → Open SSH →安裝
  2. 安裝 Frida 源:Cydia → 來源 → 右上角「編輯」 → 左上角「加入」 → https://build.frida.re
  3. 安裝 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. 最後也是最困難的 — 進行反編譯

可以使用 IDAHopper 反編譯工具進行分析使用,兩款都是收費工具, Hopper 可免費試用(每次 30 分鐘)

我們將取得的 APP名稱.app 檔案直接拉到 Hopper 即可開始進行分析。

不過我也就止步於此了,因為從這開始就要研究機器碼、搭配 class-dump 結果推測方法…等等;需要非常深入的功力才行!

突破反編譯後,可以自行竄改運作重新打包成新的 APP。

圖片取自航海王

逆向工程的其他工具

1.使用 MITM Proxy 免費工具嗅探 API 網路請求資訊

>>APP有用HTTPS傳輸,但資料還是被偷了。

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:

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): 結束

詳細操作可參考此篇文章

3. Lookin / Reveal 查看 UI 排版工具

前面介紹過,再推一次;在自己的專案日常開發上也非常好用,建議購買使用 Reveal。

4. MonkeyDev 集成工具,可透過動態注入竄改 APP 並重新打包成新的 APP

5.ptoomey3/Keychain-Dumper,導出 KeyChain 內容

詳細操作請參考此篇文章,不過我沒試成功,看專案 issue 貌似也是在 iOS ≥ 12 之後就失效了。

總結

這個領域是個超級大坑,需要非常多的技術知識基礎才有可能精通;本篇文章只是粗淺了「體驗」了一下逆向工程是什麼感覺,如有不足敬請見諒!僅供學術研究,勿做壞壞的事;個人覺得整個流程工具玩下來蠻有趣的,也對 APP 安全更有點概念!

有任何問題及指教歡迎與我聯絡

--

--

ZhgChgLi
ZRealm Dev.

探索世界、求知若渴、教學相長;更愛電影、美劇、西音、運動、生活. www.zhgchg.li