# 13.反HOOK防护（一）：基于Fishhook

> 我们需要防护别人的Hook，但是保留自己的Hook。

## 1.1 在哪里防护

### a.Framework里

* 工程中的`Load`在`Framework`里的`Load`之后调用
* 别人注入的Hook代码的`Load`在`Framework`之后，工程之前
  * 有点疑问，这里的`Framework`是动态库么？

## 1.2 操作一下

### a. 创建一个Framework

### b. 引入fishhook、objc/message.h

### c. 在Framework中创建一个类，防护 `method_exchangeImplementations`

```cpp
+ (void)load {
    struct rebinding exchange;

    exchange.name = "method_exchangeImplementations";
    exchange.replacement = my_axchange;
    exchange.replaced = (void *)&sysExchangePoint;

    struct rebinding bds[] = { exchange };

    rebind_symbols(bds, 1);
}

// 保存原函数的指针，这个可以暴露给自己使用
void (*sysExchangePoint)(Method _Nonnull methA, Method _Nonnull methB);

void my_axchange(Method _Nonnull methA, Method _Nonnull methB) {
    NSLog(@"⚠️检测到了Hook！");
}
```

### d. 注入

> [04.利用Xcode进行重签名与调试](https://ryukiedev.gitbook.io/wiki/ni-xiang/04.-li-yong-xcode-jin-hang-zhong-qian-ming-yu-tiao-shi)
>
> [05.dylib注入](https://ryukiedev.gitbook.io/wiki/ni-xiang/05.dylib-zhu-ru)

效果：

![1](https://4193904735-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MI8JgbGh3U6X_oedqkm%2Fsync%2F21f6129d93e6994d9b484c1a83ca5f220fd971ca.png?generation=1621265706786737\&alt=media)

## 1.3 缺点

### a. 字符串

因为我们用到了`method_exchangeImplementations`这样一个字符串，一旦被逆向工程师找到，很容易定位到防护代码。

### b. 时间

这个防护方案是基于调用时间来进行防护的，如果找到`fishhook`的相关调用，进行相关操作，会被破解掉。

### c. get set IMP 没处理
