前言
在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,我會定期做一些技術分享!未完待續。。。