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

原创文章 88 获赞 21 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ZhaiAlan/article/details/105249145