009--HOOK原理
一割以、HOOK概述
HOOK(鉤子) 其實(shí)就是改變程序執(zhí)行流程的一種技術(shù)的統(tǒng)稱!
iOS中HOOK技術(shù)的幾種方式
1莲祸、Method Swizzle
利用OC的Runtime特性命锄,動(dòng)態(tài)改變SEL(方法編號(hào))和IMP(方法實(shí)現(xiàn))的對(duì)應(yīng)關(guān)系矿瘦,達(dá)到OC方法調(diào)用流程改變的目的镰吆。主要用于OC方法护盈。
2、fishhook
它是Facebook提供的一個(gè)動(dòng)態(tài)修改鏈接mach-O文件的工具闲先。利用MachO文件加載原理状土,通過(guò)修改懶加載和非懶加載兩個(gè)表的指針達(dá)到C函數(shù)HOOK的目的。
3伺糠、Cydia Substrate
Cydia Substrate 原名為?Mobile Substrate?蒙谓,它的主要作用是針對(duì)OC方法、C函數(shù)以及函數(shù)地址進(jìn)行HOOK操作训桶。當(dāng)然它并不是僅僅針對(duì)iOS而設(shè)計(jì)的累驮,安卓一樣可以用。官方地址:http://www.cydiasubstrate.com/
Cydia Substrate主要由3部分組成:
MobileHooker
MobileHooker顧名思義用于HOOK舵揭。它定義一系列的宏和函數(shù)慰照,底層調(diào)用objc的runtime和fishhook來(lái)替換系統(tǒng)或者目標(biāo)應(yīng)用的函數(shù).
https://github.com/facebook/fishhook
其中有兩個(gè)函數(shù):
MSHookMessageEx?主要作用于Objective-C方法
MSHookFunction?主要作用于C和C++函數(shù)
Logos語(yǔ)法的%hook 就是對(duì)此函數(shù)做了一層封裝
MobileLoader
???MobileLoader用于加載第三方dylib在運(yùn)行的應(yīng)用程序中。啟動(dòng)時(shí)MobileLoader會(huì)根據(jù)規(guī)則把指定目錄的第三方的動(dòng)態(tài)庫(kù)加載進(jìn)去琉朽,第三方的動(dòng)態(tài)庫(kù)也就是我們寫的破解程序.
safe mode
???因?yàn)锳PP程序質(zhì)量參差不齊崩潰再所難免毒租,破解程序本質(zhì)是dylib,寄生在別人進(jìn)程里。 系統(tǒng)進(jìn)程一旦出錯(cuò)墅垮,可能導(dǎo)致整個(gè)進(jìn)程崩潰,崩潰后就會(huì)造成iOS癱瘓惕医。所以CydiaSubstrate引入了安全模式,在安全模 式下所有基于CydiaSubstratede 的三方dylib都會(huì)被禁用,便于查錯(cuò)與修復(fù)算色。
防護(hù)代碼
#import "hookMgr.h"
#import "fishhook.h"
#import
@implementation hookMgr
//專門HOOK
+(void)load
{
? ? NSLog(@"hookMgr--Load");
? ? //內(nèi)部用到的交換代碼!
? ? Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick1:));
? ? Methodnew =class_getInstanceMethod(self,@selector(click1Hook:));
? ? method_exchangeImplementations(old, new);
? ? //基本防護(hù)
? ? struct rebinding bd;
? ? bd.name = "method_exchangeImplementations";
? ? bd.replacement = myExchang;
? ? bd.replaced = (void *)&exchangeP;
? ? structrebindingbd1;
? ? bd1.name = "method_getImplementation";
? ? bd1.replacement=myExchang;
? ? bd1.replaced= (void*)&getIMP;
? ? structrebindingbd2;
? ? bd2.name = "method_setImplementation";
? ? bd2.replacement=myExchang;
? ? bd2.replaced= (void*)&setIMP;
//? ? method_getImplementation
//? ? method_setImplementation
? ? structrebindingrebindings[] = {bd,bd1,bd2};
? ? rebind_symbols(rebindings,3);
}
//保留原來(lái)的交換函數(shù)
IMP _Nonnull (*setIMP)(Method _Nonnull m, IMP _Nonnull imp);
IMP _Nonnull (*getIMP)(Method _Nonnull m);
void(*exchangeP)(Method_Nonnullm1,Method_Nonnullm2);
//新的函數(shù)
voidmyExchang(Method_Nonnullm1,Method_Nonnullm2){
? ? NSLog(@"檢測(cè)到了HOOK!!!");
? ? //強(qiáng)制退出!
? ? exit(1);
}
-(void)click1Hook:(id)sendr{
? ? NSLog(@"原來(lái)APP的HOOK保留!!");
}