要學習iOS逆向工程,你至少要先準備好下面這兩樣東西:
- 一臺運行mac OS Mojave的電腦以及Xcode 10,盡管在錄制視頻視頻的時候它們還處在beta版,之所以選擇它們,是為了確保在今后較長的一段時間里,我們演示的Demo可以在你的電腦上執(zhí)行;
- 一臺已經(jīng)越獄的iOS設備;
想辦法找到一臺已經(jīng)越獄的設備并不是什么難事,這里推薦大家找一臺運行iOS 8或者9的iPhone 5s,主要有以下幾個原因:
- 首先,這是第一代64位處理器的iPhone設備;
- 其次,相比iOS 10,iOS 8和9都可以完美越獄,所謂完美越獄,簡單來說就是重啟后不會丟失越獄狀態(tài);
- 最后,當然就是便宜啦,現(xiàn)在,400元上下就可以買到一臺用于學習的設備了;
總之,繼續(xù)之前,讓自己有一臺越獄的設備就好了,由于這不是什么技術問題,因此我們也就不多說了。
拿到越獄的設備之后,我們第一個要做的事情,就是可以方便的連接到它。因為之后很多操作都需要我們直接在iOS的Shell中完成。
安裝Open SSH
越獄之后,iOS會出現(xiàn)一個叫做Cydia的app。我們可以把它理解為是越獄版的App Store。打開它,看上去是這樣的:

為了能通過SSH連接到越獄的iOS設備,我們切換到Search標簽,搜索一下OpenSSH,從搜索結果中點進去,如果你之前沒裝過,點擊右上角的Install直接進行安裝就好了。

完成后,越獄的iOS設備上就會開啟SSH服務,我們就可以像登錄Linux服務器一樣進行登錄了。
iOS 10以上的越獄設備不要安裝Open SSH
這里要多說一句,如果你越獄的設備是iOS 10,就不要安裝Open SSH了,因為裝了反而會讓你無法遠程登錄。在iOS 10的越獄系統(tǒng)里,已經(jīng)內置了一個叫做Dropbear的輕量級SSH服務,我們用它就可以登錄了。
通過Wifi登錄到設備
接下來,最簡單的登錄方法,就是讓iOS和Mac設備在同一個局域網(wǎng)里,在iOS的網(wǎng)絡設置里查看一下當前的IP地址。例如下圖中,我們的IP地址是:192.168.2.100:

這時,在Mac上打開終端,輸入ssh root@192.168.2.100,稍微等一會兒,就會提示你要輸入iOS設備的root的密碼。越獄設備默認的密碼是alpine。輸入之后,就可以以root身份,順利登錄到iOS了。這時,我們的終端提示符應該是類似這樣的:
iPhone:~ root#
修改密碼
登錄進來的第一件事,就是修改root密碼,否則,指不定哪個和你同一個網(wǎng)絡上的小伙伴,就會登錄到你的設備上來看看。即便是從情感上說,你可能也并不想這樣,對不?修改密碼很簡單,我們在iOS的Shell中執(zhí)行passwd:
iPhone:~ root# passwd
Changing password for root.
New password:
Retype new password:
只要重新輸入兩次新密碼,密碼就改好了。這時千萬別忘了妥善把密碼保存起來,一旦你忘記了,設備也就無法登錄了。
使用證書自動登錄
接下來,我們要改進一下這個登錄過程。使用密碼登錄有很多不方便的地方,一來每次要輸密碼很麻煩,二來,一些調試和打包環(huán)境里,輸入密碼的操作會打斷自動化流程。為此,我們可以使用證書登錄。
首先,在Mac終端上執(zhí)行一下ls -al ~/.ssh,確保目錄下有id_rsa和id_rsa.pub這兩個文件,其中,.pub是你的公鑰,不帶擴展名的是對應的私鑰。
如果,.ssh目錄或者證書文件不存在,表示你的本地還沒有證書。這也沒關系,在Mac終端上執(zhí)行下面的命令自己創(chuàng)建一對就好了:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
接下來一路回車到結束就好。完成后,我們的$HOME目錄中就存在一對證書了。
其次,仍舊在Mac的終端里,執(zhí)行下面的命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.2.100
這時,終端會提示我們輸入iOS設備的root密碼,輸入后,這條命令就會把我們本地的公鑰添加到iOS設備的信任主機列表。
現(xiàn)在,我們只要在Mac終端執(zhí)行:
ssh -i ~/.ssh/id_rsa root@192.168.2.100
就可以不用密碼直接登錄到iOS設備了。
最后,我們可以看下之前的ssh-copy-id究竟做了什么。在iOS終端里,我們可以執(zhí)行:
cat ~/.ssh/authorized_keys
在這個文件里,就會有一條記錄,它的內容,應該和我們之前在Mac上創(chuàng)建的~/.ssh/id_rsa.pub,也就是我們的公鑰,是一樣的。當然,我們也可以手工編輯這個文件的內容實現(xiàn)免密登錄,結果是一樣的。
添加SSH配置
但事情至此并沒有結束,我們還有進一步優(yōu)化的余地。畢竟,每次還得輸入IP地址,還得指定-i參數(shù),還是很麻煩。為此,我們可以在Mac中執(zhí)行下面的命令:
vi ~/.ssh/config
在這個文件里,我們添加下面的內容:
Host iphone5s
Hostname 192.168.2.100
User root
完成后,保存退出,這樣,我們就可以在Mac終端執(zhí)行ssh iphone5s直接登錄了。
通過USB登錄到設備
但通過WiFi連接有個缺點,就是延遲有點高。當你SSH到iOS之后,用一陣子就會發(fā)現(xiàn)終端有點兒“粘手”。這個問題在我們上傳文件,或者遠程調試的時候,就非常不爽了。為了改善這個問題,我們可以通過USB連接。
為此,我們需要在Mac上安裝一個工具包,在終端里執(zhí)行下面的命令就好了:
brew install libimobiledevice
完成后,我們把越獄的iOS設備通過USB連接到Mac上,繼續(xù)在Mac的終端里執(zhí)行:
iproxy 2333 22
這樣,就會把iOS上的22端口映射到Mac的2333端口,并且,終端會卡在這個命令上:

然后我們新打開一個Tab,執(zhí)行:
ssh root@localhost -p 2333
就可以登錄到iOS設備了,相比WiFi,這個shell就會非?!案帧薄M扑]大家在工作的時候,使用USB的方式連接。
當了,為了方便連接,我們也可以把USB的連接方式也寫到之前創(chuàng)建的~/.ssh/config里:
Host 5s
Hostname localhost
User root
Port 2333
這樣,我們就可以在WiFi的時候,通過ssh iphone5s連接;在USB的時候,通過ssh 5s進行連接了。