iOS逆向-反Hook防护(VI)

fishhook

fishhook可以hook系统的函数,是不是可以Hook系统的Method Swizzle,来达到防Hook的目的?

demo中,把基本防护01的.app文件,生成.ipa包,放到攻克防护App文件夹(framework代码注入)中,大家运行攻克防护的demo可以看到具体效果以及代码的执行顺序。

基本防护工程里注入的framework里面的类先执行,而且里面只防护了系统的
method_exchangeImplementations

MonkeyDev

MonkeyDev在wiki文档中有详细的安装和是用教程

点击Xcodecommand+shift+N创建项一个MonkeyAppDemo的项目


Command+B编译一下,如果碰到如下错误

修改配置如下:

将.ipa或者.app文件放到MonkeyAppDemo中的TargetApp文件夹中,运行项目,可以实现重签名

把基本防护01的.app文件,生成.ipa包放到MonkeyAppDemo中的TargetApp文件夹中,并在monkeyDevDemoDylib.xm中加入如下代码

%hook ViewController
- (void)btnClik1:(id)sender {
    NSLog(@"按钮被hook了");
}
%end

monkeyDevDemoDylib.mm中的代码是monkeyDevDemoDylib.xm里自动生成的

可以看到在基本防护01中,加入的防护系统的method_exchangeImplementations方法不起作用,按钮点击方法还是被Hook

在monkeyDevDemoDylib.mm文件生成的代码中,发现了

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)中说过它的是底层调用objcruntimefishhook来替换系统或者目标应用的函数,所以推测Cydia Substrate可能是通过别的方法来Hook

在基本防护02中,加入了防护系统method_getImplementationmethod_setImplementation函数代码,然后生成.ipa文件,放到MonkeyAppDemo中的TargetApp的文件夹中,运行项目,点击按钮1可以发现,Hook的代码不起作用了

+(void)load{
    //基本防护
    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);
}

//保存原来的交换函数
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(@"检测到HOOK");
}

你可能感兴趣的:(iOS逆向-反Hook防护(VI))