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