fishhook
fishhook可以hook系統(tǒng)的函數(shù)缩功,是不是可以Hook系統(tǒng)的Method Swizzle晴及,來達(dá)到防Hook的目的?
demo中嫡锌,把基本防護(hù)01的.app
文件虑稼,生成.ipa
包,放到攻克防護(hù)App
文件夾(framework代碼注入)中势木,大家運(yùn)行攻克防護(hù)的demo可以看到具體效果以及代碼的執(zhí)行順序蛛倦。
基本防護(hù)工程里注入的framework里面的類先執(zhí)行,而且里面只防護(hù)了系統(tǒng)的
method_exchangeImplementations
MonkeyDev
MonkeyDev在wiki文檔中有詳細(xì)的安裝和是用教程
點(diǎn)擊Xcode
啦桌,command+shift+N
創(chuàng)建項(xiàng)一個(gè)MonkeyAppDemo
的項(xiàng)目
Command+B
編譯一下溯壶,如果碰到如下錯(cuò)誤修改配置如下:
將.ipa或者.app文件放到MonkeyAppDemo中的TargetApp文件夾中及皂,運(yùn)行項(xiàng)目,可以實(shí)現(xiàn)重簽名
把基本防護(hù)01的.app文件且改,生成.ipa
包放到MonkeyAppDemo
中的TargetApp
文件夾中验烧,并在monkeyDevDemoDylib.xm
中加入如下代碼
%hook ViewController
- (void)btnClik1:(id)sender {
NSLog(@"按鈕被hook了");
}
%end
monkeyDevDemoDylib.mm中的代碼是monkeyDevDemoDylib.xm里自動(dòng)生成的
可以看到在基本防護(hù)01中,加入的防護(hù)系統(tǒng)的method_exchangeImplementations方法不起作用又跛,按鈕點(diǎn)擊方法還是被Hook
了
在monkeyDevDemoDylib.mm文件生成的代碼中碍拆,發(fā)現(xiàn)了
static __attribute__((constructor)) void _logosLocalInit() {
{Class _logos_class$_ungrouped$ViewController = objc_getClass("ViewController"); MSHookMessageEx(_logos_class$_ungrouped$ViewController, @selector(btnClik1:), (IMP)&_logos_method$_ungrouped$ViewController$btnClik1$, (IMP*)&_logos_orig$_ungrouped$ViewController$btnClik1$);} }
MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP result)方法在iOS逆向-Hook(VI)中說過它的是底層調(diào)用objc
的runtime
和fishhook
來替換系統(tǒng)或者目標(biāo)應(yīng)用的函數(shù),所以推測(cè)Cydia Substrate
可能是通過別的方法來Hook
的
在基本防護(hù)02中慨蓝,加入了防護(hù)系統(tǒng)method_getImplementation和method_setImplementation函數(shù)代碼感混,然后生成.ipa
文件,放到MonkeyAppDemo
中的TargetApp
的文件夾中,運(yùn)行項(xiàng)目礼烈,點(diǎn)擊按鈕1可以發(fā)現(xiàn)浩习,Hook
的代碼不起作用了
+(void)load{
//基本防護(hù)
struct rebinding bd;
bd.name = "method_exchangeImplementations";
bd.replacement = myExchange;
bd.replaced = (void *)&exhangeP;
//setIMP
struct rebinding gt;
gt.name = "method_getImplementation";
gt.replacement = my_getIMP;
gt.replaced = (void *)&getIMP;
//getIMP
struct rebinding st;
st.name = "method_setImplementation";
st.replacement = my_setIMP;
st.replaced = (void *)&setIMP;
struct rebinding rebs[3] = {bd,gt,st};
rebind_symbols(rebs, 3);
}
//保存原來的交換函數(shù)
IMP (*getIMP)(Method _Nonnull m);
IMP (*setIMP)(Method _Nonnull m, IMP _Nonnull imp);
IMP my_getIMP(Method _Nonnull m){
exit(0);
return nil;
}
IMP my_setIMP(Method _Nonnull m, IMP _Nonnull imp){
exit(0);
return nil;
}
void(*exhangeP)(Method _Nonnull m1, Method _Nonnull m2);
void myExchange(Method _Nonnull m1, Method _Nonnull m2){
NSLog(@"檢測(cè)到HOOK");
}