首頁>技術>

如果在我們的專案中hook了Method Swizzle,那麼別人還能hook我們的專案嗎??

一、寫上基本的防護,內部使用hook,外部沒有hook

1、新建工程:基本防護,寫個簡單的頁面

程式碼如下:

2、需求:在外部hook btnClick2,在內部hook btnClick1,需要保證的是在外部hook btnClick2無效,在內部hook btnClick1生效。

3、拖入fishhook程式碼,新建hookMgr類
//專門HOOK+(void)load{    //內部用到的交換程式碼    Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick1:));    Method new = class_getInstanceMethod(self, @selector(click1Hook:));    method_exchangeImplementations(old, new);    //在交換程式碼之前,把所有的runtime程式碼寫完     //基本防護    struct rebinding bd;    bd.name = "method_exchangeImplementations";    bd.replacement=myExchang;    bd.replaced=(void *)&exchangeP;    struct rebinding rebindings[]={bd};    rebind_symbols(rebindings, 1);}//保留原來的交換函式void (* exchangeP)(Method _Nonnull m1, Method _Nonnull m2);//新的函式void myExchang(Method _Nonnull m1, Method _Nonnull m2){    NSLog(@"檢測到了hook");}-(void)click1Hook:(id)sender{    NSLog(@"原來APP的hook保留");}

說明: * 在做防護之前,先把自己內部需要runtime交換的程式碼寫完,比如開放btnClick1給自己內部去hook,其他的hook則禁止 * 使用fishhook hook method_exchangeImplementations方法,這樣當外部使用method_exchangeImplementations方法時,讓它失效

4、執行,分別點選按鈕1和按鈕2,此時內部hook了btnClick1方法,外部暫時沒有hook任何方法二、準備ipa1. 打包ipa將基本防護.app複製出來
zip -ry Hook.ipa Payload
三、外部hook,注入程式碼1.新建工程:Hook基本防護

程式碼注入參考: iOS逆向之程式碼注入(framework)

前面在hookMgr中已經做了防護,不能交換btnClick2方法,那麼我們寫下hook btnClick2的程式碼來測試一下:

+(void)load{    Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick2:));    Method new = class_getInstanceMethod(self, @selector(click2Hook:));    method_exchangeImplementations(old, new);}-(void)click2Hook:(id)sender{    NSLog(@"btnClick2交換成功");}

執行,分別點選按鈕1,按鈕2,發現btnClick2交換成功,防護失敗了

2.思考防護失敗的原因1.在基本防護工程裡,hookMgr的load方法里加上 NSLog(@"hookMgr--Load");2.在ViewController的load方法里加上NSLog (@"ViewController--Load");3.在AppDelegate的load方法里加上
+(void)load{    NSLog(@"AppDelegate--Load");}
4.編譯基本防護工程重新執行,生成基本防護.app,重新打包

zip -ry Hook.ipa Payload

5.將Hook.ipa複製到Hook基本防護工程的APP資料夾裡,開啟Hook基本防護工程,在WJHook的load方法里加上, NSLog(@"WJHook---load"); 然後執行

發現WJHook(攻擊方)是最早呼叫的,hookMgr(防護方)是最晚呼叫的,那麼攻擊方方法都交換成功了,你防護方才來防護,明顯是沒用。因此,上面的btnClick2方法仍然被外部交換了,hookMgr沒起到防護的作用。

3.解決辦法

1.修改Complie Sources的順序

修改前

修改後

2.既然外部的動態庫最先載入,那麼防護方自己建立一個動態庫

在基本防護工程裡新建動態庫antiHook
zip -ry Hook.ipa Payload

3.開啟Hook基本防護工程,執行

發現我們的防護hookMgr先執行,並且 檢測到了hook至此外部就不能透過hook “Method Swizzle”來交換btnClick2方法

4、弊端

如果hookMgr內部要交換方法,需要提前在hookMgr的內部寫好交換程式碼,然後再做防護。因為在內部是沒有辦法再進行hook了,所以有些三方庫如果用了Method Swizzle,那麼你要做的修改就比較多,需要將工程裡用到的全部method_exchangeImplementations換成exchangeP如果用Cydia Substrate或者MonkeyDev來hook,依然能hook成功

5、下面用MonkeyDev來舉例:

1、新建MonkeyDev工程MonkeyDemo,此過程需要先安裝好 MonkeyDev

2、將防護的Hook.ipa複製到MonkeyDemo->TargetApp資料夾下

%hook ViewController 表示hook ViewController這個類-(void)btnClick2:(id) org 表示hook btnClick2這個方法hookMgr是最先載入的,但是MonkeyDev還是能hook成功6、為什麼MonkeyDev和Cydia Substrate能hook成功?

1.首先了解Cydia Substrate的組成部分(MonkeyDev也是集成了Cydia Substrate): Cydia Substrate主要由3部分組成:

1.MobileHooker

MobileHooker顧名思義用於HOOK。它定義一系列的宏和函式,底層呼叫objc的runtime和fishhook來替換系統或者目標應用的函式. 其中有兩個函式:

MSHookMessageEx 主要作用於Objective-C方法

void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP result)

MSHookFunction 主要作用於C和C++函式

void MSHookFunction(voidfunction,void* replacement,void** p_original)

2.MobileLoader

MobileLoader用於載入第三方dylib在執行的應用程式中。啟動時MobileLoader會根據規則把指定目錄的第三方的動態庫載入進去,第三方的動態庫也就是我們寫的破解程式.

3.safe mode

因為APP程式質量參差不齊崩潰再所難免,破解程式本質是dylib,寄生在別人程序裡。 系統程序一旦出錯,可能導致整個程序崩潰,崩潰後就會造成iOS癱瘓。所以CydiaSubstrate引入了安全模式,在安全模 式下所有基於CydiaSubstratede 的三方dylib都會被禁用,便於查錯與修復。

MSHookMessageEx底層呼叫objc的runtime和fishhook來替換系統或者目標應用的函式

在我們的防護程式碼中,只防護了method_exchangeImplementations方法,然而method_setImplementation和method_getImplementation並沒有做防護,因此猜想Cydia Substrate就是透過這兩個方法來hook的。

3.實驗

在基本防護2的工程中,增加對method_setImplementation和method_getImplementation的防護編譯生成基本防護.app,再次打包成Hook.ipa將Hook.ipa複製到MonkeyDemo->TargetApp資料夾下執行MonkeyDemo工程

如圖,做到了防護MonkeyDev的hook,在檢測到hook,強制退出APP

那麼,上面的防護真的就無法破解了嗎?答案當然是否定的,提供一個思路:透過修改MachO檔案,在防護動態庫之前呼叫hook的動態庫,就能實現hook,因為你是在我hook成功之後才做的防護。不過新手一般就破解不了上面的防護了。進攻和防護還需要不斷學習!

15
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 學完SQL資料庫,不知道走哪方面?這裡給你介紹十個高薪工作