由於公司緣由,領導又讓我撿起荒廢了一年多的ios,瞭解對ios應用脫殼以及反編譯hook相關知識.相比於安卓的hook來講(想了解安卓hook的能夠參考個人另一篇文章),ios的hook要麻煩的多,前人栽樹後人乘涼,但願個人這邊文章能給你們對ios的hook有個清晰的認識和思路.html
本文以好久之前上架的一個練手app爲例(app有點爛,將就一下吧,點擊傳送門). app大概是這個樣子 python
點擊生成二維碼,會進入到一個生成二維碼的界面.咱們本次的任務就是篡改點擊事件,實現點擊生成二維碼,彈出一個彈窗.ios
邏輯比較清晰,參考下圖:git
1. 一臺越獄設備(不知道怎麼越獄的本身先行百度,本人試驗機是ipad 11.3.1系統)
2. 安裝要脫殼的應用
複製代碼
如下是主流的目前三種脫殼方式,前兩種貌似在高版本中都會出現問題,若是你的系統在9.0如下,能夠考慮使用,若是是9.0以上,建議使用第三種.github
這個方式主要是利用Clutch工具進行砸殼,能夠參考友軍的文章,我就不重複造輪子了.(注意高版本ios系統可能會出現kill9錯誤,沒法脫殼)api
從github上下載代碼(傳送門),編譯動態庫dumpdecrypted.dylib.利用該動態庫進行脫殼,能夠參考友軍文章,缺點是低版本有效,高版本會出現各類問題.xcode
因爲該項目是個python項目,因此須要python環境.bash
++第一步++,app
手機端
打開cydia 添加源: https://build.frida.re
打開剛剛添加的源 安裝 frida
安裝完成!檢查是否工做能夠可在手機終端運行 frida-ps -U 查看
複製代碼
++第二步:++工具
電腦端下載源碼,千萬注意這個源碼是分3.x和2.x python版本的,必定要根據本身的ptthon環境版本下載相應版本的源碼!!!
++第三步++
編譯源碼(可能會遇到各類安裝第三方庫錯誤,耐心解決近,或者下方私信我).修改dump.py文件,把ip改爲手機端ip
++第四步++:
執行脫殼命令
./dump.py 應用名稱
複製代碼
成功後就會在項目目錄中產生相應的脫殼後的ipa文件,以下圖
第一步: 下載 Class-dump ,獲得Class-dump 運行庫
第二步,解壓咱們剛纔獲得的ipa文件(修改爲.zip解壓便可),獲得QrCode.app文件
第三步:
導出.h文件
執行命令
class-dump -H QrCode.app文件路徑 -o 導出的文件夾路徑
複製代碼
完成後就能看到導出的.h文件了
第一步.
安裝MonkeyDev,如何安裝請參考神器開源項目[傳送門],裏面有詳細文檔
第二步.
安裝成功後您的xcode新建項目時就會出現以下圖工程:
第三步:
選擇MonkeyApp新建工程,將咱們脫殼後的ipa文件放入項目對應文件夾,其餘都不用修改,選擇真機直接運行
第四步:
調試應用,獲得掃描界面的控制器類MainController,我試圖獲取uiveiw的action,但發現他的action是動態寫在代碼中的
咱們搜索咱們上面獲得的頭文件,找到MainController.h文件,代碼以下:
能夠看到有個setListener方法和兩個uiveiw,基本咱們能夠肯定咱們須要的點擊事件就在setListener方法中.下面咱們驗證下.
第四步:
對剛纔咱們獲得的QRCode.app文件顯示包內容,能夠獲得moth-o類型的源碼文件QRCode
下載Hopper工具,將QRCode文件拖進去,就能夠查看響應的oc僞碼,以及彙編代碼.以下圖
搜索MainController,找到setListener方法,查看oc僞碼
發現他跳轉了menuAction方法,咱們雙擊點進去
能夠看到,就是經過在這裏處理跳轉事件,控制程序跳轉到下個控制,也驗證了咱們的猜測是正確的,咱們只須要攔截 setListener方法,當他點擊生成二維碼這個圖片view的時候,讓他彈個窗便可.
回到咱們新建的MonkeyApp工程,新建HookAlert.m文件,編寫hook邏輯,攔截代碼
運行後點擊生成二維碼查看效果:
出現彈窗,攔截成功!
補充說明:
MonkeyApp提供了多種hook的寫法,這裏咱們使用的是CaptainHook的寫法,我簡單介紹下用法(官方居然沒有詳細的api說明!)
一個單獨的hook類,大概包含如下三部分,看一查看我寫的註釋
#import <Foundation/Foundation.h>
#import <CaptainHook/CaptainHook.h>
#import <UIKit/UIKit.h>
CHDeclareClass(MainController) //聲明hook的類
//聲明hook的方法,數字代碼參數個數,第一個參數通常是self,第二個參數表明返回值,第三個參數是類名,第四個是方法名,後面接方法參數以及類型
CHOptimizedMethod1(self, void, MainController, menuAction,id,arg1){
//獲取類變量view的值
UIView* item2= CHIvar(self, _item2_bgview,__strong UIView*) ;
UIView* item=[arg1 view];
if(item2==item){
//攔截 點擊事件
UIAlertView *alert=[UIAlertView new];
[alert setTitle:@"提示"];
[alert setMessage:@"攔截成功"];
[alert show];
NSLog(@"測試成功...%@ : %@",arg1,item2);
}else{
// 其餘邏輯正常執行元源代碼
CHSuper1(MainController, menuAction, arg1);
}
}
// 構造方法,
CHConstructor{
CHLoadLateClass(MainController); //再次聲明hook的類
CHClassHook1(MainController, menuAction); //再次聲明hook的方法
}
複製代碼
至此,咱們的ios從脫殼到分析再到代碼攔截就完成了,網上不少文章都是要麼寫怎麼脫殼,要麼怎麼寫hook,要麼就是寫怎麼分析,不多有一個寫全面流程的文章.但願這邊文章對你們有幫助,喜歡就伸手點個關注吧.