swift相比OC來說,難度要大一些,其方法調用類似于C++,反彙編出來都是sub_xxx之類的調用,但是swift工程的底層還是Cocoa,而iOS系統的Cocoa層目前還是OC開發的,并且大部分swift App也都是混編的工程,雖然難度比起OC工程來說,會稍微大一點,并且資料也不多,但是隻要牢牢掌握swift對象的記憶體模型,以及方法調用的參數傳遞,就不會是什麼難事。
1.砸殼,并建立MonkeyDev工程
下面我們找一個swift App來練練手,已知豐巢App是swift開發的,那我們就以該App來做實驗吧:
1.首先就是frida砸殼,建立MonkeyDev工程,添加Lookin的pod依賴。具體步驟就不再描述了,這些都是非常基礎的操作。在豐巢App的包裡面,我們可以看到它用到了如下第三方庫:

由于swift工程的pod檔案必須使用 use_framework!, 是以第三方庫都将編譯成動态庫,打包到App中就是上圖這樣。
2.打開.xcworkspace工程,運作即可。App正常運作,說明沒有反調試。那我們再抓包看看,打開charles,下拉重新整理一下首頁。抓包結果如圖:
從抓包結果上看,接口都是明文的,這實在沒啥好分析的。如圖,在請求的Http header中有一個 REQUEST_ID參數,通過charles對接口下斷點,修改一下REQUEST_ID,正常傳回response,說明背景并未對該ID做校驗,我猜測它就是某些請求字段組合得到的一個字元串的md5值,既然背景沒有對其做檢驗,那就不管了。
2.分析注冊功能
現在我們來看看注冊功能:在輸入驗證碼界面,我們随便輸入一個錯誤的驗證碼,截圖如下:
通過截圖我們發現,當輸入錯誤驗證碼時,App會彈框提示,通過Lookin,我們知道這個彈框toast的類名是 ToastView, 現在我們打開IDA,搜尋ToastView,我們得到ToastView的真實符号名是_TtC19HiveConsumerRelease9ToastView,如圖:
然後對該類下斷點,并列印堆棧。堆棧截圖如下:
由于App使用的是Http + JSON 請求,是以必定會進行Json解析,于是給NSJSONSerialization下個斷點,然後繼續輸入一個錯誤的驗證碼看看效果,果然斷下來了,列印堆棧看看,如圖:
和抓包看到的傳回資料一緻:
2.1 請求調用棧分析
我們發現,上面看到的調用棧隻有資料傳回後的調用棧,而沒有請求時的調用棧。下面我們分析一下請求調用棧,首先我們在Lookin上看看驗證碼的輸入框的視圖層次,我們知道它是一個textfield, 在看看它的響應事件,如圖:
打開IDA,找到[LoginViewCodeViewController textDidEnd:]的僞代碼,如圖:
隻有一個 sub_xxx(),直接輕按兩下它就好了,點進去可以看到一些邏輯判斷,粗略看看即可。看到有sub_xxx()繼續輕按兩下,粗略了解即可。知道找到一個Alamofire的方法:_s9Alamofire14SessionManagerC7request_6method10parameters8encoding7headersAA11DataRequestCAA14URLConvertible_p_AA10HTTPMethodOSDySSypGSgAA17ParameterEncoding_pSDyS2SGSgtF,直接對其下符号斷點,發現不行,那隻能對函數位址下斷咯,在IDA中,打開該函數的僞代碼界面,按tab鍵盤切換到彙編界面,得到函數的基位址為0x0000000100B484CC, 然後下斷,效果如下:
然後運作,繼續輸入一個錯誤的驗證碼,被斷下來了,列印堆棧看看,如圖:
倒影cc
這就是請求時的堆棧,由于該App沒啥分析的意義,這裡就不做繼續了