目前針對iOS14,checkra1n能做到最簡潔的一鍵不完美越獄。
ios手機端配置
- 手機端cydia 添加源:
https://build.frida.re
- 搜索Frida,進行安裝
- 安裝成功驗證
iPhone:~ root# ps -ax | grep frida
409 ?? 0:00.89 /usr/sbin/frida-server
2050 ttys000 0:00.01 grep frida
ps -ax | grep frida 為執行命令,看到如上打印即可
Mac端
我們需要安裝python ,pip ,frida ,frida-tools。由于Mac自帶的Python版本為2.7.x.不建議使用了,因此安裝了Python3.7.7版本。如下:
- brew install wget //安裝wget
- wget https://bootstrap.pypa.io/get-pip.py
- sudo python3 get-pip.py
- sudo pip3 install frida //安裝frida
- sudo pip3 install frida-tools //安裝frida
配置frida-ios-dump環境
- 從github下載代碼命令: sudo mkdir /opt/dump && cd /opt/dump && sudo git clone https://github.com/AloneMonkey/frida-ios-dump
- 根據插件文檔equirements.txt安裝依賴 :sudo pip3 install -r /opt/dump/frida-ios-dump/requirements.txt --upgrade
- dump.py 中默認參數第35行的User,Password,Host,Port可按需進行修改
連接iPhone設備
brew安裝usbmuxd,usbmuxd自帶工具iproxy,iproxy可以快捷連接iPhone操作
iproxy 2222 22 //執行如下命令把當前連接設備的22端口(SSH端口)映射到電腦的2222端口,那么想和設備22端口通信,直接和本地的2222端口通信就可以
Cydia 安裝 openSSH,另開終端進程
ssh -p 2222 root@127.0.0.1
砸殼
python3 dump.py -l //查看所有app獲取對應bundleID
python3 dump.py bundleID //執行完成在當前目錄生成ipa
otool -l XXX | grep crypt //查看是否脫殼,該信息在LC_ENCRYPTION_INFO_64 Segment中
class-dump
- 下載對應版本:http://stevenygard.com/projects/class-dump/
-
open /usr/local/bin
打開終端,將class-dump文件復制到/usr/local/bin - 更改權限
sudo chmod 777 /usr/local/bin/class-dump
- 使用:
class-dump -H app文件路徑 -o 頭文件保存路徑
- 只能針對純OC,對于Swift 混編代碼則會提示:
Error: Cannot find offset for address XXX in stringAtAddress:
Reveal
- Cydia安裝Reveal2Loader
- 在設置中允許需要調試的App
- Mac端安裝Reveal
- 在Help-Show Reveal Library in Finder中找到對應版本的RevealServer,復制到設備中:
scp -r /Users/XXX/RevealServer.xcframework/ios-arm64_i386_x86_64-simulator/RevealServer.framework root@127.0.0.1:/Library/Frameworks
或者通過其他助手復制到Library/Frameworks中都是可以的
動態調試
手機端App通過debugserver與Mac端的LLDB經過USB進行數據傳輸
這里有兩種方式:一種是用Xcode來進行調試,因為Xcode只能調試開發者自己證書的應用,所以需要重簽名App;另一種是命令行調用lldb來調試,需要對 debugserver 賦予更高的權限,因為默認的 debugserver 也只能調試自己證書的App
通過Xcode:
- 打開 Xcode ,新建一個 demo, 并插上真機,完成 demo 在真機的調試
-
ls ~/Library/MobileDevice/Provisioning\ Profiles
找到demo的描述文件 - 下載重簽名軟件 iReSign
- 重簽名,分別填入砸殼后的ipa,demo的描述文件,demo的BundleID,勾選修改ID,對應的證書
- 原路徑下生成重簽包,如果包含appex,需要針對每一個ID進行修改;或者暴力一點直接刪除 Plugins 文件夾和 Watch文件夾
- 把重簽名的App安裝到手機上并運行
- Xcode - Debug - Attach to Process by PID or Name 輸入進程ID或者名稱即可進入調試
通過debugserver + lldb:
使用iproxy將接設備的端口(SSH)映射到電腦端口
iproxy 2222 22
SSH到USB設備
ssh -p 2222 root@127.0.0.1
將設備的debugserver拷貝到電腦端
scp -P2222 root@127.0.0.1:/Developer/usr/bin/debugserver ~/Desktop
安裝ldid
brew install ldid
-
拷貝如下代碼,保存成ent.xml,放到同一級目錄下,該xml實際上就是給debugserver添加了task_for_pid權限
<plist version="1.0"> <dict> <key>com.apple.springboard.debugapplications</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> <key>run-unsigned-code</key> <true/> </dict> </plist>
執行
ldid -Sent.xml debugserver
進行簽名將增加權限的debugserver拷貝回設備
scp -P2222 ~/debugserver root@127.0.0.1:/usr/bin/debugserver
ps -ef
查看當前的進程列表執行
debugserver *:1234 -a prossesname/pid
將debugserver附加到進程,并開啟1234端口,等待來自IP的LLDB接入在Mac系統執行
iproxy 1234 1234
將本地端口映射到手機端口在Mac系統啟動lldb然后執行
process connect connect://localhost:1234
image list -o -f
找到對應進程的基地址,再配合靜態分析獲取到的偏移地址就可以動態調試了如遇到error: rejecting incoming connection from ::ffff:127.0.0.1 (expecting ::1)報錯,則可將第9步改為debugserver 127.0.0.1:1234 XXX
如遇到error: failed to get reply to handshake packet 報錯,則可將第9步把debugserver啟動試設置的監聽 *:1234 改成 localhost:1234
另附上 設備文件結構
-
./Applications
:存放系統默認預裝的應用,不包括從App Store下載安裝的應用 -
./Developer
:存放與開發調試相關的文件和工具二進制文件,當設備連接Xcode時選擇了“Use for Development”才會被創建 -
./Library
:存放系統應用數據、幫助文件、文檔等-
./Library/Keychains
:設備系統級密碼等存放目錄 -
./Library/Logs
:系統日志存放目錄,./var/logs
也指向此目錄 -
./Library/Logs/CrashReporter
:系統進程崩潰日志目錄
-
-
./System
:只包含一個名為Library的目錄,這個子目錄中存放了系統的絕大部分組件,如各種framework,內核模塊,字體文件等-
./System/Library/LaunchDaemon
:系統啟動進程plist文件存放目錄,若想不啟動某進程,刪除該目錄下對應的plist的文件(操作需慎重,刪除之前先備份) -
./System/Library/Frameworks
:公有框架(開發者可使用)存放目錄 -
./System/Library/PrivateFrameworks
:私有框架(開發者不可使用)存放目錄 -
./System/Library/CoreServices/SpringBoard.app
:桌面管理器應用,用戶與系統交互的中介
-
-
./User
:用戶目錄,存放用戶的個人資料和配置,iOS中實際指向/var/mobile -
./bin
:“binary”的簡稱,存放傳統Unix命令(用戶級基礎功能二進制文件) -
./boot
:存放能使系統成功啟動的所有文件,iOS中此目錄為空 -
./cores
:內核轉儲文件存放目錄,當一個進程崩潰時,如果系統允許則會產生轉儲文件 -
./dev
:“device”的簡稱,存放BSD設備文件。每個文件代表系統的一個塊設備或字符設備 -
./etc
:“Et Cetera”的簡稱,存放系統腳本及配置文件,如passwd、hosts等。iOS/OS X中/etc實際指向./private/etc
-
./lib
:存放系統庫文件、內核模塊及設備驅動等,iOS中此目錄為空 -
./mnt
:“mount”的簡稱,存放臨時文件系統掛載點,iOS中此目錄為空 -
./private
:存放/etc、/var,/sustem_data,/xarts四個鏈接目錄的目標目錄 -
./sbin
:“system binaries”的簡稱,存放Unix管理類命令(系統級基礎功能的二進制文件),如netstat、reboot、fdisk、ifconfig等 -
./tmp
:存放臨時文件目錄,其權限為所有人任意讀寫,在OS X中實際指向./private/tmp
-
./usr
:存放大量工具和程序,第三方程序安裝目錄,其中./usr/lib
中存放了動態鏈接庫 -
./var
:“variable”的簡寫,存放一些經常更改的文件,如日志、用戶數據、臨時文件等,iOS/OS X中./var
實際指向./private/var
。某些文件在./Library
和./var
都存在,比如Keychains數據、系統日志等-
./var/wireless/Library/CallHistory
:存放通話記錄,網絡流量,使用時間等記錄 -
./var/mobile/Containers
:存放App Store應用相關文件,其中,子目錄/Bundle
存放應用可執行文件,子目錄/Data
存放應用數據 -
./var/mobile/Library/AddressBook
:存放聯系人數據 -
./var/mobile/Library/Calendar
:存放日歷及提醒事項記錄文件 -
./var/mobile/Library/SMS
:存放短信 -
./var/mobile/Library/Safari
:存放Safari保存的書簽等 -
./var/mobile/Media/PhotoStreamsData
:存放照片流
-