iOS 逆向开发iOS开发笔记我爱编程

iOS逆向之反HOOK的基本防护

2018-05-28  本文已影响13人  WinJayQ

如果在我们的项目中hook了Method Swizzle,那么别人还能hook我们的项目吗??

一、写上基本的防护,内部使用hook,外部没有hook

1、新建工程:基本防护,写个简单的页面

image.png

代码如下:


image.png

2、需求:在外部hook btnClick2,在内部hook btnClick1,需要保证的是在外部hook btnClick2无效,在内部hook btnClick1生效。

3、拖入fishhook代码,新建hookMgr类

//专门HOOK
+(void)load{
    //内部用到的交换代码
    Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick1:));
    Method new = class_getInstanceMethod(self, @selector(click1Hook:));
    method_exchangeImplementations(old, new);
    
    //在交换代码之前,把所有的runtime代码写完 
    
    //基本防护
    struct rebinding bd;
    bd.name = "method_exchangeImplementations";
    bd.replacement=myExchang;
    bd.replaced=(void *)&exchangeP;
    
    struct rebinding rebindings[]={bd};
    rebind_symbols(rebindings, 1);
}

//保留原来的交换函数
void (* exchangeP)(Method _Nonnull m1, Method _Nonnull m2);

//新的函数
void myExchang(Method _Nonnull m1, Method _Nonnull m2){
    NSLog(@"检测到了hook");
}
-(void)click1Hook:(id)sender{
    NSLog(@"原来APP的hook保留");
}

说明:

4、运行,分别点击按钮1和按钮2,此时内部hook了btnClick1方法,外部暂时没有hook任何方法

image.png

二、准备ipa

1. 打包ipa

三、外部hook,注入代码

1.新建工程:Hook基本防护

代码注入参考:iOS逆向之代码注入(framework)

前面在hookMgr中已经做了防护,不能交换btnClick2方法,那么我们写下hook btnClick2的代码来测试一下:

+(void)load
{
    Method old = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btnClick2:));
    Method new = class_getInstanceMethod(self, @selector(click2Hook:));
    method_exchangeImplementations(old, new);
}
    
-(void)click2Hook:(id)sender{
    NSLog(@"btnClick2交换成功");
}

运行,分别点击按钮1,按钮2,发现btnClick2交换成功,防护失败了

image.png

2.思考防护失败的原因

+(void)load{
    NSLog(@"AppDelegate--Load");
}

3.解决办法

1.修改Complie Sources的顺序

2.既然外部的动态库最先加载,那么防护方自己建立一个动态库

3.打开Hook基本防护工程,运行

image.png

4、弊端

5、下面用MonkeyDev来举例:

1、新建MonkeyDev工程MonkeyDemo,此过程需要先安装好MonkeyDev

image.png

2、将防护的Hook.ipa拷贝到MonkeyDemo->TargetApp文件夹下

image.png

6、为什么MonkeyDev和Cydia Substrate能hook成功?

1.首先了解Cydia Substrate的组成部分(MonkeyDev也是集成了Cydia Substrate):

Cydia Substrate主要由3部分组成:

2. MSHookMessageEx底层调用objc的runtime和fishhook来替换系统或者目标应用的函数

在我们的防护代码中,只防护了method_exchangeImplementations方法,然而method_setImplementation和method_getImplementation并没有做防护,因此猜想Cydia Substrate就是通过这两个方法来hook的。

3.实验

image.png
如图,做到了防护MonkeyDev的hook,在检测到hook,强制退出APP
  • 那么,上面的防护真的就无法破解了吗?
    答案当然是否定的,提供一个思路:
    通过修改MachO文件,在防护动态库之前调用hook的动态库,就能实现hook,因为你是在我hook成功之后才做的防护。
  • 不过新手一般就破解不了上面的防护了。进攻和防护还需要不断学习!
代码已上传:https://github.com/WinJayQ/HookDefend
上一篇 下一篇

猜你喜欢

热点阅读