網上關于 iOS 應用砸殼相關的博客,非常多,但都存在一些問題。
- 年代久遠,砸殼的方法早已過時
- 比較新的文檔,不夠完整,不夠詳細,對于一些過程都是一帶而過,缺乏詳細的描述,對小白來說非常不友好。
故,我將最近實踐成功的經驗詳細地記錄下來,希望對小白們有所幫助吧,如果文中有說得不對的地方,也希望大家能指出。
預備知識
教材:主要學習了一下慶哥(劉培慶)的書《iOS應用逆向與安全》,小伙伴們可以去買一本正版紙書,支持一下~
越獄設備
本次學習,選擇的是 iOS 13.3.1 的 iPad mini4, A8 芯片 ARMv8 架構
其中要注意兩點
- checkra1n 屬于不完美越獄,與完美越獄的區別是如果設備重啟了,將會回到未越獄狀態,需要重新越獄。
- 注意越獄成功后,在手機上使用 checkra1n app下載 cydia 時,可以使用 4G 網絡,可以大幅加快下載速度。
frida 砸殼
為什么要砸殼?
這是因為應用上傳至App Store后,蘋果會對應用的代碼部分進行加密,當應用運行時才會動態解密, 在這樣的情況下是無法直接使用后面講到的class-dump和IDA進行分析的。所以,在分析應用之前,要把應用加密的內容解密,然后把應用和解密后的可執行文件導出到計算機中。
這里我不會使用網上經常出現的 dumpdecrypted
、Clutch
,而是使用了 frida
。
1 iOS 端配置
- 在越獄設備上,打開 cydia,添加源
https://build.frida.re
- 打開添加的源,找出
frida
進行安裝,其中會列出 3 個軟件,分別是Frida for 32-bit devices
、Frida for A12+ devices
、Frida for pre-A12 devices
三個,請根據越獄設備的實際 CPU 類型,進行選擇,本文中使用的 iPad mini 4 是 A8 芯片,所以安裝了第三項 - 安裝完成后,可在ssh終端運行
frida-ps -U
查看,是否成功(實測,command not found 應該也不影響后續的使用)
2 MAC 端配置
Anaconda
這個軟件的主要作用是可以配置多種不同的 Python 環境,避免在 MAC 上安裝多個 Python 版本,導致的管理混亂,其他功能可以自己去了解一下。
這里采用 Anaconda 的原因是,在用普通方式(在自己的 mac 下安裝不同版本的 Python,并安裝依賴庫)踩了很多坑,實在趟不過了......
- 搜索并安裝
Anaconda
軟件 - 安裝完成后,建議不使用軟件自帶的 Python,而是自己 create environment,這里配置環境 Python 3.7,并為環境取名 zyy
- 配置完成后,點擊對應 zyy 環境的三角箭頭,打開終端,這個終端就會有你安裝的 Python 版本
安裝 frida-ios-dump
- 克隆慶哥(劉培慶)改造過的倉庫,代碼如下
git clone https://github.com/AloneMonkey/frida-ios-dump
- 使用前面提到的
Anaconda
打開的終端, cd 到前一步下載的目錄 frida-ios-dump - 安裝需要的依賴
sudo pip install -r requirements.txt --upgrade
- 如果在上一步出現 six 導致的問題,請忽略 six 這個庫
sudo pip install six --upgrade --ignore-installed six
- 如果安裝的過程比較慢,可以切換成清華源進行安裝 (如果存在因為這個源而導致某些庫安裝不成功,可以通過修改
requirements.txt
中的依賴庫名單來分批下載,使用原本的源下載不成功的庫)
sudo pip install -r requirements.txt --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
電腦和 iOS 設備的端口映射
- 使用 USB 將設備與電腦相連
- 進行映射,在終端輸入
iproxy 2222 22
(其中 2222 代表電腦端的端口,22 是 iOS 設備的端口號,如果發現電腦端端口號已被占用,可以使用新的端口號進行映射,打開在frida-ios-dump
目錄下的dump.py
,并將 2222 修改為新的端口號,端口號注意不要超過四位數) - 終端顯示
waiting for connection
,看到這兒,抓緊時間看下一步的砸殼喔,否則連接就會超時
砸殼
- 確保 iOS 設備一直保持 USB 連接,并將想要砸殼的應用打開,保證顯示在前臺,否則可能出現找不到應用,導致砸殼失敗
- 使用
Anaconda
的 zyy 環境另開一個新的終端 - cd 到之前下載的 frida-ios-dump 目錄
- 執行
./dump.py 微信
(這里將微信改成你想砸殼的應用名即可) - 如果發現應用名稱重復了怎么辦?終端執行
./dump.py -l
可以查看已安裝的應用名稱和對應的 bundle Id
PID Name Identifier
----- ------------------------- ----------------------------------------
9661 App Store com.apple.AppStore
16977 Moment com.kevinholesh.Moment
1311 Safari com.apple.mobilesafari
16586 信息 com.apple.MobileSMS
4147 微信 com.tencent.xin
10048 相機 com.apple.camera
7567 設置 com.apple.Preferences
- CrashReporter crash-reporter
- Cydia com.saurik.Cydia
- 通訊錄 com.apple.MobileAddressBook
- 郵件 com.apple.mobilemail
- 音樂 com.apple.Music
- 執行如下命令,對指定的 bundle id 應用進行砸殼,
./dump.py -b com.tencent.xin
- 砸殼成功,可以在
frida-ios-dump
目錄下找到 xxx.ipa
如何判斷 ipa 是否有殼
- 將 ipa 文件后綴改為 zip 進行解壓
- 找到 xx.app 包內容下的 xx 二進制可執行文件(abc 是我隨便取的)
- 在終端執行
otool -l xx | grep crypt
- 找到
cryptid
這一行,有殼為 1,已脫殼為 0
如果能成功走到這一步,恭喜,砸殼成功啦。