HOOK 简单防护
创建项目
创建一个项目1,添加 fishhook.c 和 fishhook.h 拖两个按钮,测试一下,我们的目的是:按钮1 为我们项目自己内部的交换方法,按钮2 是测试 防止 外部对本项目进行 hook 。
创一个类:
#import "HookManager.h"
#import <objc/message.h>
#import "fishhook.h"
@implementation HookManager
+ (void)load
{
// 项目内部用到的交换代码
Method old_method = class_getInstanceMethod(objc_getClass("ViewController"), @selector(btn1Click:));
Method new_method = class_getInstanceMethod(self, @selector(clickHook:));
// 交换
method_exchangeImplementations(old_method, new_method);
// 项目内部所有的 HOOk 代码 ...
// 基本防护
struct rebinding rebind;
rebind.name = "method_exchangeImplementations";
rebind.replacement = myExchanged;
rebind.replaced = (void *)&exchangedP;
struct rebinding rebinds[] = {rebind};
rebind_symbols(rebinds, 1);
}
/** 保留原来的函数 */
static void (*exchangedP)(Method _Nonnull m1, Method _Nonnull m2);
/** 检测到 hook 的新方法 */
void myExchanged(Method _Nonnull m1, Method _Nonnull m2){
NSLog(@"系统检测到HooK异常!!!!");
}
- (void)clickHook:(id)sender
{
NSLog(@"原来 APP 的 Hook 保留!!!!!!");
}
接着创建项目2 ,重签名项目1,注入 Framework,这个过程之前的文章有详细过程,原始 APP 包拷贝 —> 打包为IPA 包 —> 拖入项目2 目标 APP 文件夹中即可。
打包
zip -ry 基本防护2.ipa Payload
运行:
![](https://img.haomeiwen.com/i4790087/826f868031eaf7fe.png)
你会发现外部依然可以 hook 本项目,交换成功,为什么呢?
修改原始项目,在各方法 添加打印语句,重复上述过程,结果如下:
![](https://img.haomeiwen.com/i4790087/8b96944adec52bc6.png)
可以看出加载的先后顺序,就明白为什么了!!!
![](https://img.haomeiwen.com/i4790087/f2596f229fa7dac8.png)
继续修改原始代码,添加 反 Hook 的 Framework ,把需要防护的类拖入其中:
![](https://img.haomeiwen.com/i4790087/4663f4efd1d31490.png)
重复上面过程,结果如下:
![](https://img.haomeiwen.com/i4790087/817d0e4cea34217d.png)
可以看到这样就有效的防止了外界对项目的 Hook。
如果原始项目内部要继续 Hook 的话,就用:
/** 保留原来的函数 /
static void (exchangedP)(Method _Nonnull m1, Method _Nonnull m2);
终极章
通过上面的测试,可以初步防护 APP ,防止被 Hook,但是之前介绍过有一个强大的工具,IOS - 逆向工具篇 MoneyDev 和 Cydia Substrate 工具,能不能防护抵挡住呢???
![](https://img.haomeiwen.com/i4790087/79f5b4d40213cc2f.png)
依然抵挡不住,
- 注:Money 中 hook 的代码书写
![](https://img.haomeiwen.com/i4790087/c05a8a170c2756e3.png)
开始就忘了修改类名了,一直失败:
![](https://img.haomeiwen.com/i4790087/fc91d19195dfa373.png)
原理
上面 MoneyDev 的这种方式就是用的 Cydia Substrate 的
MSHookMessageEx 主要作用于Objective-C方法
那如何防的住呢???
继续修改我们的原始项目1代码:
- Runtime 通过以下方法,依然可以实现交换方法,
method_getImplementation(Method _Nonnull m)
method_setImplementation(Method _Nonnull m, IMP _Nonnull imp)
主要修改如下:
![](https://img.haomeiwen.com/i4790087/d01d5870594e8a3c.png)
然后继续上面的过程,运行:
![](https://img.haomeiwen.com/i4790087/51a57f946160c308.png)
可以看到,MoneyDev 也无可奈何,被拒之千里之外!!!
后记
针对这种情况,应该怎么着手 Hook 原始项目呢???修改原始项目的 hook 逻辑??? 删除 Framework ??? 修改 Mach-O 文件???
总之在原项目防护之前 防护 之前 Hook 是指定没错的!!!😁😁😁