13.反HOOK防护(一):基于Fishhook

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

1.1 在哪里防护

a.Framework里

  • 工程中的LoadFramework里的Load之后调用

  • 别人注入的Hook代码的LoadFramework之后,工程之前

    • 有点疑问,这里的Framework是动态库么?

1.2 操作一下

a. 创建一个Framework

b. 引入fishhook、objc/message.h

c. 在Framework中创建一个类,防护 method_exchangeImplementations

+ (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进行重签名与调试

05.dylib注入

效果:

1.3 缺点

a. 字符串

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

b. 时间

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

c. get set IMP 没处理

Last updated