iOS 逆向初探防護(fishHOOK防護)

前言

在iOS開發中,始終都有這安全防護一直都是熱門話題,很多的對於開發網絡請求要使用https請求,使用RSA +AES加密,本地文件加密等等,這些都是整箱開發中的防護手段,這篇文章,一起來探索一下逆向開發防護的初探;

逆向開發人員進攻:

應用重簽名並注入Framework代碼Demo, 後續單獨寫一篇文章來介紹應用重簽名並注入代碼;

這裏先大概介紹一下:應用重簽名,使用別人開發的應用(例如:微信)使用自己的開發證書,對應用進行重簽名,然後注入代碼,實現一些自己想要的功能,例如微信搶紅包插件等;

如我們現在有一個應用,其中有登陸和支付2個功能:

- (IBAction)PayClick:(id)sender {
    NSLog(@"支付500萬");
}
- (IBAction)loginClick:(id)sender {
    NSLog(@"登陸了");
}

對於逆向開發人員,可以直接注入代碼,在load方法中添加如下代碼:

+(void)load
{
     
/**
    進攻代碼
    通過exchangeIMP 修改PayClick 調用我自己的方法
 
    這裏進攻代碼也可以使用setImp  和getIMP方式進行原理基本一致 其中Cydia Substrate 就是針對setImp 和
 getImp 進行hook的
 
 */
    Method old = class_getInstanceMethod(self, @selector(PayClick:));

    Method newMethod = class_getInstanceMethod(self, @selector(payHookClick:));
    
    method_exchangeImplementations(old, newMethod);
    
    
}
- (void)payHookClick:(id)sender
{
    NSLog(@"勾着支付了");
}

我們直接在同一個工程中進行這樣的操作,可以看到輸出結果:

開發人員防護:

對於這種方式的攻克,我們進行考慮根據fishHOOK 可以HOOK 系統方法,可以進行下面操作;

在進攻load方法中我們使用fishHOOK對系統方法進行替換:

+(void)load
{
    /**
     防護代碼:
     這裏使用fishHOOK 對method_exchangeImplementations進行HOOK替換即可
     */
    struct rebinding bd;
    bd.name = "method_exchangeImplementations";
    bd.replacement = myExchange;
    bd.replaced = (void *)&exchangeP;
    struct rebinding rebs[1] = {bd};
    rebind_symbols(rebs, 1);  
    
/**
    進攻代碼
    通過exchangeIMP 修改PayClick 調用我自己的方法
 
    這裏進攻代碼也可以使用setImp  和getIMP方式進行原理基本一致 其中Cydia Substrate 就是針對setImp 和
 getImp 進行hook的
 
 */
    Method old = class_getInstanceMethod(self, @selector(PayClick:));

    Method newMethod = class_getInstanceMethod(self, @selector(payHookClick:));
    
    method_exchangeImplementations(old, newMethod);
    
    
}

- (void)payHookClick:(id)sender
{
    NSLog(@"勾着支付了");
}

#pragma mark ---- 防護代碼------
//函數指針變量
void(*exchangeP)(Method _Nonnull m1, Method _Nonnull m2);

void myExchange(Method _Nonnull m1, Method _Nonnull m2)
{
    NSLog(@"惡意代碼HOOK");
}

運行程序:

可以看到監測到有惡意代碼注入HOOK方法,同時點擊按鈕,

可以看到系統監測到惡意代碼HOOK,同時注入代碼並沒有對我們自己的代碼進行HOOK住:

監測到惡意代碼後,開發人員可以操作很多事情:如:上報服務器,記錄攻擊次數,如果攻擊過多,可以進行封號處理,或直接退出程序等等;

其實這裏的防護代碼,必須是在進攻代碼之前,這裏就需要注意了;

進攻:使用Framework注入我們自己的開發代碼的話,會在load方法之前,如果寫在load方法中就不能做防護了;

防護:我們可以自己寫Framework進行注入或者,我們可以對自己的庫進行判斷不是自己的庫不讓加載(這個後續方法再講解)

防護:這裏注意,我們使用fishHOOK防護傳入HOOK方法名稱爲:method_exchangeImplementations,這個可以做成一個宏定義(類似於代碼混淆),如果自己工程中有使用這個,直接替換爲使用自己的方法(myExchange)就好了;

這裏有坑點:就是如果第三方庫中有使用到系統替換方法,我們也需要進行替換,否則第三方庫中會進行報錯的;

總結

這篇文章主要講述了使用fishHOOK對代碼進行一些簡單的防護,稍微介紹了下攻擊的手段,大家可以使用其他方式進行防護!

歡迎大家點贊,關注我的CSDN,我會定期做一些技術分享!未完待續。。。 

fishHOOK防護Demo

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章